UNPKG

vue-mf-module

Version:

A vue extension to create microfrontend module

497 lines 68.2 kB
var P = Object.defineProperty; var F = (n, e, t) => e in n ? P(n, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : n[e] = t; var l = (n, e, t) => (F(n, typeof e != "symbol" ? e + "" : e, t), t); import { defineComponent as k, computed as j, openBlock as m, createElementBlock as C, Fragment as R, renderList as z, createBlock as x, resolveDynamicComponent as A, getCurrentInstance as K, ref as $, onMounted as X, withDirectives as J, createCommentVNode as Q, vShow as W } from "vue"; var E = { exports: {} }; function V() { } V.prototype = { on: function(n, e, t) { var i = this.e || (this.e = {}); return (i[n] || (i[n] = [])).push({ fn: e, ctx: t }), this; }, once: function(n, e, t) { var i = this; function r() { i.off(n, r), e.apply(t, arguments); } return r._ = e, this.on(n, r, t); }, emit: function(n) { var e = [].slice.call(arguments, 1), t = ((this.e || (this.e = {}))[n] || []).slice(), i = 0, r = t.length; for (i; i < r; i++) t[i].fn.apply(t[i].ctx, e); return this; }, off: function(n, e) { var t = this.e || (this.e = {}), i = t[n], r = []; if (i && e) for (var s = 0, a = i.length; s < a; s++) i[s].fn !== e && i[s].fn._ !== e && r.push(i[s]); return r.length ? t[n] = r : delete t[n], this; } }; E.exports = V; var T = E.exports.TinyEmitter = V, b = /* @__PURE__ */ ((n) => (n[n.drawer = 0] = "drawer", n[n.settings = 1] = "settings", n[n.header = 2] = "header", n[n.footer = 3] = "footer", n))(b || {}); const S = { menuDefinitionAdded: "newmenuitem", menuDefinitionMoved: "menuitemmoved" }, v = class v { constructor() { l(this, "menuDefinitions", []); l(this, "menuStructure", {}); l(this, "notifications", new T()); } get Notifications() { return this.notifications; } static get Instance() { return v.instance; } addMenuDefinition(e, ...t) { let i = this.menuDefinitions.find((r) => r.name == e.name); i ? e = i : this.menuDefinitions.push(e), e.parents = []; for (const r of t) this.menuStructure[r.section] = this.menuStructure[r.section] || {}, this.menuStructure[r.section][r.parent || e.name] = this.menuStructure[r.section][r.parent || e.name] || [], r.parent && (this.menuStructure[r.section][r.parent].push(e.name), e.parents.push(r.parent)); this.notifications.emit(S.menuDefinitionAdded, e); } removeMenuDefinition(e, t, i) { let r = this.menuDefinitions.find((s) => s.name == t); if (r) { if (r.parents) for (const s of r.parents) { let a = this.menuStructure[e][s]; if (a) { let u = a.indexOf(t); u >= 0 && a.splice(u, 1); } } this.menuStructure[e][t] && !this.menuStructure[e][t].length && delete this.menuStructure[e][t], r.parents = []; } return this.notifications.emit(S.menuDefinitionMoved, r), r; } moveMenu(e, t, i, r = 999) { let s = this.menuDefinitions.find((a) => a.name == t); if (s) { if (s.orderIndex = r, s.parents) for (const a of s.parents) { let u = this.menuStructure[e][a]; if (u) { let o = u.indexOf(t); o >= 0 && u.splice(o, 1); } } this.menuStructure[e][t] && !this.menuStructure[e][t].length && delete this.menuStructure[e][t], s.parents = [], this.menuStructure[e][i || t] = this.menuStructure[e][i || t] || [], i && (this.menuStructure[e][i].push(t), s.parents.push(i)); } return this.notifications.emit(S.menuDefinitionMoved, s), s; } getMenuItem(e) { return this.menuDefinitions.find((t) => t.name == e); } getMenu(e) { let t = [], i = /* @__PURE__ */ new Set(); for (const r in this.menuStructure[e]) { const s = this.menuStructure[e][r]; let a = { item: this.menuDefinitions.find((u) => u.name == r && (!u.hidden || !u.hidden())), children: s.map((u) => this.menuDefinitions.find((o) => o.name == u && (!o.hidden || !o.hidden()))).filter((u) => !!u).sort((u, o) => u && o && u.orderIndex && o.orderIndex && u.orderIndex > o.orderIndex ? 1 : u && o && u.orderIndex && o.orderIndex && u.orderIndex < o.orderIndex ? -1 : 0) }; a.item && (i.add(r), s.forEach((u) => i.add(u)), t.push(a)); } return t.filter((r) => !!r.item).sort((r, s) => r && s && r.item && s.item && r.item.orderIndex && s.item.orderIndex && r.item.orderIndex > s.item.orderIndex ? 1 : r && s && r.item && s.item && r.item.orderIndex && s.item.orderIndex && r.item.orderIndex < s.item.orderIndex ? -1 : 0); } }; l(v, "instance", new v()); let f = v; const M = class M { constructor() { l(this, "registry", /* @__PURE__ */ new Map()); l(this, "groupedregistry", /* @__PURE__ */ new Map()); l(this, "serviceregistry", /* @__PURE__ */ new Map()); l(this, "groupedserviceregistry", /* @__PURE__ */ new Map()); } static get Instance() { return this.instance; } static set Instance(e) { this.instance = e; } provideComponent(e, t, i) { if (this.registry.set(i ? `${i}-${t}` : t, e), i) { this.groupedregistry.has(i) || this.groupedregistry.set(i, /* @__PURE__ */ new Map()); let r = this.groupedregistry.get(i); r && r.set(t, e); } } getComponent(e, t) { return this.registry.get(t ? `${t}-${e}` : e) || null; } getComponents(...e) { return Array.from(this.registry.entries()).filter((t) => e.indexOf(t[0]) >= 0).map((t) => t[1]); } getGroupComponents(e, ...t) { let i = this.groupedregistry.get(e); return i ? Array.from(i.entries() || []).filter((r) => !t || t.length == 0 || t.indexOf(r[0]) >= 0).map((r) => r[1]) : []; } getGroupComponentsKeys(e) { let t = this.groupedregistry.get(e); return t ? Array.from(t.keys()) : []; } provideService(e, t, i) { if (this.serviceregistry.set(e, t), i) { this.groupedserviceregistry.has(i) || this.groupedserviceregistry.set(i, /* @__PURE__ */ new Map()); let r = this.groupedserviceregistry.get(i); r && r.set(e, t); } } getService(e) { return this.serviceregistry.get(e) || null; } getGroupServices(e, ...t) { let i = this.groupedserviceregistry.get(e); return i ? Array.from(i.entries() || []).filter((r) => !t || t.length == 0 || t.indexOf(r[0]) >= 0).map((r) => r[1]) : []; } }; l(M, "instance", new M()); let c = M; const p = class p { constructor() { l(this, "notifier", new T()); } static get Instance() { return p.instance; } static set Instance(e) { this.instance = e; } send(e, ...t) { this.notifier.emit(e, ...t); } subscribe(e, t, i) { this.notifier.on(e, t, i); } once(e, t, i) { this.notifier.once(e, t, i); } unsubscribe(e, t) { this.notifier.off(e, t); } ask(e, ...t) { return new Promise((i, r) => { setTimeout(r, 1e4), this.notifier.emit(`$ask-${e}`, { resolve: i, reject: r, args: t }); }); } reply(e, t) { this.notifier.on(`$ask-${e}`, (i) => { try { let r = t(...i.args); i.resolve(r); } catch { i.reject(); } }); } }; l(p, "instance", new p()); let w = p; const Y = k({ name: "inject", props: { id: { default: null }, type: { default: null, type: String }, value: { default: null }, name: { type: String, default: null }, names: { type: Array, default: null }, group: { type: String, default: null }, metadata: { type: Object, default: null }, disabled: { type: Boolean, default: !1 }, readonly: { type: Boolean, default: !1 } }, setup(n, { emit: e }) { const t = j({ get: () => n.value, set: (a) => { e("input", a); } }), i = j(() => n.name ? [c.Instance.getComponent(n.name, n.group)] : n.group ? c.Instance.getGroupComponents(n.group, ...n.names || []) : c.Instance.getComponents(...n.names || [])), r = (...a) => { e("click", ...a); }, s = (...a) => { e("save", ...a); }; return { id: n.id, type: n.type, value: n.value, name: n.name, names: n.names, group: n.group, metadata: n.metadata, disabled: n.disabled, readonly: n.readonly, click: r, save: s, Components: i, Value: t }; } }), O = (n, e) => { const t = n.__vccOpts || n; for (const [i, r] of e) t[i] = r; return t; }; function Z(n, e, t, i, r, s) { return m(), C("div", null, [ (m(!0), C(R, null, z(n.Components, (a, u) => (m(), x(A(a), { disabled: n.disabled, readonly: n.readonly, key: u, id: n.id, type: n.type, metadata: n.metadata, modelValue: n.Value, "onUpdate:modelValue": e[0] || (e[0] = (o) => n.Value = o), onClick: n.click, onSave: n.save }, null, 40, ["disabled", "readonly", "id", "type", "metadata", "modelValue", "onClick", "onSave"]))), 128)) ]); } const B = /* @__PURE__ */ O(Y, [["render", Z]]), y = class y { constructor() { l(this, "screens", /* @__PURE__ */ new Map()); l(this, "projecting", /* @__PURE__ */ new Map()); } static get Instance() { return y.instance; } static set Instance(e) { this.instance = e; } setScreen(e, t = "defaultscreen") { this.screens.set(t, e); } projectTo(e, t = null, i = "defaultscreen", r = !0, s = !1) { const a = { data: t }, u = s ? new Promise((G, L) => { a.reject = L, a.resolve = G; }) : null; r ? (this.projecting.has(i) || this.projecting.set(i, []), (this.projecting.get(i) || []).push({ component: e, model: a, promise: u, queue: r })) : this.projecting.set(i, [{ component: e, model: a, promise: u, queue: r }]); const o = this.screens.get(i); return o ? (o.model = a, o.currentView = e, u && u.then(() => this.stopProjecting(i)).catch(() => this.stopProjecting(i)), u) : null; } projectAsyncTo(e, t, i = "defaultscreen", r = !0) { return this.projectTo(e, t, i, r, !0); } stopProjecting(e = "defaultscreen") { this.projecting.has(e) && (this.projecting.get(e) || []).pop(); let t = this.screens.get(e); if (t && t.currentView) { if (t.model = null, t.screenModel = null, t.currentView = null, this.projecting.has(e)) { let i = this.projecting.get(e); if (i && i.length) { let r = i.pop(); r && this.projectTo(r.component, r.model, e, r.queue, !!r.promise); } } return !0; } return !1; } }; l(y, "instance", new y()); let h = y; const q = k({ name: "screen", props: { name: { type: String, default: "defaultscreen" } }, setup(n, { expose: e }) { const t = K(), i = $(null), r = $(null); e({ currentView: i, model: r }); const s = j(() => i.value != null), a = j(() => { var u; return (u = i.value) == null ? void 0 : u.__file; }); return X(() => { h.Instance.setScreen(t.proxy, n.name); }), { currentViewUID: a, currentView: i, model: r, isVisible: s }; } }); function H(n, e, t, i, r, s) { return J((m(), C("div", null, [ n.currentView ? (m(), x(A(n.currentView), { value: n.model, key: n.currentViewUID }, null, 8, ["value"])) : Q("", !0) ], 512)), [ [W, n.isVisible] ]); } const N = /* @__PURE__ */ O(q, [["render", H]]), _ = { inserted: (n, e) => { d.Instance.injectTo(n, e.arg); }, unbind: (n, e) => { d.Instance.removeFrom(n, e.arg); } }, ee = { bind: (n, e) => { n && d.Instance.setScreen(n, e.arg); } }, D = { projectToDirective: _, screenDirective: ee }, I = class I { constructor() { l(this, "screens", /* @__PURE__ */ new Map()); } static get Instance() { return I.instance; } static set Instance(e) { this.instance = e; } injectTo(e, t) { if (!(!e || !t)) { var i = this.screens.has(t) ? this.screens.get(t) : null; try { e.parentElement && e.removeChild(e); } catch { } i && i.append(e); } } removeFrom(e, t) { if (!(!e || !t)) { var i = this.screens.has(t) ? this.screens.get(t) : null; try { i && i.removeChild(e); } catch { } } } setScreen(e, t = "defaultscreen") { this.screens.set(t, e); } }; l(I, "instance", new I()); let d = I; function g(n, e) { if (n.target.validity) { let t = n.target; if (t.validity) { let i = [ t.validity.badInput ? "bad input" : null, t.validity.customError ? "custom error" : null, t.validity.patternMismatch ? "pattern mismatch" : null, t.validity.rangeOverflow ? "range overflow" : null, t.validity.rangeUnderflow ? "range underflow" : null, t.validity.stepMismatch ? "step mismatch" : null, t.validity.tooLong ? "too long" : null, t.validity.tooShort ? "too short" : null, t.validity.typeMismatch ? "type mismatch" : null, t.validity.valueMissing ? "value missing" : null ].filter((r) => !!r); e(i, t.validity.valid != null ? t.validity.valid : !0); } } } const U = { inserted: (n, e) => { if (!(!n || !n.willValidate)) { switch (n.nodeName) { case "INPUT": case "TEXTAREA": n.onblur = (t) => g(t, e.value); break; case "SELECT": n.onchange = (t) => g(t, e.value); break; } n.oninvalid = (t) => g(t, e.value), n.form && n.form.addEventListener("invalid", () => g({ target: n }, e.value)), e.arg == "immediate" ? n.reportValidity() : g({ target: n }, e.value); } }, unbind: (n) => { } }; function te(n) { n.component("screen", N), n.component("inject", B), n.directive("screen", D.screenDirective), n.directive("projectTo", D.projectToDirective), n.directive("validate", U); } function se(n) { let e = {}; return { init(t, i, r) { return r.registry && (c.Instance = r.registry), r.messageService && (w.Instance = r.messageService), r.projector && (h.Instance = r.projector), r.screens && (d.Instance = r.screens), e = i, n.init(ne, t, i); }, config(t) { return n.config ? n.config(t, e) : null; }, run(t) { return n.run ? n.run(t, e) : null; }, routes: n.routes }; } async function ue(n, e) { const t = n.default.default || n.default; return t.init( f.Instance, e || {}, { registry: c.Instance, messageService: w.Instance, projector: h.Instance, screens: d.Instance } ).then(() => t); } function ae(n) { return (n.default.default || n.default).config(f.Instance); } function oe(n) { return (n.default.default || n.default).run(f.Instance); } function le(n) { return (n.default.default || n.default).routes; } const ne = { install: te, MenuHelper: new f(), menuType: b, CommonRegistry: new c(), MessageService: w, inject: B, screen: N, ValidateDirective: U, MenuNotifications: S, Projector: h }; export { c as CommonRegistry, ae as ConfigModule, ue as InitModule, f as MenuHelper, S as MenuNotifications, w as MessageService, se as ModuleInitializer, le as ModuleRoutes, h as Projector, oe as RunModule, U as ValidateDirective, ne as default, B as inject, b as menuType, N as screen }; //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VzIjpbIi4uL25vZGVfbW9kdWxlcy90aW55LWVtaXR0ZXIvaW5kZXguanMiLCIuLi9zcmMvaGVscGVycy9NZW51SGVscGVyLnRzIiwiLi4vc3JjL2hlbHBlcnMvQ29tbW9uUmVnaXN0cnkudHMiLCIuLi9zcmMvaGVscGVycy9NZXNzYWdlU2VydmljZS50cyIsIi4uL3NyYy9jb21wb25lbnRzL2luamVjdC50cz92dWUmdHlwZT1zY3JpcHQmc3JjPXRydWUmbGFuZy50cyIsIi4uL3NyYy9oZWxwZXJzL1Byb2plY3Rvci50cyIsIi4uL3NyYy9jb21wb25lbnRzL3NjcmVlbi50cz92dWUmdHlwZT1zY3JpcHQmc3JjPXRydWUmbGFuZy50cyIsIi4uL3NyYy9kaXJlY3RpdmVzL3NjcmVlbi50cyIsIi4uL3NyYy9kaXJlY3RpdmVzL3ZhbGlkYXRlLnRzIiwiLi4vc3JjL2luZGV4LnRzIl0sInNvdXJjZXNDb250ZW50IjpbImZ1bmN0aW9uIEUgKCkge1xuICAvLyBLZWVwIHRoaXMgZW1wdHkgc28gaXQncyBlYXNpZXIgdG8gaW5oZXJpdCBmcm9tXG4gIC8vICh2aWEgaHR0cHM6Ly9naXRodWIuY29tL2xpcHNtYWNrIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9pc3N1ZXMvMylcbn1cblxuRS5wcm90b3R5cGUgPSB7XG4gIG9uOiBmdW5jdGlvbiAobmFtZSwgY2FsbGJhY2ssIGN0eCkge1xuICAgIHZhciBlID0gdGhpcy5lIHx8ICh0aGlzLmUgPSB7fSk7XG5cbiAgICAoZVtuYW1lXSB8fCAoZVtuYW1lXSA9IFtdKSkucHVzaCh7XG4gICAgICBmbjogY2FsbGJhY2ssXG4gICAgICBjdHg6IGN0eFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRoaXM7XG4gIH0sXG5cbiAgb25jZTogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrLCBjdHgpIHtcbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgZnVuY3Rpb24gbGlzdGVuZXIgKCkge1xuICAgICAgc2VsZi5vZmYobmFtZSwgbGlzdGVuZXIpO1xuICAgICAgY2FsbGJhY2suYXBwbHkoY3R4LCBhcmd1bWVudHMpO1xuICAgIH07XG5cbiAgICBsaXN0ZW5lci5fID0gY2FsbGJhY2tcbiAgICByZXR1cm4gdGhpcy5vbihuYW1lLCBsaXN0ZW5lciwgY3R4KTtcbiAgfSxcblxuICBlbWl0OiBmdW5jdGlvbiAobmFtZSkge1xuICAgIHZhciBkYXRhID0gW10uc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIHZhciBldnRBcnIgPSAoKHRoaXMuZSB8fCAodGhpcy5lID0ge30pKVtuYW1lXSB8fCBbXSkuc2xpY2UoKTtcbiAgICB2YXIgaSA9IDA7XG4gICAgdmFyIGxlbiA9IGV2dEFyci5sZW5ndGg7XG5cbiAgICBmb3IgKGk7IGkgPCBsZW47IGkrKykge1xuICAgICAgZXZ0QXJyW2ldLmZuLmFwcGx5KGV2dEFycltpXS5jdHgsIGRhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiB0aGlzO1xuICB9LFxuXG4gIG9mZjogZnVuY3Rpb24gKG5hbWUsIGNhbGxiYWNrKSB7XG4gICAgdmFyIGUgPSB0aGlzLmUgfHwgKHRoaXMuZSA9IHt9KTtcbiAgICB2YXIgZXZ0cyA9IGVbbmFtZV07XG4gICAgdmFyIGxpdmVFdmVudHMgPSBbXTtcblxuICAgIGlmIChldnRzICYmIGNhbGxiYWNrKSB7XG4gICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gZXZ0cy5sZW5ndGg7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAoZXZ0c1tpXS5mbiAhPT0gY2FsbGJhY2sgJiYgZXZ0c1tpXS5mbi5fICE9PSBjYWxsYmFjaylcbiAgICAgICAgICBsaXZlRXZlbnRzLnB1c2goZXZ0c1tpXSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGV2ZW50IGZyb20gcXVldWUgdG8gcHJldmVudCBtZW1vcnkgbGVha1xuICAgIC8vIFN1Z2dlc3RlZCBieSBodHRwczovL2dpdGh1Yi5jb20vbGF6ZFxuICAgIC8vIFJlZjogaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0Y29yZ2FuL3RpbnktZW1pdHRlci9jb21taXQvYzZlYmZhYTliYzk3M2IzM2QxMTBhODRhMzA3NzQyYjdjZjk0Yzk1MyNjb21taXRjb21tZW50LTUwMjQ5MTBcblxuICAgIChsaXZlRXZlbnRzLmxlbmd0aClcbiAgICAgID8gZVtuYW1lXSA9IGxpdmVFdmVudHNcbiAgICAgIDogZGVsZXRlIGVbbmFtZV07XG5cbiAgICByZXR1cm4gdGhpcztcbiAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBFO1xubW9kdWxlLmV4cG9ydHMuVGlueUVtaXR0ZXIgPSBFO1xuIiwiaW1wb3J0IHsgVGlueUVtaXR0ZXIgfSBmcm9tICd0aW55LWVtaXR0ZXInO1xuaW1wb3J0IHsgUm91dGVQYXJhbXNSYXcgfSBmcm9tICd2dWUtcm91dGVyJztcblxuZXhwb3J0IGludGVyZmFjZSBJTWVudURlZmluaXRpb24ge1xuICBuYW1lOiBzdHJpbmcsXG4gIGRlc2NyaXB0aW9uOiBzdHJpbmcsXG4gIGljb24/OiBzdHJpbmcsXG4gIHJvdXRlTmFtZT86IHN0cmluZyxcbiAgcm91dGVQYXJhbXM/OiBSb3V0ZVBhcmFtc1JhdyxcbiAgZmVhdHVyZWZsYWdzPzogc3RyaW5nW10sXG4gIG9yZGVySW5kZXg/OiBudW1iZXIsXG4gIHBhcmVudHM/OiBzdHJpbmdbXSxcbiAgY2xhc3M/OiBzdHJpbmcsXG4gIG1ldGE/OiBhbnksXG4gIGhpZGRlbjogKCkgPT4gYm9vbGVhblxufVxuXG5cbmV4cG9ydCBlbnVtIG1lbnVUeXBlIHtcbiAgZHJhd2VyID0gMCxcbiAgc2V0dGluZ3MgPSAxLFxuICBoZWFkZXIgPSAyLFxuICBmb290ZXIgPSAzXG59XG5cbmV4cG9ydCBjb25zdCBNZW51Tm90aWZpY2F0aW9ucyA9IHtcbiAgbWVudURlZmluaXRpb25BZGRlZDogJ25ld21lbnVpdGVtJyxcbiAgbWVudURlZmluaXRpb25Nb3ZlZDogJ21lbnVpdGVtbW92ZWQnXG59XG5cbmV4cG9ydCBjbGFzcyBNZW51SGVscGVyIHtcblxuICBwdWJsaWMgbWVudURlZmluaXRpb25zOiBJTWVudURlZmluaXRpb25bXSA9IFtdO1xuICBwdWJsaWMgbWVudVN0cnVjdHVyZTogeyBba2V5OiBzdHJpbmddOiB7IFtrZXk6IHN0cmluZ106IHN0cmluZ1tdIH0gfSA9IHt9XG4gIHByaXZhdGUgbm90aWZpY2F0aW9uczogVGlueUVtaXR0ZXIgPSBuZXcgVGlueUVtaXR0ZXIoKTtcbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2UgPSBuZXcgTWVudUhlbHBlcigpO1xuICBwdWJsaWMgZ2V0IE5vdGlmaWNhdGlvbnMoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbnM7IH1cbiAgcHVibGljIHN0YXRpYyBnZXQgSW5zdGFuY2UoKSB7IHJldHVybiBNZW51SGVscGVyLmluc3RhbmNlIH1cblxuICBwdWJsaWMgYWRkTWVudURlZmluaXRpb24obWVudURlZmluaXRpb246IElNZW51RGVmaW5pdGlvbiwgLi4ucG9zaXRpb25zOiB7IHNlY3Rpb246IG1lbnVUeXBlLCBwYXJlbnQ/OiBzdHJpbmcgfVtdKSB7XG5cbiAgICAvLyBBZ2dpdW5nbyBsYSBkaWNoaWFyYXppb25lIGRlbCBtZW51w7kgYWxsJ2VsZW5jbyBkZWkgbWVuw7kgZGlzcG9uaWJpbGkuXG4gICAgbGV0IGZvdW5kID0gdGhpcy5tZW51RGVmaW5pdGlvbnMuZmluZChtID0+IG0ubmFtZSA9PSBtZW51RGVmaW5pdGlvbi5uYW1lKTtcbiAgICBpZiAoIWZvdW5kKVxuICAgICAgdGhpcy5tZW51RGVmaW5pdGlvbnMucHVzaChtZW51RGVmaW5pdGlvbik7XG4gICAgZWxzZVxuICAgICAgbWVudURlZmluaXRpb24gPSBmb3VuZDtcblxuICAgIG1lbnVEZWZpbml0aW9uLnBhcmVudHMgPSBbXTtcblxuICAgIGZvciAoY29uc3QgZWxlbWVudCBvZiBwb3NpdGlvbnMpIHtcblxuICAgICAgdGhpcy5tZW51U3RydWN0dXJlW2VsZW1lbnQuc2VjdGlvbl0gPSB0aGlzLm1lbnVTdHJ1Y3R1cmVbZWxlbWVudC5zZWN0aW9uXSB8fCB7fTtcbiAgICAgIHRoaXMubWVudVN0cnVjdHVyZVtlbGVtZW50LnNlY3Rpb25dW2VsZW1lbnQucGFyZW50IHx8IG1lbnVEZWZpbml0aW9uLm5hbWVdID0gdGhpcy5tZW51U3RydWN0dXJlW2VsZW1lbnQuc2VjdGlvbl1bZWxlbWVudC5wYXJlbnQgfHwgbWVudURlZmluaXRpb24ubmFtZV0gfHwgW107XG5cbiAgICAgIGlmIChlbGVtZW50LnBhcmVudCkge1xuICAgICAgICB0aGlzLm1lbnVTdHJ1Y3R1cmVbZWxlbWVudC5zZWN0aW9uXVtlbGVtZW50LnBhcmVudF0ucHVzaChtZW51RGVmaW5pdGlvbi5uYW1lKTtcbiAgICAgICAgbWVudURlZmluaXRpb24ucGFyZW50cy5wdXNoKGVsZW1lbnQucGFyZW50KTtcbiAgICAgIH1cblxuICAgIH1cblxuICAgIHRoaXMubm90aWZpY2F0aW9ucy5lbWl0KE1lbnVOb3RpZmljYXRpb25zLm1lbnVEZWZpbml0aW9uQWRkZWQsIG1lbnVEZWZpbml0aW9uKTtcbiAgfVxuXG4gIHB1YmxpYyByZW1vdmVNZW51RGVmaW5pdGlvbihzZWN0aW9uOiBtZW51VHlwZSwgbmFtZTogc3RyaW5nLCBwYXJlbnQ6IHN0cmluZykge1xuICAgIGxldCByZXN1bHQgPSB0aGlzLm1lbnVEZWZpbml0aW9ucy5maW5kKGkgPT4gaS5uYW1lID09IG5hbWUpO1xuXG4gICAgaWYgKHJlc3VsdCkge1xuICAgICAgLy8gcmVtb3ZlIG1lbnUgZnJvbSBleGlzdGluZyBwb3NpdGlvbnM6XG4gICAgICBpZiAocmVzdWx0LnBhcmVudHMpXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQucGFyZW50cykge1xuICAgICAgICAgIGxldCBjdXJyZW50cGFyZW50ID0gdGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW3BdO1xuICAgICAgICAgIGlmIChjdXJyZW50cGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgciA9IGN1cnJlbnRwYXJlbnQuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgICAgIGlmIChyID49IDApIGN1cnJlbnRwYXJlbnQuc3BsaWNlKHIsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW25hbWVdICYmICF0aGlzLm1lbnVTdHJ1Y3R1cmVbc2VjdGlvbl1bbmFtZV0ubGVuZ3RoKVxuICAgICAgICBkZWxldGUgdGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW25hbWVdO1xuXG4gICAgICByZXN1bHQucGFyZW50cyA9IFtdO1xuICAgIH1cblxuICAgIHRoaXMubm90aWZpY2F0aW9ucy5lbWl0KE1lbnVOb3RpZmljYXRpb25zLm1lbnVEZWZpbml0aW9uTW92ZWQsIHJlc3VsdCk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIHB1YmxpYyBtb3ZlTWVudShzZWN0aW9uOiBtZW51VHlwZSwgbmFtZTogc3RyaW5nLCBwYXJlbnQ6IHN0cmluZywgaW5kZXg6IG51bWJlciA9IDk5OSkge1xuXG4gICAgbGV0IHJlc3VsdCA9IHRoaXMubWVudURlZmluaXRpb25zLmZpbmQoaSA9PiBpLm5hbWUgPT0gbmFtZSk7XG5cbiAgICBpZiAocmVzdWx0KSB7XG4gICAgICByZXN1bHQub3JkZXJJbmRleCA9IGluZGV4O1xuICAgICAgLy8gcmVtb3ZlIG1lbnUgZnJvbSBleGlzdGluZyBwb3NpdGlvbnM6XG4gICAgICBpZiAocmVzdWx0LnBhcmVudHMpXG4gICAgICAgIGZvciAoY29uc3QgcCBvZiByZXN1bHQucGFyZW50cykge1xuICAgICAgICAgIGxldCBjdXJyZW50cGFyZW50ID0gdGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW3BdO1xuICAgICAgICAgIGlmIChjdXJyZW50cGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgciA9IGN1cnJlbnRwYXJlbnQuaW5kZXhPZihuYW1lKTtcbiAgICAgICAgICAgIGlmIChyID49IDApIGN1cnJlbnRwYXJlbnQuc3BsaWNlKHIsIDEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICBpZiAodGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW25hbWVdICYmICF0aGlzLm1lbnVTdHJ1Y3R1cmVbc2VjdGlvbl1bbmFtZV0ubGVuZ3RoKVxuICAgICAgICBkZWxldGUgdGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW25hbWVdO1xuXG4gICAgICByZXN1bHQucGFyZW50cyA9IFtdO1xuXG4gICAgICB0aGlzLm1lbnVTdHJ1Y3R1cmVbc2VjdGlvbl1bcGFyZW50IHx8IG5hbWVdID0gdGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW3BhcmVudCB8fCBuYW1lXSB8fCBbXTtcbiAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgdGhpcy5tZW51U3RydWN0dXJlW3NlY3Rpb25dW3BhcmVudF0ucHVzaChuYW1lKVxuICAgICAgICByZXN1bHQucGFyZW50cy5wdXNoKHBhcmVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgdGhpcy5ub3RpZmljYXRpb25zLmVtaXQoTWVudU5vdGlmaWNhdGlvbnMubWVudURlZmluaXRpb25Nb3ZlZCwgcmVzdWx0KTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgcHVibGljIGdldE1lbnVJdGVtKG5hbWU6IHN0cmluZyk6IElNZW51RGVmaW5pdGlvbiB8IHVuZGVmaW5lZCB7XG4gICAgcmV0dXJuIHRoaXMubWVudURlZmluaXRpb25zLmZpbmQoaSA9PiBpLm5hbWUgPT0gbmFtZSk7XG4gIH1cblxuICBwdWJsaWMgZ2V0TWVudShtZW51OiBtZW51VHlwZSk6IHsgaXRlbTogSU1lbnVEZWZpbml0aW9uIHwgdW5kZWZpbmVkLCBjaGlsZHJlbjogKElNZW51RGVmaW5pdGlvbiB8IHVuZGVmaW5lZClbXSB9W10ge1xuICAgIGxldCByZXN1bHQ6IHsgaXRlbTogSU1lbnVEZWZpbml0aW9uIHwgdW5kZWZpbmVkLCBjaGlsZHJlbjogKElNZW51RGVmaW5pdGlvbiB8IHVuZGVmaW5lZClbXSB9W10gPSBbXTtcbiAgICBsZXQgdXNlZCA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuXG4gICAgZm9yIChjb25zdCBrZXkgaW4gdGhpcy5tZW51U3RydWN0dXJlW21lbnVdKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gdGhpcy5tZW51U3RydWN0dXJlW21lbnVdW2tleV07XG5cblxuICAgICAgbGV0IHJyID0ge1xuICAgICAgICBpdGVtOiB0aGlzLm1lbnVEZWZpbml0aW9ucy5maW5kKG0gPT4ge1xuICAgICAgICAgIHJldHVybiBtLm5hbWUgPT0ga2V5ICYmXG4gICAgICAgICAgICAoIW0uaGlkZGVuIHx8ICFtLmhpZGRlbigpKVxuICAgICAgICB9KSxcblxuICAgICAgICBjaGlsZHJlbjogZWxlbWVudC5tYXAoaSA9PiB0aGlzLm1lbnVEZWZpbml0aW9ucy5maW5kKG0gPT4gbS5uYW1lID09IGkgJiYgKCFtLmhpZGRlbiB8fCAhbS5oaWRkZW4oKSkpKVxuICAgICAgICAgIC5maWx0ZXIoaSA9PiAhIWkpXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGlmIChhICYmIGIgJiYgYS5vcmRlckluZGV4ICYmIGIub3JkZXJJbmRleCAmJiBhLm9yZGVySW5kZXggPiBiLm9yZGVySW5kZXgpIHJldHVybiAxO1xuICAgICAgICAgICAgaWYgKGEgJiYgYiAmJiBhLm9yZGVySW5kZXggJiYgYi5vcmRlckluZGV4ICYmIGEub3JkZXJJbmRleCA8IGIub3JkZXJJbmRleCkgcmV0dXJuIC0xO1xuICAgICAgICAgICAgcmV0dXJuIDBcbiAgICAgICAgICB9KVxuICAgICAgfTtcblxuICAgICAgaWYgKCEhcnIuaXRlbSkge1xuICAgICAgICB1c2VkLmFkZChrZXkpO1xuICAgICAgICBlbGVtZW50LmZvckVhY2goaSA9PiB1c2VkLmFkZChpKSk7XG4gICAgICAgIHJlc3VsdC5wdXNoKHJyKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gcmVzdWx0LmZpbHRlcihpID0+ICEhaS5pdGVtKVxuICAgICAgLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgaWYgKGEgJiYgYiAmJiBhLml0ZW0gJiYgYi5pdGVtICYmIGEuaXRlbS5vcmRlckluZGV4ICYmIGIuaXRlbS5vcmRlckluZGV4ICYmIGEuaXRlbS5vcmRlckluZGV4ID4gYi5pdGVtLm9yZGVySW5kZXgpIHJldHVybiAxO1xuICAgICAgICBpZiAoYSAmJiBiICYmIGEuaXRlbSAmJiBiLml0ZW0gJiYgYS5pdGVtLm9yZGVySW5kZXggJiYgYi5pdGVtLm9yZGVySW5kZXggJiYgYS5pdGVtLm9yZGVySW5kZXggPCBiLml0ZW0ub3JkZXJJbmRleCkgcmV0dXJuIC0xO1xuICAgICAgICByZXR1cm4gMFxuICAgICAgfSk7XG4gIH1cbn1cblxuIiwiXG5leHBvcnQgY2xhc3MgQ29tbW9uUmVnaXN0cnkge1xuXG4gIHByaXZhdGUgcmVnaXN0cnkgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBwcml2YXRlIGdyb3VwZWRyZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBhbnk+PigpO1xuICBwcml2YXRlIHNlcnZpY2VyZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4gIHByaXZhdGUgZ3JvdXBlZHNlcnZpY2VyZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBNYXA8c3RyaW5nLCBhbnk+PigpO1xuXG5cbiAgcHJpdmF0ZSBzdGF0aWMgaW5zdGFuY2U6IENvbW1vblJlZ2lzdHJ5ID0gbmV3IENvbW1vblJlZ2lzdHJ5KCk7XG4gIHN0YXRpYyBnZXQgSW5zdGFuY2UoKSB7IHJldHVybiB0aGlzLmluc3RhbmNlOyB9XG4gIHN0YXRpYyBzZXQgSW5zdGFuY2UodjogQ29tbW9uUmVnaXN0cnkpIHsgdGhpcy5pbnN0YW5jZSA9IHYgfTtcblxuICBwcm92aWRlQ29tcG9uZW50KGNvbXBvbmVudDogYW55LCBuYW1lOiBzdHJpbmcsIGdyb3VwPzogc3RyaW5nKSB7XG4gICAgdGhpcy5yZWdpc3RyeS5zZXQoZ3JvdXAgPyBgJHtncm91cH0tJHtuYW1lfWAgOiBuYW1lLCBjb21wb25lbnQpO1xuICAgIGlmIChncm91cCkge1xuICAgICAgaWYgKCF0aGlzLmdyb3VwZWRyZWdpc3RyeS5oYXMoZ3JvdXApKSB0aGlzLmdyb3VwZWRyZWdpc3RyeS5zZXQoZ3JvdXAsIG5ldyBNYXA8c3RyaW5nLCBhbnk+KCkpO1xuXG4gICAgICBsZXQgZ2cgPSB0aGlzLmdyb3VwZWRyZWdpc3RyeS5nZXQoZ3JvdXApO1xuICAgICAgaWYgKGdnKSBnZy5zZXQobmFtZSwgY29tcG9uZW50KTtcbiAgICB9XG4gIH1cblxuICBnZXRDb21wb25lbnQobmFtZTogc3RyaW5nLCBncm91cD86IHN0cmluZyk6IGFueSB8IG51bGwge1xuICAgIHJldHVybiB0aGlzLnJlZ2lzdHJ5LmdldChncm91cCA/IGAke2dyb3VwfS0ke25hbWV9YCA6IG5hbWUpIHx8IG51bGw7XG4gIH1cblxuICBnZXRDb21wb25lbnRzKC4uLm5hbWU6IHN0cmluZ1tdKTogKGFueSlbXSB7XG4gICAgcmV0dXJuIEFycmF5LmZyb20odGhpcy5yZWdpc3RyeS5lbnRyaWVzKCkpLmZpbHRlcihpID0+IG5hbWUuaW5kZXhPZihpWzBdKSA+PSAwKS5tYXAoaSA9PiBpWzFdKTtcbiAgfVxuXG4gIGdldEdyb3VwQ29tcG9uZW50cyhncm91cDogc3RyaW5nLCAuLi5uYW1lOiBzdHJpbmdbXSk6IChhbnkpW10ge1xuICAgIGxldCBnID0gdGhpcy5ncm91cGVkcmVnaXN0cnkuZ2V0KGdyb3VwKTtcbiAgICBpZiAoZylcbiAgICAgIHJldHVybiBBcnJheS5mcm9tKGcuZW50cmllcygpIHx8IFtdKS5maWx0ZXIoaSA9PiAoIW5hbWUgfHwgbmFtZS5sZW5ndGggPT0gMCkgfHwgbmFtZS5pbmRleE9mKGlbMF0pID49IDApLm1hcChpID0+IGlbMV0pO1xuICAgIHJldHVybiBbXVxuICB9XG5cbiAgZ2V0R3JvdXBDb21wb25lbnRzS2V5cyhncm91cDogc3RyaW5nKTogKHN0cmluZylbXSB7XG4gICAgbGV0IGcgPSB0aGlzLmdyb3VwZWRyZWdpc3RyeS5nZXQoZ3JvdXApO1xuICAgIGlmIChnKSByZXR1cm4gQXJyYXkuZnJvbShnLmtleXMoKSk7XG4gICAgcmV0dXJuIFtdXG4gIH1cblxuICBwcm92aWRlU2VydmljZShuYW1lOiBzdHJpbmcsIHNlcnZpY2U6IGFueSwgZ3JvdXA/OiBzdHJpbmcpIHtcbiAgICB0aGlzLnNlcnZpY2VyZWdpc3RyeS5zZXQobmFtZSwgc2VydmljZSk7XG4gICAgaWYgKGdyb3VwKSB7XG4gICAgICBpZiAoIXRoaXMuZ3JvdXBlZHNlcnZpY2VyZWdpc3RyeS5oYXMoZ3JvdXApKSB0aGlzLmdyb3VwZWRzZXJ2aWNlcmVnaXN0cnkuc2V0KGdyb3VwLCBuZXcgTWFwPHN0cmluZywgYW55PigpKTtcbiAgICAgIGxldCBnZyA9IHRoaXMuZ3JvdXBlZHNlcnZpY2VyZWdpc3RyeS5nZXQoZ3JvdXApO1xuICAgICAgaWYgKGdnKSBnZy5zZXQobmFtZSwgc2VydmljZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0U2VydmljZTxUPihuYW1lOiBzdHJpbmcpIHtcbiAgICByZXR1cm4gKHRoaXMuc2VydmljZXJlZ2lzdHJ5LmdldChuYW1lKSB8fCBudWxsKSBhcyBUO1xuICB9XG5cbiAgZ2V0R3JvdXBTZXJ2aWNlcyhncm91cDogc3RyaW5nLCAuLi5uYW1lOiBzdHJpbmdbXSk6IChhbnkpW10ge1xuICAgIGxldCBnID0gdGhpcy5ncm91cGVkc2VydmljZXJlZ2lzdHJ5LmdldChncm91cCk7XG4gICAgaWYgKGcpXG4gICAgICByZXR1cm4gQXJyYXkuZnJvbShnLmVudHJpZXMoKSB8fCBbXSkuZmlsdGVyKGkgPT4gKCFuYW1lIHx8IG5hbWUubGVuZ3RoID09IDApIHx8IG5hbWUuaW5kZXhPZihpWzBdKSA+PSAwKS5tYXAoaSA9PiBpWzFdKTtcbiAgICByZXR1cm4gW11cbiAgfVxufSIsImltcG9ydCB7IFRpbnlFbWl0dGVyIH0gZnJvbSBcInRpbnktZW1pdHRlclwiO1xuXG5leHBvcnQgY2xhc3MgTWVzc2FnZVNlcnZpY2Uge1xuXG4gIHByaXZhdGUgc3RhdGljIGluc3RhbmNlID0gbmV3IE1lc3NhZ2VTZXJ2aWNlKCk7XG4gIHN0YXRpYyBnZXQgSW5zdGFuY2UoKSB7IHJldHVybiBNZXNzYWdlU2VydmljZS5pbnN0YW5jZSB9XG4gIHN0YXRpYyBzZXQgSW5zdGFuY2UodjogTWVzc2FnZVNlcnZpY2UpIHsgdGhpcy5pbnN0YW5jZSA9IHY7IH1cblxuICBub3RpZmllcjogVGlueUVtaXR0ZXIgPSBuZXcgVGlueUVtaXR0ZXIoKTtcblxuICBzZW5kKG1lc3NhZ2U6IHN0cmluZywgLi4uYXJnczogYW55W10pIHtcbiAgICB0aGlzLm5vdGlmaWVyLmVtaXQobWVzc2FnZSwgLi4uYXJncyk7XG4gIH1cblxuICBzdWJzY3JpYmUobWVzc2FnZTogc3RyaW5nLCBjYWxsYmFjazogRnVuY3Rpb24sIGN0eD86IGFueSkge1xuICAgIHRoaXMubm90aWZpZXIub24obWVzc2FnZSwgY2FsbGJhY2ssIGN0eCk7XG4gIH1cblxuICBvbmNlKG1lc3NhZ2U6IHN0cmluZywgY2FsbGJhY2s6IEZ1bmN0aW9uLCBjdHg/OiBhbnkpIHtcbiAgICB0aGlzLm5vdGlmaWVyLm9uY2UobWVzc2FnZSwgY2FsbGJhY2ssIGN0eCk7XG4gIH1cblxuICB1bnN1YnNjcmliZShtZXNzYWdlOiBzdHJpbmcsIGNhbGxiYWNrPzogRnVuY3Rpb24pIHtcbiAgICB0aGlzLm5vdGlmaWVyLm9mZihtZXNzYWdlLCBjYWxsYmFjayk7XG4gIH1cblxuICBhc2s8VD4obWVzc2FnZTogc3RyaW5nLCAuLi5hcmdzOiBhbnlbXSk6IFByb21pc2U8VD4ge1xuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG5cbiAgICAgIHNldFRpbWVvdXQocmVqZWN0LCAxMDAwMCk7XG5cbiAgICAgIHRoaXMubm90aWZpZXIuZW1pdChgJGFzay0ke21lc3NhZ2V9YCwge1xuICAgICAgICByZXNvbHZlLFxuICAgICAgICByZWplY3QsXG4gICAgICAgIGFyZ3NcbiAgICAgIH0pXG4gICAgfSlcbiAgfVxuXG4gIHJlcGx5PFI+KG1lc3NhZ2U6IHN0cmluZywgY2FsbGJhY2s6ICguLi5hcmdzOiBhbnlbXSkgPT4gUikge1xuICAgIHRoaXMubm90aWZpZXIub24oYCRhc2stJHttZXNzYWdlfWAsIChtOiB7IHJlc29sdmU6IChkYXRhOiBSKSA9PiB2b2lkLCByZWplY3Q6IEZ1bmN0aW9uLCBhcmdzOiBhbnlbXSB9KSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBsZXQgcmVzdWx0ID0gY2FsbGJhY2soLi4ubS5hcmdzKTtcbiAgICAgICAgbS5yZXNvbHZlKHJlc3VsdCk7XG4gICAgICB9XG4gICAgICBjYXRjaCAoZXJyKSB7XG4gICAgICAgIG0ucmVqZWN0KCk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cbn0iLCJpbXBvcnQgeyBjb21wdXRlZCwgZGVmaW5lQ29tcG9uZW50IH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgQ29tbW9uUmVnaXN0cnkgfSBmcm9tIFwiLi4vaGVscGVycy9Db21tb25SZWdpc3RyeVwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcImluamVjdFwiLFxuICBwcm9wczoge1xuICAgIGlkOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICB0eXBlOiB7IGRlZmF1bHQ6IG51bGwsIHR5cGU6IFN0cmluZyB9LFxuICAgIHZhbHVlOiB7IGRlZmF1bHQ6IG51bGwgfSxcbiAgICBuYW1lOiB7IHR5cGU6IFN0cmluZywgZGVmYXVsdDogbnVsbCB9LFxuICAgIG5hbWVzOiB7IHR5cGU6IEFycmF5PHN0cmluZz4sIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBncm91cDogeyB0eXBlOiBTdHJpbmcsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBtZXRhZGF0YTogeyB0eXBlOiBPYmplY3QsIGRlZmF1bHQ6IG51bGwgfSxcbiAgICBkaXNhYmxlZDogeyB0eXBlOiBCb29sZWFuLCBkZWZhdWx0OiBmYWxzZSB9LFxuICAgIHJlYWRvbmx5OiB7IHR5cGU6IEJvb2xlYW4sIGRlZmF1bHQ6IGZhbHNlIH1cbiAgfSxcbiAgc2V0dXAocHJvcHMsIHsgZW1pdCB9KSB7XG5cblxuICAgIGNvbnN0IFZhbHVlID0gY29tcHV0ZWQoe1xuICAgICAgZ2V0OiAoKSA9PiB7IHJldHVybiBwcm9wcy52YWx1ZSB9LFxuICAgICAgc2V0OiAodikgPT4geyBlbWl0KFwiaW5wdXRcIiwgdik7IH1cbiAgICB9KVxuXG4gICAgY29uc3QgQ29tcG9uZW50cyA9IGNvbXB1dGVkKCgpID0+IHtcbiAgICAgIGlmIChwcm9wcy5uYW1lKVxuICAgICAgICByZXR1cm4gW0NvbW1vblJlZ2lzdHJ5Lkluc3RhbmNlLmdldENvbXBvbmVudChwcm9wcy5uYW1lLCBwcm9wcy5ncm91cCldO1xuICAgICAgaWYgKHByb3BzLmdyb3VwKVxuICAgICAgICByZXR1cm4gQ29tbW9uUmVnaXN0cnkuSW5zdGFuY2UuZ2V0R3JvdXBDb21wb25lbnRzKHByb3BzLmdyb3VwLCAuLi4ocHJvcHMubmFtZXMgfHwgW10pKTtcbiAgICAgIHJldHVybiBDb21tb25SZWdpc3RyeS5JbnN0YW5jZS5nZXRDb21wb25lbnRzKC4uLihwcm9wcy5uYW1lcyB8fCBbXSkpO1xuICAgIH0pO1xuXG4gICAgY29uc3QgY2xpY2sgPSAoLi4uYXJnczogYW55W10pID0+IHsgZW1pdCgnY2xpY2snLCAuLi5hcmdzKSB9XG4gICAgY29uc3Qgc2F2ZSA9ICguLi5hcmdzOiBhbnlbXSkgPT4geyBlbWl0KCdzYXZlJywgLi4uYXJncykgfVxuXG4gICAgcmV0dXJuIHtcbiAgICAgIGlkOiBwcm9wcy5pZCxcbiAgICAgIHR5cGU6IHByb3BzLnR5cGUsXG4gICAgICB2YWx1ZTogcHJvcHMudmFsdWUsXG4gICAgICBuYW1lOiBwcm9wcy5uYW1lLFxuICAgICAgbmFtZXM6IHByb3BzLm5hbWVzLFxuICAgICAgZ3JvdXA6IHByb3BzLmdyb3VwLFxuICAgICAgbWV0YWRhdGE6IHByb3BzLm1ldGFkYXRhLFxuICAgICAgZGlzYWJsZWQ6IHByb3BzLmRpc2FibGVkLFxuICAgICAgcmVhZG9ubHk6IHByb3BzLnJlYWRvbmx5LFxuICAgICAgY2xpY2ssXG4gICAgICBzYXZlLFxuICAgICAgQ29tcG9uZW50cyxcbiAgICAgIFZhbHVlLFxuICAgIH1cbiAgfVxuXG59KTtcbiIsIlxuaW1wb3J0IHsgQ29tcG9uZW50LCBDb21wb25lbnRQdWJsaWNJbnN0YW5jZSB9IGZyb20gXCJ2dWVcIjtcblxuZXhwb3J0IGludGVyZmFjZSBJUHJvamVjdGFibGVNb2RlbDxUPiB7XG4gIGRhdGE6IFQ7IHJlc29sdmU6IChpdGVtOiBUKSA9PiB2b2lkOyByZWplY3Q6ICgpID0+IHZvaWQ7XG59XG5cbmV4cG9ydCBjbGFzcyBQcm9qZWN0b3Ige1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZSA9IG5ldyBQcm9qZWN0b3IoKTtcbiAgc3RhdGljIGdldCBJbnN0YW5jZSgpOiBQcm9qZWN0b3IgeyByZXR1cm4gUHJvamVjdG9yLmluc3RhbmNlIH1cbiAgc3RhdGljIHNldCBJbnN0YW5jZSh2OiBQcm9qZWN0b3IpIHsgdGhpcy5pbnN0YW5jZSA9IHY7IH1cblxuICBwcml2YXRlIHNjcmVlbnMgPSBuZXcgTWFwPHN0cmluZywgYW55PigpO1xuICBwcml2YXRlIHByb2plY3RpbmcgPSBuZXcgTWFwPHN0cmluZywgeyBjb21wb25lbnQ6IENvbXBvbmVudCwgbW9kZWw6IElQcm9qZWN0YWJsZU1vZGVsPGFueT4sIHByb21pc2U6IFByb21pc2U8YW55PiB8IG51bGwsIHF1ZXVlOiBib29sZWFuIH1bXT4oKTtcblxuICBzZXRTY3JlZW4oc2NyZWVuOiBDb21wb25lbnRQdWJsaWNJbnN0YW5jZSwgbmFtZTogc3RyaW5nID0gXCJkZWZhdWx0c2NyZWVuXCIpIHtcbiAgICB0aGlzLnNjcmVlbnMuc2V0KG5hbWUsIHNjcmVlbik7XG4gIH1cblxuXG5cbiAgcHJvamVjdFRvPFQ+KGNvbXBvbmVudDogQ29tcG9uZW50LCBkYXRhOiBUIHwgbnVsbCA9IG51bGwsIHNjcmVlbjogc3RyaW5nID0gXCJkZWZhdWx0c2NyZWVuXCIsIHF1ZXVlOiBib29sZWFuID0gdHJ1ZSwgYXN5bmM6IGJvb2xlYW4gPSBmYWxzZSk6IFByb21pc2U8VD4gfCBudWxsIHtcbiAgICBjb25zdCBtb2RlbCA9IHsgZGF0YSB9IGFzIElQcm9qZWN0YWJsZU1vZGVsPFQ+O1xuICAgIGNvbnN0IHByb21pc2UgPSBhc3luYyA/IG5ldyBQcm9taXNlPFQ+KChyZXNvbHZlLCByZWplY3QpID0+IHsgbW9kZWwucmVqZWN0ID0gcmVqZWN0OyBtb2RlbC5yZXNvbHZlID0gcmVzb2x2ZSB9KSA6IG51bGw7XG5cbiAgICBpZiAoIXF1ZXVlKSB7XG5cbiAgICAgIHRoaXMucHJvamVjdGluZy5zZXQoc2NyZWVuLCBbeyBjb21wb25lbnQsIG1vZGVsLCBwcm9taXNlLCBxdWV1ZSB9XSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmICghdGhpcy5wcm9qZWN0aW5nLmhhcyhzY3JlZW4pKSB7XG4gICAgICAgIHRoaXMucHJvamVjdGluZy5zZXQoc2NyZWVuLCBbXSk7XG4gICAgICB9XG4gICAgICAodGhpcy5wcm9qZWN0aW5nLmdldChzY3JlZW4pIHx8IFtdKS5wdXNoKHsgY29tcG9uZW50LCBtb2RlbCwgcHJvbWlzZSwgcXVldWUgfSk7XG4gICAgfVxuXG4gICAgY29uc3Qgc3MgPSB0aGlzLnNjcmVlbnMuZ2V0KHNjcmVlbik7XG4gICAgaWYgKCFzcykgcmV0dXJuIG51bGw7XG4gICAgc3MubW9kZWwgPSBtb2RlbDtcbiAgICBzcy5jdXJyZW50VmlldyA9IGNvbXBvbmVudDtcblxuICAgIGlmIChwcm9taXNlKSBwcm9taXNlLnRoZW4oKCkgPT4gdGhpcy5zdG9wUHJvamVjdGluZyhzY3JlZW4pKS5jYXRjaCgoKSA9PiB0aGlzLnN0b3BQcm9qZWN0aW5nKHNjcmVlbikpO1xuICAgIHJldHVybiBwcm9taXNlO1xuICB9XG5cbiAgcHJvamVjdEFzeW5jVG88VD4oY29tcG9uZW50OiBDb21wb25lbnQsIGRhdGE6IFQsIHNjcmVlbjogc3RyaW5nID0gXCJkZWZhdWx0c2NyZWVuXCIsIHF1ZXVlOiBib29sZWFuID0gdHJ1ZSkge1xuICAgIHJldHVybiB0aGlzLnByb2plY3RUbyhjb21wb25lbnQsIGRhdGEsIHNjcmVlbiwgcXVldWUsIHRydWUpXG4gIH1cblxuICBzdG9wUHJvamVjdGluZyhzY3JlZW46IHN0cmluZyA9IFwiZGVmYXVsdHNjcmVlblwiKSB7XG4gICAgaWYgKHRoaXMucHJvamVjdGluZy5oYXMoc2NyZWVuKSkge1xuICAgICAgKHRoaXMucHJvamVjdGluZy5nZXQoc2NyZWVuKSB8fCBbXSkucG9wKClcbiAgICB9XG5cbiAgICBsZXQgX3NjcmVlbiA9IHRoaXMuc2NyZWVucy5nZXQoc2NyZWVuKVxuICAgIGlmIChfc2NyZWVuICYmIF9zY3JlZW4uY3VycmVudFZpZXcpIHtcbiAgICAgIF9zY3JlZW4ubW9kZWwgPSBudWxsO1xuICAgICAgX3NjcmVlbi5zY3JlZW5Nb2RlbCA9IG51bGw7XG4gICAgICBfc2NyZWVuLmN1cnJlbnRWaWV3ID0gbnVsbDtcblxuICAgICAgaWYgKHRoaXMucHJvamVjdGluZy5oYXMoc2NyZWVuKSkge1xuICAgICAgICBsZXQgcyA9IHRoaXMucHJvamVjdGluZy5nZXQoc2NyZWVuKTtcbiAgICAgICAgaWYgKHMgJiYgcy5sZW5ndGgpIHtcbiAgICAgICAgICBsZXQgbSA9IHMucG9wKCk7XG4gICAgICAgICAgaWYgKG0pIHRoaXMucHJvamVjdFRvKG0uY29tcG9uZW50LCBtLm1vZGVsLCBzY3JlZW4sIG0ucXVldWUsICEhbS5wcm9taXNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUHJvamVjdGFibGU8VD4ge1xuICB2YWx1ZToge1xuICAgIGRhdGE6IFQsXG4gICAgcmVzb2x2ZTogKGl0ZW06IFQpID0+IHZvaWQ7XG4gICAgcmVqZWN0OiAoKSA9PiB2b2lkO1xuICB9O1xufSIsImltcG9ydCB7IENvbXBvbmVudCwgY29tcHV0ZWQsIGRlZmluZUNvbXBvbmVudCwgZ2V0Q3VycmVudEluc3RhbmNlLCBvbk1vdW50ZWQsIFJlZiwgcmVmIH0gZnJvbSBcInZ1ZVwiO1xuaW1wb3J0IHsgSVByb2plY3RhYmxlTW9kZWwsIFByb2plY3RvciB9IGZyb20gXCIuLi9oZWxwZXJzL1Byb2plY3RvclwiO1xuXG5leHBvcnQgZGVmYXVsdCBkZWZpbmVDb21wb25lbnQoe1xuICBuYW1lOiBcInNjcmVlblwiLFxuICBwcm9wczoge1xuICAgIG5hbWU6IHsgdHlwZTogU3RyaW5nLCBkZWZhdWx0OiBcImRlZmF1bHRzY3JlZW5cIiB9LFxuICB9LFxuICBzZXR1cChwcm9wcywgeyBleHBvc2UgfSkge1xuXG4gICAgY29uc3QgbWUgPSBnZXRDdXJyZW50SW5zdGFuY2UoKTtcblxuICAgIGNvbnN0IGN1cnJlbnRWaWV3OiBSZWY8Q29tcG9uZW50PiA9IHJlZihudWxsISk7XG4gICAgY29uc3QgbW9kZWw6IFJlZjxJUHJvamVjdGFibGVNb2RlbDxhbnk+IHwgbnVsbD4gPSByZWYobnVsbCEpO1xuXG4gICAgZXhwb3NlKHsgY3VycmVudFZpZXcsIG1vZGVsIH0pXG5cbiAgICBjb25zdCBpc1Zpc2libGUgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gY3VycmVudFZpZXcudmFsdWUgIT0gbnVsbDtcbiAgICB9KVxuXG4gICAgY29uc3QgY3VycmVudFZpZXdVSUQgPSBjb21wdXRlZCgoKSA9PiB7XG4gICAgICByZXR1cm4gKGN1cnJlbnRWaWV3LnZhbHVlIGFzIGFueSk/Ll9fZmlsZVxuICAgIH0pXG5cbiAgICBvbk1vdW50ZWQoKCkgPT4ge1xuICAgICAgUHJvamVjdG9yLkluc3RhbmNlLnNldFNjcmVlbigobWUgYXMgYW55KS5wcm94eSwgcHJvcHMubmFtZSk7XG4gICAgfSlcblxuICAgIHJldHVybiB7XG4gICAgICBjdXJyZW50Vmlld1VJRCxcbiAgICAgIGN1cnJlbnRWaWV3LFxuICAgICAgbW9kZWwsXG4gICAgICBpc1Zpc2libGVcbiAgICB9XG4gIH0sXG5cbn0pIiwiY29uc3QgcHJvamVjdFRvRGlyZWN0aXZlID0ge1xuXG4gIGluc2VydGVkOiAoZWw6IEVsZW1lbnQsIGJpbmQ6IGFueSkgPT4ge1xuICAgIFNjcmVlbnNNYW5hZ2VyLkluc3RhbmNlLmluamVjdFRvKGVsLCBiaW5kLmFyZyk7XG4gIH0sXG4gIHVuYmluZDogKGVsOiBFbGVtZW50LCBiaW5kOiBhbnkpID0+IHtcbiAgICBTY3JlZW5zTWFuYWdlci5JbnN0YW5jZS5yZW1vdmVGcm9tKGVsLCBiaW5kLmFyZylcbiAgfVxufVxuXG5jb25zdCBzY3JlZW5EaXJlY3RpdmUgPSB7XG4gIGJpbmQ6IChlbDogYW55LCBiaW5kaW5nOiBhbnkpID0+IHtcbiAgICBpZiAoIWVsKSByZXR1cm47XG4gICAgU2NyZWVuc01hbmFnZXIuSW5zdGFuY2Uuc2V0U2NyZWVuKGVsLCBiaW5kaW5nLmFyZyk7XG4gIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQge1xuICBwcm9qZWN0VG9EaXJlY3RpdmUsIHNjcmVlbkRpcmVjdGl2ZVxufVxuXG5leHBvcnQgY2xhc3MgU2NyZWVuc01hbmFnZXIge1xuICBwcml2YXRlIHN0YXRpYyBpbnN0YW5jZSA9IG5ldyBTY3JlZW5zTWFuYWdlcigpO1xuICBzdGF0aWMgZ2V0IEluc3RhbmNlKCk6IFNjcmVlbnNNYW5hZ2VyIHsgcmV0dXJuIFNjcmVlbnNNYW5hZ2VyLmluc3RhbmNlIH1cbiAgc3RhdGljIHNldCBJbnN0YW5jZSh2OiBTY3JlZW5zTWFuYWdlcikgeyB0aGlzLmluc3RhbmNlID0gdjsgfVxuICBwcml2YXRlIHNjcmVlbnMgPSBuZXcgTWFwPHN0cmluZywgRWxlbWVudD4oKTtcbiAgXG5cbiAgaW5qZWN0VG8oZG9tRWxlbWVudDogRWxlbWVudCwgc2NyZWVuOiBzdHJpbmcpIHtcbiAgICBpZiAoIWRvbUVsZW1lbnQgfHwgIXNjcmVlbikgcmV0dXJuO1xuICAgIHZhciBlbGVtZW50ID0gdGhpcy5zY3JlZW5zLmhhcyhzY3JlZW4pID8gdGhpcy5zY3JlZW5zLmdldChzY3JlZW4pIDogbnVsbDtcbiAgICB0cnkgeyBkb21FbGVtZW50LnBhcmVudEVsZW1lbnQgJiYgZG9tRWxlbWVudC5yZW1vdmVDaGlsZChkb21FbGVtZW50KTsgfSBjYXRjaCB7IH1cbiAgICBpZiAoZWxlbWVudCkgZWxlbWVudC5hcHBlbmQoZG9tRWxlbWVudCk7XG4gIH1cblxuICByZW1vdmVGcm9tKGRvbUVsZW1lbnQ6IEVsZW1lbnQsIHNjcmVlbjogc3RyaW5nKSB7XG4gICAgaWYgKCFkb21FbGVtZW50IHx8ICFzY3JlZW4pIHJldHVybjtcbiAgICB2YXIgZWxlbWVudCA9IHRoaXMuc2NyZWVucy5oYXMoc2NyZWVuKSA/IHRoaXMuc2NyZWVucy5nZXQoc2NyZWVuKSA6IG51bGw7XG4gICAgdHJ5IHsgaWYgKGVsZW1lbnQpIGVsZW1lbnQucmVtb3ZlQ2hpbGQoZG9tRWxlbWVudCkgfSBjYXRjaCB7IH1cbiAgfVxuXG4gIHNldFNjcmVlbihzY3JlZW46IEVsZW1lbnQsIG5hbWU6IHN0cmluZyA9IFwiZGVmYXVsdHNjcmVlblwiKSB7XG4gICAgdGhpcy5zY3JlZW5zLnNldChuYW1lLCBzY3JlZW4pO1xuICB9XG59IiwiZnVuY3Rpb24gY2hlY2tJbnB1dFZhbGlkYXRpb24oYTogRXZlbnQsIGNhbGxvdXQ6IChlcnJvcnM6IHN0cmluZ1tdLCB2YWxpZDogYm9vbGVhbikgPT4gdm9pZCkge1xuICBpZiAoKGEudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpLnZhbGlkaXR5KSB7XG4gICAgbGV0IGVsID0gKGEudGFyZ2V0IGFzIEhUTUxJbnB1dEVsZW1lbnQpO1xuXG4gICAgaWYgKGVsLnZhbGlkaXR5KSB7XG4gICAgICBsZXQgZXJyb3JzID0gW1xuICAgICAgICBlbC52YWxpZGl0eS5iYWRJbnB1dCA/IFwiYmFkIGlucHV0XCIgOiBudWxsLFxuICAgICAgICBlbC52YWxpZGl0eS5jdXN0b21FcnJvciA/IFwiY3VzdG9tIGVycm9yXCIgOiBudWxsLFxuICAgICAgICBlbC52YWxpZGl0eS5wYXR0ZXJuTWlzbWF0Y2ggPyBcInBhdHRlcm4gbWlzbWF0Y2hcIiA6IG51bGwsXG4gICAgICAgIGVsLnZhbGlkaXR5LnJhbmdlT3ZlcmZsb3cgPyBcInJhbmdlIG92ZXJmbG93XCIgOiBudWxsLFxuICAgICAgICBlbC52YWxpZGl0eS5yYW5nZVVuZGVyZmxvdyA/IFwicmFuZ2UgdW5kZXJmbG93XCIgOiBudWxsLFxuICAgICAgICBlbC52YWxpZGl0eS5zdGVwTWlzbWF0Y2ggPyBcInN0ZXAgbWlzbWF0Y2hcIiA6IG51bGwsXG4gICAgICAgIGVsLnZhbGlkaXR5LnRvb0xvbmcgPyBcInRvbyBsb25nXCIgOiBudWxsLFxuICAgICAgICBlbC52YWxpZGl0eS50b29TaG9ydCA/IFwidG9vIHNob3J0XCIgOiBudWxsLFxuICAgICAgICBlbC52YWxpZGl0eS50eXBlTWlzbWF0Y2ggPyBcInR5cGUgbWlzbWF0Y2hcIiA6IG51bGwsXG4gICAgICAgIGVsLnZhbGlkaXR5LnZhbHVlTWlzc2luZyA/IFwidmFsdWUgbWlzc2luZ1wiIDogbnVsbF0uZmlsdGVyKGkgPT4gISFpKVxuXG4gICAgICBjYWxsb3V0KGVycm9ycyBhcyBzdHJpbmdbXSwgZWwudmFsaWRpdHkudmFsaWQgIT0gdW5kZWZpbmVkID8gZWwudmFsaWRpdHkudmFsaWQgOiB0cnVlKTtcbiAgICB9XG4gIH1cbn1cblxuZXhwb3J0IGNvbnN0IHZhbGlkYXRlID0ge1xuICBpbnNlcnRlZDogKGVsOiBIVE1MSW5wdXRFbGVtZW50IHwgSFRNTFRleHRBcmVhRWxlbWVudCB8IEhUTUxTZWxlY3RFbGVtZW50LCBiaW5kOiB7XG4gICAgdmFsdWU6IChlcnJvcnM6IHN0cmluZ1tdLCB2YWxpZDogYm9vbGVhbikgPT4gdm9pZCxcbiAgICBhcmc6IFwiaW1tZWRpYXRlXCJcbiAgfSkgPT4ge1xuICAgIGlmICghZWwgfHwgIWVsLndpbGxWYWxpZGF0ZSkgcmV0dXJuO1xuICAgIHN3aXRjaCAoZWwubm9kZU5hbWUpIHtcbiAgICAgIGNhc2UgXCJJTlBVVFwiOlxuICAgICAgY2FzZSBcIlRFWFRBUkVBXCI6IGVsLm9uYmx1ciA9IChhcmcpID0+IGNoZWNrSW5wdXRWYWxpZGF0aW9uKGFyZywgYmluZC52YWx1ZSk7IGJyZWFrO1xuICAgICAgY2FzZSBcIlNFTEVDVFwiOiBlbC5vbmNoYW5nZSA9IChhcmcpID0+IGNoZWNrSW5wdXRWYWxpZGF0aW9uKGFyZywgYmluZC52YWx1ZSk7IGJyZWFrO1xuICAgIH1cblxuICAgIGVsLm9uaW52YWxpZCA9IChhcmcpID0+IGNoZWNrSW5wdXRWYWxpZGF0aW9uKGFyZywgYmluZC52YWx1ZSk7XG4gICAgaWYgKGVsLmZvcm0pIGVsLmZvcm0uYWRkRXZlbnRMaXN0ZW5lcignaW52YWxpZCcsICgpID0+IGNoZWNrSW5wdXRWYWxpZGF0aW9uKHsgdGFyZ2V0OiBlbCB9IGFzIGFueSwgYmluZC52YWx1ZSkpXG5cbiAgICBpZiAoYmluZC5hcmcgPT0gXCJpbW1lZGlhdGVcIikgZWwucmVwb3J0VmFsaWRpdHkoKTtcbiAgICBlbHNlIGNoZWNrSW5wdXRWYWxpZGF0aW9uKHsgdGFyZ2V0OiBlbCB9IGFzIGFueSwgYmluZC52YWx1ZSlcbiAgfSxcbiAgdW5iaW5kOiAoZWw6IEVsZW1lbnQpID0+IHtcbiAgICBpZiAoIWVsKSByZXR1cm47XG5cbiAgfSxcbn0iLCJpbXBvcnQgeyB0eXBlIElNZW51RGVmaW5pdGlvbiwgTWVudUhlbHBlciwgbWVudVR5cGUsIE1lbnVOb3RpZmljYXRpb25zIH0gZnJvbSBcIi4vaGVscGVycy9NZW51SGVscGVyXCI7XG5pbXBvcnQgeyBDb21tb25SZWdpc3RyeSB9IGZyb20gXCIuL2hlbHBlcnMvQ29tbW9uUmVnaXN0cnlcIjtcbmltcG9ydCB7IE1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSBcIi4vaGVscGVycy9NZXNzYWdlU2VydmljZVwiO1xuaW1wb3J0IGluamVjdCBmcm9tIFwiLi9jb21wb25lbnRzL2luamVjdC52dWVcIjtcbmltcG9ydCBzY3JlZW4gZnJvbSBcIi4vY29tcG9uZW50cy9zY3JlZW4udnVlXCJcbmltcG9ydCB7IFByb2plY3RvciwgdHlwZSBJUHJvamVjdGFibGVNb2RlbCwgdHlwZSBQcm9qZWN0YWJsZSB9IGZyb20gXCIuL2hlbHBlcnMvUHJvamVjdG9yXCI7XG5pbXBvcnQgZGlyZWN0aXZlcywgeyBTY3JlZW5zTWFuYWdlciB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvc2NyZWVuXCI7XG5pbXBvcnQgeyB2YWxpZGF0ZSBhcyBWYWxpZGF0ZURpcmVjdGl2ZSB9IGZyb20gXCIuL2RpcmVjdGl2ZXMvdmFsaWRhdGVcIjtcbmltcG9ydCB7IFJvdXRlUmVjb3JkUmF3IH0gZnJvbSBcInZ1ZS1yb3V0ZXJcIjtcblxuXG5mdW5jdGlvbiBpbnN0YWxsKFZ1ZTogeyBjb21wb25lbnQ6IGFueSwgZGlyZWN0aXZlOiBhbnkgfSkge1xuICBWdWUuY29tcG9uZW50KFwic2NyZWVuXCIsIHNjcmVlbik7XG4gIFZ1ZS5jb21wb25lbnQoXCJpbmplY3RcIiwgaW5qZWN0KTtcbiAgVnVlLmRpcmVjdGl2ZShcInNjcmVlblwiLCBkaXJlY3RpdmVzLnNjcmVlbkRpcmVjdGl2ZSk7XG4gIFZ1ZS5kaXJlY3RpdmUoXCJwcm9qZWN0VG9cIiwgZGlyZWN0aXZlcy5wcm9qZWN0VG9EaXJlY3RpdmUpO1xuICBWdWUuZGlyZWN0aXZlKFwidmFsaWRhdGVcIiwgVmFsaWRhdGVEaXJlY3RpdmUgYXMgYW55KTtcbn1cbmV4cG9ydCBpbnRlcmZhY2UgSU1vZHVsZUluaXRpYWxpemVyV3JhcHBlciB7XG4gIGluaXQobWVudTogTWVudUhlbHBlcixcbiAgICBjb25maWd1cmF0aW9uOiBhbnlcbiAgICAsIG9wdGlvbnM6IHtcbiAgICAgIHJlZ2lzdHJ5OiBDb21tb25SZWdpc3RyeSxcbiAgICAgIG1lc3NhZ2VTZXJ2aWNlOiB0eXBlb2YgTWVzc2FnZVNlcnZpY2UuSW5zdGFuY2UsXG4gICAgICBwcm9qZWN0b3I6IFByb2plY3RvcixcbiAgICAgIHNjcmVlbnM6IFNjcmVlbnNNYW5hZ2VyXG4gICAgfSk6IFByb21pc2U8dm9pZD4sXG4gIGNvbmZpZyhtZW51OiBNZW51SGVscGVyKTogUHJvbWlzZTx2b2lkPixcbiAgcnVuKG1lbnU6IE1lbnVIZWxwZXIpOiBQcm9taXNlPHZvaWQ+LFxuICByb3V0ZXM6IFJvdXRlUmVjb3JkUmF3W11cbn1cblxuXG5leHBvcnQgaW50ZXJmYWNlIElNb2R1bGVJbml0aWFsaXplciB7XG4gIGluaXQodnVlbWY6IHR5cGVvZiBWdWVNZk1vZHVsZSwgbWVudTogTWVudUhlbHBlciwgY29uZmlndXJhdGlvbjogYW55KTogUHJvbWlzZTx2b2lkPixcblxuICBjb25maWc/KG1lbnU6IE1lbnVIZWxwZXIsIGNvbmZpZ3VyYXRpb246IGFueSk6IFByb21pc2U8dm9pZD4sXG5cbiAgcnVuPyhtZW51OiBNZW51SGVscGVyLCBjb25maWd1cmF0aW9uOiBhbnkpOiBQcm9taXNlPHZvaWQ+LFxuXG4gIHJvdXRlczogUm91dGVSZWNvcmRSYXdbXVxufVxuXG5leHBvcnQgZnVuY3Rpb24gTW9kdWxlSW5pdGlhbGl6ZXIob3B0czogSU1vZHVsZUluaXRpYWxpemVyKSB7XG4gIGxldCBtb2R1bGVDb25maWcgPSB7fTtcbiAgcmV0dXJuIHtcbiAgICBpbml0KG1lbnU6IE1lbnVIZWxwZXIsIGNvbmZpZ3VyYXRpb246IGFueSxcbiAgICAgIG9wdGlvbnM6IHtcbiAgICAgICAgcmVnaXN0cnk6IENvbW1vblJlZ2lzdHJ5LFxuICAgICAgICBtZXNzYWdlU2VydmljZTogdHlwZW9mIE1lc3NhZ2VTZXJ2aWNlLkluc3RhbmNlLFxuICAgICAgICBwcm9qZWN0b3I6IFByb2plY3RvcixcbiAgICAgICAgc2NyZWVuczogU2NyZWVuc01hbmFnZXJcbiAgICAgIH0pIHtcblxuICAgICAgaWYgKG9wdGlvbnMucmVnaXN0cnkpIENvbW1vblJlZ2lzdHJ5Lkluc3RhbmNlID0gb3B0aW9ucy5yZWdpc3RyeTtcbiAgICAgIGlmIChvcHRpb25zLm1lc3NhZ2VTZXJ2aWNlKSBNZXNzYWdlU2VydmljZS5JbnN0YW5jZSA9IG9wdGlvbnMubWVzc2FnZVNlcnZpY2VcbiAgICAgIGlmIChvcHRpb25zLnByb2plY3RvcikgUHJvamVjdG9yLkluc3RhbmNlID0gb3B0aW9ucy5wcm9qZWN0b3I7XG4gICAgICBpZiAob3B0aW9ucy5zY3JlZW5zKSBTY3JlZW5zTWFuYWdlci5JbnN0YW5jZSA9IG9wdGlvbnMuc2NyZWVucztcbiAgICAgIG1vZHVsZUNvbmZpZyA9IGNvbmZpZ3VyYXRpb247XG4gICAgICByZXR1cm4gb3B0cy5pbml0KFZ1ZU1mTW9kdWxlLCBtZW51LCBjb25maWd1cmF0aW9uKTtcbiAgICB9LFxuICAgIGNvbmZpZyhtZW51OiBNZW51SGVscGVyKSB7XG4gICAgICByZXR1cm4gb3B0cy5jb25maWcgPyBvcHRzLmNvbmZpZyhtZW51LCBtb2R1bGVDb25maWcpIDogbnVsbDtcbiAgICB9LFxuICAgIHJ1bihtZW51OiBNZW51SGVscGVyKSB7XG4gICAgICByZXR1cm4gb3B0cy5ydW4gPyBvcHRzLnJ1bihtZW51LCBtb2R1bGVDb25maWcpIDogbnVsbDtcbiAgICB9LFxuICAgIHJvdXRlczogb3B0cy5yb3V0ZXNcbiAgfSBhcyBJTW9kdWxlSW5pdGlhbGl6ZXJXcmFwcGVyXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBJbml0TW9kdWxlKG1vZHVsZTogeyBkZWZhdWx0OiBJTW9kdWxlSW5pdGlhbGl6ZXJXcmFwcGVyIH0sIGNvbmZpZ3VyYXRpb246IGFueSB8IHVuZGVmaW5lZCk6IFByb21pc2U8SU1vZHVsZUluaXRpYWxpemVyPiB7XG4gIGNvbnN0IGluaXRvYmogPSAoKG1vZHVsZS5kZWZhdWx0IGFzIGFueSkuZGVmYXVsdCB8fCBtb2R1bGUuZGVmYXVsdCkgYXMgSU1vZHVsZUluaXRpYWxpemVyV3JhcHBlcjtcbiAgcmV0dXJuIGluaXRvYmouaW5pdChNZW51SGVscGVyLkluc3RhbmNlLCBjb25maWd1cmF0aW9uIHx8IHt9LFxuICAgIHtcbiAgICAgIHJlZ2lzdHJ5OiBDb21tb25SZWdpc3RyeS5JbnN0YW5jZSxcbiAgICAgIG1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZS5JbnN0YW5jZSxcbiAgICAgIHByb2plY3RvcjogUHJvamVjdG9yLkluc3RhbmNlLFxuICAgICAgc2NyZWVuczogU2NyZWVuc01hbmFnZXIuSW5zdGFuY2VcbiAgICB9KS50aGVuKCgpID0+IHtcbiAgICAgIHJldHVybiBpbml0b2JqIGFzIHVua25vd24gYXMgSU1vZHVsZUluaXRpYWxpemVyO1xuICAgIH0pO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gQ29uZmlnTW9kdWxlKG1vZHVsZTogYW55KTogUHJvbWlzZTx2b2lkPiB7XG4gIGNvbnN0IGluaXRvYmogPSAobW9kdWxlLmRlZmF1bHQuZGVmYXVsdCB8fCBtb2R1bGUuZGVmYXVsdCkgYXMgSU1vZHVsZUluaXRpYWxpemVyV3JhcHBlcjtcbiAgcmV0dXJuIGluaXRvYmouY29uZmlnKE1lbnVIZWxwZXIuSW5zdGFuY2UpO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBSdW5Nb2R1bGUobW9kdWxlOiBhbnkpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgaW5pdG9iaiA9IChtb2R1bGUuZGVmYXVsdC5kZWZhdWx0IHx8IG1vZHVsZS5kZWZhdWx0KSBhcyBJTW9kdWxlSW5pdGlhbGl6ZXJXcmFwcGVyO1xuICByZXR1cm4gaW5pdG9iai5ydW4oTWVudUhlbHBlci5JbnN0YW5jZSk7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBNb2R1bGVSb3V0ZXMobW9kdWxlOiBhbnkpOiBSb3V0ZVJlY29yZFJhd1tdIHtcbiAgY29uc3QgaW5pdG9iaiA9IChtb2R1bGUuZGVmYXVsdC5kZWZhdWx0IHx8IG1vZHVsZS5kZWZhdWx0KSBhcyBJTW9kdWxlSW5pdGlhbGl6ZXJXcmFwcGVyO1xuICByZXR1cm4gaW5pdG9iai5yb3V0ZXM7XG59XG5cblxuZXhwb3J0IHtcbiAgTWVudUhlbHBlcixcbiAgdHlwZSBJTWVudURlZmluaXRpb24sXG4gIG1lbnVUeXBlLFxuICBDb21tb25SZWdpc3RyeSxcbiAgTWVzc2FnZVNlcnZpY2UsXG4gIGluamVjdCxcbiAgc2NyZWVuLFxuICBWYWxpZGF0ZURpcmVjdGl2ZSxcbiAgdHlwZSBQcm9qZWN0YWJsZSxcbiAgdHlwZSBJUHJvamVjdGFibGVNb2RlbCxcbiAgTWVudU5vdGlmaWNhdGlvbnMsXG4gIFByb2plY3Rvcixcbn1cblxuY29uc3QgVnVlTWZNb2R1bGUgPSB7XG4gIGluc3RhbGwsXG4gIE1lbnVIZWxwZXI6IG5ldyBNZW51SGVscGVyKCksXG4gIG1lbnVUeXBlLFxuICBDb21tb25SZWdpc3RyeTogbmV3IENvbW1vblJlZ2lzdHJ5KCksXG4gIE1lc3NhZ2VTZXJ2aWNlOiBNZXNzYWdlU2VydmljZSxcbiAgaW5qZWN0LFxuICBzY3JlZW4sXG4gIFZhbGlkYXRlRGlyZWN0aXZlLFxuICBNZW51Tm90aWZpY2F0aW9ucyxcbiAgUHJvamVjdG9yXG59XG5cbmV4cG9ydCBkZWZhdWx0IFZ1ZU1mTW9kdWxlOyJdLCJuYW1lcyI6WyJFIiwibmFtZSIsImNhbGxiYWNrIiwiY3R4IiwiZSIsInNlbGYiLCJsaXN0ZW5lciIsImRhdGEiLCJldnRBcnIiLCJsZW4iLCJldnRzIiwibGl2ZUV2ZW50cyIsImkiLCJ0aW55RW1pdHRlck1vZHVsZSIsIlRpbnlFbWl0dGVyIiwibWVudVR5cGUiLCJNZW51Tm90aWZpY2F0aW9ucyIsIl9NZW51SGVscGVyIiwiX19wdWJsaWNGaWVsZCIsIm1lbnVEZWZpbml0aW9uIiwicG9zaXRpb25zIiwiZm91bmQiLCJtIiwiZWxlbWVudCIsInNlY3Rpb24iLCJwYXJlbnQiLCJyZXN1bHQiLCJwIiwiY3VycmVudHBhcmVudCIsInIiLCJpbmRleCIsIm1lbnUiLCJ1c2VkIiwia2V5IiwicnIiLCJhIiwiYiIsIk1lbnVIZWxwZXIiLCJfQ29tbW9uUmVnaXN0cnkiLCJ2IiwiY29tcG9uZW50IiwiZ3JvdXAiLCJnZyIsImciLCJzZXJ2aWNlIiwiQ29tbW9uUmVnaXN0cnkiLCJfTWVzc2FnZVNlcnZpY2UiLCJtZXNzYWdlIiwiYXJncyIsInJlc29sdmUiLCJyZWplY3QiLCJNZXNzYWdlU2VydmljZSIsIl9zZmNfbWFpbiQxIiwiZGVmaW5lQ29tcG9uZW50IiwicHJvcHMiLCJlbWl0IiwiVmFsdWUiLCJjb21wdXRlZCIsIkNvbXBvbmVudHMiLCJjbGljayIsInNhdmUiLCJfUHJvamVjdG9yIiwic2NyZWVuIiwicXVldWUiLCJhc3luYyIsIm1vZGVsIiwicHJvbWlzZSIsInNzIiwiX3NjcmVlbiIsInMiLCJQcm9qZWN0b3IiLCJfc2ZjX21haW4iLCJleHBvc2UiLCJtZSIsImdldEN1cnJlbnRJbnN0YW5jZSIsImN1cnJlbnRWaWV3IiwicmVmIiwiaXNWaXNpYmxlIiwiY3VycmVudFZpZXdVSUQiLCJfYSIsIm9uTW91bnRlZCIsInByb2plY3RUb0RpcmVjdGl2ZSIsImVsIiwiYmluZCIsIlNjcmVlbnNNYW5hZ2VyIiwic2NyZWVuRGlyZWN0aXZlIiwiYmluZGluZyIsImRpcmVjdGl2ZXMiLCJfU2NyZWVuc01hbmFnZXIiLCJkb21FbGVtZW50IiwiY2hlY2tJbnB1dFZhbGlkYXRpb24iLCJjYWxsb3V0IiwiZXJyb3JzIiwidmFsaWRhdGUiLCJhcmciLCJpbnN0YWxsIiwiVnVlIiwiaW5qZWN0IiwiVmFsaWRhdGVEaXJlY3RpdmUiLCJNb2R1bGVJbml0aWFsaXplciIsIm9wdHMiLCJtb2R1bGVDb25maWciLCJjb25maWd1cmF0aW9uIiwib3B0aW9ucyIsIlZ1ZU1mTW9kdWxlIiwiSW5pdE1vZHVsZSIsIm1vZHVsZSIsImluaXRvYmoiLCJDb25maWdNb2R1bGUiLCJSdW5Nb2R1bGUiLCJNb2R1bGVSb3V0ZXMiXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsU0FBU0EsSUFBSztBQUdkO0FBRUFBLEVBQUUsWUFBWTtBQUFBLEVBQ1osSUFBSSxTQUFVQyxHQUFNQyxHQUFVQyxHQUFLO0FBQ2pDLFFBQUlDLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFBO0FBRTVCLFlBQUNBLEVBQUVILENBQUksTUFBTUcsRUFBRUgsQ0FBSSxJQUFJLENBQUEsSUFBSyxLQUFLO0FBQUEsTUFDL0IsSUFBSUM7QUFBQSxNQUNKLEtBQUtDO0FBQUEsSUFDWCxDQUFLLEdBRU07QUFBQSxFQUNSO0FBQUEsRUFFRCxNQUFNLFNBQVVGLEdBQU1DLEdBQVVDLEdBQUs7QUFDbkMsUUFBSUUsSUFBTztBQUNYLGFBQVNDLElBQVk7QUFDbkIsTUFBQUQsRUFBSyxJQUFJSixHQUFNSyxDQUFRLEdBQ3ZCSixFQUFTLE1BQU1DLEdBQUssU0FBUztBQUFBLElBRW5DO0FBQ0ksV0FBQUcsRUFBUyxJQUFJSixHQUNOLEtBQUssR0FBR0QsR0FBTUssR0FBVUgsQ0FBRztBQUFBLEVBQ25DO0FBQUEsRUFFRCxNQUFNLFNBQVVGLEdBQU07QUFDcEIsUUFBSU0sSUFBTyxDQUFBLEVBQUcsTUFBTSxLQUFLLFdBQVcsQ0FBQyxHQUNqQ0MsTUFBVyxLQUFLLE1BQU0sS0FBSyxJQUFJLENBQUEsSUFBS1AsQ0FBSSxLQUFLLENBQUUsR0FBRSxNQUFLLEdBQ3RELElBQUksR0FDSlEsSUFBTUQsRUFBTztBQUVqQixTQUFLLEdBQUcsSUFBSUMsR0FBSztBQUNmLE1BQUFELEVBQU8sQ0FBQyxFQUFFLEdBQUcsTUFBTUEsRUFBTyxDQUFDLEVBQUUsS0FBS0QsQ0FBSTtBQUd4QyxXQUFPO0FBQUEsRUFDUjtBQUFBLEVBRUQsS0FBSyxTQUFVTixHQUFNQyxHQUFVO0FBQzdCLFFBQUlFLElBQUksS0FBSyxNQUFNLEtBQUssSUFBSSxDQUFBLElBQ3hCTSxJQUFPTixFQUFFSCxDQUFJLEdBQ2JVLElBQWEsQ0FBQTtBQUVqQixRQUFJRCxLQUFRUjtBQUNWLGVBQVNVLElBQUksR0FBR0gsSUFBTUMsRUFBSyxRQUFRRSxJQUFJSCxHQUFLRztBQUMxQyxRQUFJRixFQUFLRSxDQUFDLEVBQUUsT0FBT1YsS0