bc-deeplib 1.2.0 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/deeplib.js CHANGED
@@ -28,7 +28,7 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
28
28
  // node_modules/.pnpm/bondage-club-mod-sdk@1.2.0/node_modules/bondage-club-mod-sdk/dist/bcmodsdk.js
29
29
  var require_bcmodsdk = __commonJS({
30
30
  "node_modules/.pnpm/bondage-club-mod-sdk@1.2.0/node_modules/bondage-club-mod-sdk/dist/bcmodsdk.js"(exports) {
31
- var bcModSdk = function() {
31
+ var bcModSdk = (function() {
32
32
  "use strict";
33
33
  const o = "1.2.0";
34
34
  function e(o2) {
@@ -44,7 +44,7 @@ var require_bcmodsdk = __commonJS({
44
44
  __name(n, "n");
45
45
  function r(o2) {
46
46
  const e2 = /* @__PURE__ */ new Set();
47
- return o2.filter((o3) => !e2.has(o3) && e2.add(o3));
47
+ return o2.filter(((o3) => !e2.has(o3) && e2.add(o3)));
48
48
  }
49
49
  __name(r, "r");
50
50
  const i = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Set();
@@ -67,13 +67,13 @@ Patch2:
67
67
  ${a2}`), t2.set(e3, a2), n2.add(r3.name);
68
68
  }
69
69
  }
70
- e2.sort((o3, e3) => e3.priority - o3.priority);
71
- const r2 = function(o3, e3) {
70
+ e2.sort(((o3, e3) => e3.priority - o3.priority));
71
+ const r2 = (function(o3, e3) {
72
72
  if (0 === e3.size) return o3;
73
73
  let t3 = o3.toString().replaceAll("\r\n", "\n");
74
74
  for (const [n3, r3] of e3.entries()) t3.includes(n3) || c(`ModSDK: Patching ${o3.name}: Patch ${n3} not applied`), t3 = t3.replaceAll(n3, r3);
75
75
  return (0, eval)(`(${t3})`);
76
- }(o2.original, t2);
76
+ })(o2.original, t2);
77
77
  let i2 = /* @__PURE__ */ __name(function(e3) {
78
78
  var t3, i3;
79
79
  const a2 = null === (i3 = (t3 = m.errorReporterHooks).hookChainExit) || void 0 === i3 ? void 0 : i3.call(t3, o2.name, n2), c2 = r2.apply(this, e3);
@@ -102,7 +102,7 @@ ${a2}`), t2.set(e3, a2), n2.add(r3.name);
102
102
  for (let t2 = 0; t2 < a2.length - 1; t2++) if (e3 = e3[a2[t2]], !n(e3)) throw new Error(`ModSDK: Function ${o2} to be patched not found; ${a2.slice(0, t2 + 1).join(".")} is not object`);
103
103
  const c2 = e3[a2[a2.length - 1]];
104
104
  if ("function" != typeof c2) throw new Error(`ModSDK: Function ${o2} to be patched not found`);
105
- const l2 = function(o3) {
105
+ const l2 = (function(o3) {
106
106
  let e4 = -1;
107
107
  for (const n2 of t.encode(o3)) {
108
108
  let o4 = 255 & (e4 ^ n2);
@@ -110,13 +110,13 @@ ${a2}`), t2.set(e3, a2), n2.add(r3.name);
110
110
  e4 = e4 >>> 8 ^ o4;
111
111
  }
112
112
  return ((-1 ^ e4) >>> 0).toString(16).padStart(8, "0").toUpperCase();
113
- }(c2.toString().replaceAll("\r\n", "\n")), d2 = { name: o2, original: c2, originalHash: l2 };
113
+ })(c2.toString().replaceAll("\r\n", "\n")), d2 = { name: o2, original: c2, originalHash: l2 };
114
114
  r2 = Object.assign(Object.assign({}, d2), { precomputed: s(d2), router: /* @__PURE__ */ __name(() => {
115
- }, "router"), context: e3, contextProperty: a2[a2.length - 1] }), r2.router = /* @__PURE__ */ function(o3) {
115
+ }, "router"), context: e3, contextProperty: a2[a2.length - 1] }), r2.router = /* @__PURE__ */ (function(o3) {
116
116
  return function(...e4) {
117
117
  return o3.precomputed.enter.apply(this, [e4]);
118
118
  };
119
- }(r2), i.set(o2, r2), e3[r2.contextProperty] = r2.router;
119
+ })(r2), i.set(o2, r2), e3[r2.contextProperty] = r2.router;
120
120
  }
121
121
  return r2;
122
122
  }
@@ -127,7 +127,7 @@ ${a2}`), t2.set(e3, a2), n2.add(r3.name);
127
127
  __name(d, "d");
128
128
  function p() {
129
129
  const o2 = /* @__PURE__ */ new Map();
130
- for (const [e2, t2] of i) o2.set(e2, { name: e2, original: t2.original, originalHash: t2.originalHash, sdkEntrypoint: t2.router, currentEntrypoint: t2.context[t2.contextProperty], hookedByMods: r(t2.precomputed.hooks.map((o3) => o3.mod)), patchedByMods: Array.from(t2.precomputed.patchesSources) });
130
+ for (const [e2, t2] of i) o2.set(e2, { name: e2, original: t2.original, originalHash: t2.originalHash, sdkEntrypoint: t2.router, currentEntrypoint: t2.context[t2.contextProperty], hookedByMods: r(t2.precomputed.hooks.map(((o3) => o3.mod))), patchedByMods: Array.from(t2.precomputed.patchesSources) });
131
131
  return o2;
132
132
  }
133
133
  __name(p, "p");
@@ -152,7 +152,7 @@ Was the mod loaded multiple times?`), u(a2));
152
152
  g2.loaded || e(`Mod ${r2} attempted to call SDK function after being unloaded`);
153
153
  const s3 = t3(...n2);
154
154
  return null == c3 || c3(), s3;
155
- }, "s"), p2 = { unload: s2("unload", () => u(g2)), hookFunction: s2("hookFunction", (o3, t3, n2) => {
155
+ }, "s"), p2 = { unload: s2("unload", (() => u(g2))), hookFunction: s2("hookFunction", ((o3, t3, n2) => {
156
156
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to patch a function: Expected function name string, got ${typeof o3}`);
157
157
  const i3 = l(o3), a3 = c2(i3);
158
158
  "number" != typeof t3 && e(`Mod ${r2} failed to hook function '${o3}': Expected priority number, got ${typeof t3}`), "function" != typeof n2 && e(`Mod ${r2} failed to hook function '${o3}': Expected hook function, got ${typeof n2}`);
@@ -161,24 +161,24 @@ Was the mod loaded multiple times?`), u(a2));
161
161
  const o4 = a3.hooks.indexOf(s3);
162
162
  o4 >= 0 && (a3.hooks.splice(o4, 1), d());
163
163
  };
164
- }), patchFunction: s2("patchFunction", (o3, t3) => {
164
+ })), patchFunction: s2("patchFunction", ((o3, t3) => {
165
165
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to patch a function: Expected function name string, got ${typeof o3}`);
166
166
  const i3 = l(o3), a3 = c2(i3);
167
167
  n(t3) || e(`Mod ${r2} failed to patch function '${o3}': Expected patches object, got ${typeof t3}`);
168
168
  for (const [n2, i4] of Object.entries(t3)) "string" == typeof i4 ? a3.patches.set(n2, i4) : null === i4 ? a3.patches.delete(n2) : e(`Mod ${r2} failed to patch function '${o3}': Invalid format of patch '${n2}'`);
169
169
  d();
170
- }), removePatches: s2("removePatches", (o3) => {
170
+ })), removePatches: s2("removePatches", ((o3) => {
171
171
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to patch a function: Expected function name string, got ${typeof o3}`);
172
172
  const t3 = l(o3);
173
173
  c2(t3).patches.clear(), d();
174
- }), callOriginal: s2("callOriginal", (o3, t3, n2) => {
174
+ })), callOriginal: s2("callOriginal", ((o3, t3, n2) => {
175
175
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to call a function: Expected function name string, got ${typeof o3}`);
176
176
  const i3 = l(o3);
177
177
  return Array.isArray(t3) || e(`Mod ${r2} failed to call a function: Expected args array, got ${typeof t3}`), i3.original.apply(null != n2 ? n2 : globalThis, t3);
178
- }), getOriginalHash: s2("getOriginalHash", (o3) => {
178
+ })), getOriginalHash: s2("getOriginalHash", ((o3) => {
179
179
  "string" == typeof o3 && o3 || e(`Mod ${r2} failed to get hash: Expected function name string, got ${typeof o3}`);
180
180
  return l(o3).originalHash;
181
- }) }, g2 = { name: o2.name, fullName: o2.fullName, version: o2.version, repository: o2.repository, allowReplace: i2, api: p2, loaded: true, patching: /* @__PURE__ */ new Map() };
181
+ })) }, g2 = { name: o2.name, fullName: o2.fullName, version: o2.version, repository: o2.repository, allowReplace: i2, api: p2, loaded: true, patching: /* @__PURE__ */ new Map() };
182
182
  return f.set(o2.name, g2), Object.freeze(p2);
183
183
  }
184
184
  __name(g, "g");
@@ -189,13 +189,13 @@ Was the mod loaded multiple times?`), u(a2));
189
189
  }
190
190
  __name(h, "h");
191
191
  let m;
192
- const y = void 0 === window.bcModSdk ? window.bcModSdk = function() {
192
+ const y = void 0 === window.bcModSdk ? window.bcModSdk = (function() {
193
193
  const e2 = { version: o, apiVersion: 1, registerMod: g, getModsInfo: h, getPatchingInfo: p, errorReporterHooks: Object.seal({ apiEndpointEnter: null, hookEnter: null, hookChainExit: null }) };
194
194
  return m = e2, Object.freeze(e2);
195
- }() : (n(window.bcModSdk) || e("Failed to init Mod SDK: Name already in use"), 1 !== window.bcModSdk.apiVersion && e(`Failed to init Mod SDK: Different version already loaded ('1.2.0' vs '${window.bcModSdk.version}')`), window.bcModSdk.version !== o && alert(`Mod SDK warning: Loading different but compatible versions ('1.2.0' vs '${window.bcModSdk.version}')
195
+ })() : (n(window.bcModSdk) || e("Failed to init Mod SDK: Name already in use"), 1 !== window.bcModSdk.apiVersion && e(`Failed to init Mod SDK: Different version already loaded ('1.2.0' vs '${window.bcModSdk.version}')`), window.bcModSdk.version !== o && alert(`Mod SDK warning: Loading different but compatible versions ('1.2.0' vs '${window.bcModSdk.version}')
196
196
  One of mods you are using is using an old version of SDK. It will work for now but please inform author to update`), window.bcModSdk);
197
197
  return "undefined" != typeof exports && (Object.defineProperty(exports, "__esModule", { value: true }), exports.default = y), y;
198
- }();
198
+ })();
199
199
  }
200
200
  });
201
201
 
@@ -297,12 +297,13 @@ var BaseModule = class {
297
297
  };
298
298
 
299
299
  // src/base/base_subscreen.ts
300
- function setSubscreen(subscreen) {
300
+ async function setSubscreen(subscreen) {
301
301
  if (!GUI.instance) {
302
302
  throw new Error("Attempt to set subscreen before init");
303
303
  }
304
- GUI.instance.currentSubscreen = subscreen;
305
- return GUI.instance.currentSubscreen;
304
+ const screenName = typeof subscreen === "string" ? subscreen : subscreen?.options.name;
305
+ const screenId = `${BaseSubscreen.id}_${screenName}`;
306
+ await CommonSetScreen(...["DeepLibMod", `${screenId}`]);
306
307
  }
307
308
  __name(setSubscreen, "setSubscreen");
308
309
  var BaseSubscreen = class _BaseSubscreen {
@@ -317,28 +318,36 @@ var BaseSubscreen = class _BaseSubscreen {
317
318
  options;
318
319
  /** Reference to the module this subscreen belongs to. */
319
320
  module;
320
- constructor(subscreenOptions, module) {
321
+ /** Identifier for internal use to avoid screen name collisions. */
322
+ static id = CommonGenerateUniqueID();
323
+ /** Optional configuration flags for a BaseSubscreen instance. */
324
+ static subscreenOptions = {
325
+ drawCharacter: true,
326
+ name: "UNKNOWN",
327
+ icon: "",
328
+ background: "Sheet"
329
+ };
330
+ constructor(module) {
321
331
  if (module) this.module = module;
322
- this.options = subscreenOptions || {};
323
- }
324
- /**
325
- * Logical name of this subscreen.
326
- * Used for localization key resolution in `load()`.
327
- * Subclasses should override this with a meaningful identifier.
328
- */
329
- get name() {
330
- return "UNKNOWN";
331
- }
332
- /**
333
- * Path to or Base64 data for an icon representing this subscreen.
334
- * Defaults to empty string (no icon).
335
- */
336
- get icon() {
337
- return "";
332
+ const ctor = this.constructor;
333
+ this.options = {
334
+ ..._BaseSubscreen.subscreenOptions,
335
+ ...ctor.subscreenOptions
336
+ };
337
+ const screenName = this.options.name;
338
+ const screenId = `${_BaseSubscreen.id}_${screenName}`;
339
+ exportToGlobal(`${screenId}Load`, this.load.bind(this));
340
+ exportToGlobal(`${screenId}Run`, this.run.bind(this));
341
+ exportToGlobal(`${screenId}Click`, this.click.bind(this));
342
+ exportToGlobal(`${screenId}Exit`, this.exit.bind(this));
343
+ exportToGlobal(`${screenId}Unload`, this.unload.bind(this));
344
+ exportToGlobal(`${screenId}Resize`, this.resize.bind(this));
345
+ exportToGlobal(`${screenId}Background`, this.options.background);
346
+ CommonCSVCache[ScreenFileGetTranslation("DeepLibMod", screenId)] = [];
338
347
  }
339
348
  /** Changes the currently active subscreen. */
340
- setSubscreen(screen) {
341
- return setSubscreen(screen);
349
+ async setSubscreen(screen) {
350
+ return await setSubscreen(screen);
342
351
  }
343
352
  /** Gets this subscreen's settings object from its parent module. */
344
353
  get settings() {
@@ -413,8 +422,8 @@ var BaseSubscreen = class _BaseSubscreen {
413
422
  if (!module.settings || !Object.keys(module.settings).length) module.registerDefaultSettings();
414
423
  }
415
424
  _BaseSubscreen.currentPage = 1;
416
- layout.createSubscreen();
417
- const settingsElement = layout.createSettingsDiv();
425
+ layout.getSubscreen();
426
+ const settingsElement = layout.getSettingsDiv();
418
427
  layout.appendToSubscreen(settingsElement);
419
428
  const menu = ElementMenu.Create("deeplib-nav-menu", []);
420
429
  layout.appendToSubscreen(menu);
@@ -429,12 +438,36 @@ var BaseSubscreen = class _BaseSubscreen {
429
438
  });
430
439
  ElementMenu.PrependItem(menu, backNext);
431
440
  }
441
+ if (this.options.help) {
442
+ const onClick = this.options.help.onClick;
443
+ let action = /* @__PURE__ */ __name(() => {
444
+ }, "action");
445
+ if (typeof onClick === "string" || onClick instanceof URL) {
446
+ action = /* @__PURE__ */ __name(() => window.open(onClick, "_blank"), "action");
447
+ } else if (typeof onClick === "function") {
448
+ action = onClick;
449
+ } else if (onClick instanceof _BaseSubscreen) {
450
+ action = /* @__PURE__ */ __name(async () => await this.setSubscreen(onClick), "action");
451
+ }
452
+ this.options.help.tooltip ??= getText("settings.button.help_button_hint");
453
+ this.options.help.icon ??= `${PUBLIC_URL}/dl_images/bookmark.svg`;
454
+ const helpButton = advElement.createButton({
455
+ id: "deeplib-help",
456
+ size: [90, 90],
457
+ onClick: action,
458
+ options: {
459
+ image: this.options.help.icon,
460
+ tooltip: this.options.help.tooltip
461
+ }
462
+ });
463
+ ElementMenu.AppendButton(menu, helpButton);
464
+ }
432
465
  const subscreenTitle = advElement.createLabel({
433
466
  id: "deeplib-subscreen-title",
434
- label: getText(`${this.name}.title`).replace("$ModVersion", ModSdkManager.ModInfo.version)
467
+ label: getText(`${this.options.name}.title`).replace("$ModVersion", ModSdkManager.ModInfo.version)
435
468
  });
436
469
  layout.appendToSubscreen(subscreenTitle);
437
- if (this.name !== "mainmenu") {
470
+ if (this.options.name !== "mainmenu") {
438
471
  const exitButton = advElement.createButton({
439
472
  id: "deeplib-exit",
440
473
  size: [90, 90],
@@ -499,21 +532,29 @@ var BaseSubscreen = class _BaseSubscreen {
499
532
  exit() {
500
533
  CharacterAppearanceForceUpCharacter = -1;
501
534
  CharacterLoadCanvas(Player);
502
- setSubscreen("mainmenu");
503
- modStorage.save();
535
+ const returnScreen = typeof this.options.returnScreen === "function" ? this.options.returnScreen() : this.options.returnScreen;
536
+ if (returnScreen instanceof _BaseSubscreen || !returnScreen) {
537
+ setSubscreen(returnScreen ?? "mainmenu").then(() => {
538
+ modStorage.save();
539
+ });
540
+ } else if (Array.isArray(returnScreen)) {
541
+ CommonSetScreen(...returnScreen).then(() => {
542
+ modStorage.save();
543
+ });
544
+ }
504
545
  }
505
546
  /**
506
547
  * Called when the window is resized.
507
548
  * Also checks for overflow in the settings div and applies styling accordingly.
508
549
  */
509
- resize(onLoad = false) {
550
+ resize(_onLoad = false) {
510
551
  const offset = this.options.drawCharacter ? 0 : 380;
511
552
  const subscreen = layout.getSubscreen();
512
553
  const settingsDiv = layout.getSettingsDiv();
513
554
  ElementSetPosition(subscreen || "", 0, 0);
514
555
  ElementSetSize(subscreen || "", 2e3, 1e3);
515
556
  ElementSetFontSize(subscreen || "", "auto");
516
- if (this.name === "mainmenu") {
557
+ if (this.options.name === "mainmenu") {
517
558
  ElementSetPosition(settingsDiv || "", 530 - offset, 170);
518
559
  ElementSetSize(settingsDiv || "", 600 + offset, 660);
519
560
  } else {
@@ -645,7 +686,6 @@ var styles_default = `.deeplib-subscreen,
645
686
  grid-auto-rows: min-content;
646
687
  padding: min(1dvh, 0.5dvw);
647
688
  gap: 0.3em;
648
- overflow-y: scroll;
649
689
  }
650
690
 
651
691
  .deeplib-misc {
@@ -665,6 +705,7 @@ var styles_default = `.deeplib-subscreen,
665
705
  padding: min(1vh, 0.5vw);
666
706
  font-size: 0.8em;
667
707
  border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);
708
+ z-index: 1;
668
709
  }
669
710
 
670
711
  .deeplib-overflow-box {
@@ -682,14 +723,14 @@ var styles_default = `.deeplib-subscreen,
682
723
  border-radius: min(1dvh, 0.5dvw);
683
724
  border: min(0.2vh, 0.1vw) solid var(--deeplib-border-color);
684
725
  }
685
- .deeplib-prev-next .deeplib-prev-next-button {
686
- height: 100%;
687
- aspect-ratio: 1;
688
- }
689
726
  .deeplib-prev-next .deeplib-prev-next-button:hover {
690
727
  background-color: var(--deeplib-element-hover-color);
691
728
  border-radius: var(--deeplib-border-radius);
692
729
  }
730
+ .deeplib-prev-next .deeplib-prev-next-button {
731
+ height: 100%;
732
+ aspect-ratio: 1;
733
+ }
693
734
  .deeplib-prev-next .deeplib-prev-next-label {
694
735
  white-space: nowrap;
695
736
  }
@@ -874,7 +915,7 @@ input[type=number] {
874
915
  height: 100dvh;
875
916
  background-color: rgba(0, 0, 0, 0.5);
876
917
  }
877
- /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9CQy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBTUU7RUFDQTs7QUFOQTtFQUNFO0VBQ0E7O0FBT0o7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQzdERjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUM3QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIuZGVlcGxpYi1zdWJzY3JlZW4sXG4uZGVlcGxpYi1tb2RhbCB7XG4gIC0tZGVlcGxpYi1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10bWQtbWFpbiwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQsIHdoaXRlKTtcbiAgLS1kZWVwbGliLWVsZW1lbnQtaG92ZXItY29sb3I6IHZhcigtLXRtZC1lbGVtZW50LWhvdmVyLCBjeWFuKTtcbiAgLS1kZWVwbGliLWFjY2VudC1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgI0ZGRkY4OCk7XG4gIC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yOiB2YXIoLS10bWQtYmxvY2tlZCwgcmVkKTtcbiAgLS1kZWVwbGliLXRleHQtY29sb3I6IHZhcigtLXRtZC10ZXh0LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LWhvdmVyLCBibGFjayk7XG4gIC0tZGVlcGxpYi1ib3JkZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMnZoLCAwLjF2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItd2lkdGg6IG1pbigwLjJkdmgsIDAuMWR2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbn1cbiIsIi5kZWVwbGliLWJ1dHRvbiB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmcsXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmc6OmJlZm9yZSB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMCU7XG4gIGxlZnQ6IDAlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWljb24tY29sb3IpO1xuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IG11bHRpcGx5O1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIG1hc2stcG9zaXRpb246IGxlZnQ7XG4gIG1hc2stc2l6ZTogY29udGFpbjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWltYWdlKTtcbiAgbWFzay1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItYnV0dG9uOmhvdmVyIGltZyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1ob3Zlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiAuYnV0dG9uLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGZvbnQtc2l6ZTogbWluKDMuNmR2aCwgMS44ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tdG9vbHRpcCB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG4iLCIjZGVlcGxpYi1wYWdlLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbiNkZWVwbGliLXN1YnNjcmVlbi10aXRsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4uZGVlcGxpYi10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbn1cblxuLmRlZXBsaWItc2V0dGluZ3Mge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gIHBhZGRpbmc6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGdhcDogMC4zZW07XG4gIG92ZXJmbG93LXk6IHNjcm9sbDtcbn1cblxuLmRlZXBsaWItbWlzYyB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW4tcmV2ZXJzZTtcbiAgZ2FwOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLXRvb2x0aXAge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIHBhZGRpbmc6IG1pbigxdmgsIDAuNXZ3KTtcbiAgZm9udC1zaXplOiAwLjhlbTtcbiAgYm9yZGVyOiBtaW4oMC4ydmgsIDAuMXZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLW92ZXJmbG93LWJveCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLXdpZHRoKTtcbn1cblxuLmRlZXBsaWItcHJldi1uZXh0IHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBzcGFjZS1iZXR3ZWVuO1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuXG4gIC5kZWVwbGliLXByZXYtbmV4dC1idXR0b24ge1xuICAgICY6aG92ZXIge1xuICAgICAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWhvdmVyLWNvbG9yKTtcbiAgICAgIGJvcmRlci1yYWRpdXM6IHZhcigtLWRlZXBsaWItYm9yZGVyLXJhZGl1cyk7XG4gICAgfVxuICAgIFxuICAgIGhlaWdodDogMTAwJTtcbiAgICBhc3BlY3QtcmF0aW86IDE7XG4gIH1cblxuICAuZGVlcGxpYi1wcmV2LW5leHQtbGFiZWwge1xuICAgIHdoaXRlLXNwYWNlOiBub3dyYXA7XG4gIH1cbn1cblxuI2RlZXBsaWItbmF2LW1lbnUge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBnYXA6IG1pbigyZHZoLCAxZHZ3KTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1tZXRlciB7XG4gIHBvc2l0aW9uOiBhYnNvbHV0ZTtcbiAgdG9wOiAwcHg7XG4gIGxlZnQ6IDBweDtcbiAgd2lkdGg6IDEwMCU7XG4gIGhlaWdodDogMTAwJTtcbiAgb3ZlcmZsb3c6IGhpZGRlbjtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyOiB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCkgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICB6LWluZGV4OiAtMTtcbn1cblxuI2RlZXBsaWItc3RvcmFnZS1iYXIge1xuICBoZWlnaHQ6IDEwMCU7XG4gIHdpZHRoOiAwJTtcbiAgYmFja2dyb3VuZDogdmFyKC0tZGVlcGxpYi1hY2NlbnQtY29sb3IpO1xufVxuIiwiLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXQge1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuLmRlZXBsaWItY2hlY2tib3gtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNoZWNrYm94XCJdOmNoZWNrZWQ6OmJlZm9yZSB7XG4gIHdpZHRoOiA4MCU7XG4gIGhlaWdodDogODAlO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIge1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBnYXA6IDAuM2VtO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXI6aGFzKGxhYmVsLmRlZXBsaWItdGV4dCkge1xuICBtYXJnaW4tdG9wOiBtaW4oMXZoLCAwLjV2dyk7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0IHtcbiAgZm9udC1zaXplOiAwLjZlbTtcbiAgcGFkZGluZzogNXB4IDA7XG4gIGJhY2tncm91bmQtY29sb3I6IHRyYW5zcGFyZW50O1xuICBvdXRsaW5lOiBub25lO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigxdmgsIDAuNXZ3KTtcbiAgcGFkZGluZy1yaWdodDogbWluKDF2aCwgMC41dncpO1xuICBtaW4taGVpZ2h0OiBtaW4oNWR2aCwgMi41ZHZ3KTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMGR2aCwgMC41ZHZ3KTtcbn1cblxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dFt0eXBlPVwiY29sb3JcIl0ge1xuICBwYWRkaW5nOiAwcHg7XG4gIHdpZHRoOiBtaW4oNXZoLCAyLjV2dyk7XG4gIGhlaWdodDogbWluKDV2aCwgMi41dncpO1xuICBib3JkZXItcmFkaXVzOiAwcHg7XG59XG5cbi5kZWVwbGliLWlucHV0LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjb2xvclwiXTpkaXNhYmxlZCB7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG4gIGN1cnNvcjogbm90LWFsbG93ZWQ7XG59XG5cbmlucHV0Ojotd2Via2l0LW91dGVyLXNwaW4tYnV0dG9uLFxuaW5wdXQ6Oi13ZWJraXQtaW5uZXItc3Bpbi1idXR0b24ge1xuICAtd2Via2l0LWFwcGVhcmFuY2U6IG5vbmU7XG4gIG1hcmdpbjogMDtcbn1cblxuaW5wdXRbdHlwZT1udW1iZXJdIHtcbiAgYXBwZWFyYW5jZTogdGV4dGZpZWxkO1xuICAtbW96LWFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbn1cbiIsIi5kZWVwbGliLWhpZ2hsaWdodC10ZXh0IHtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiByZ2IoMjAzLCAxODUsIDIzKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsnXSBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlLFxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsyJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGJvcmRlcjogbWluKDAuMmR2aCwgMC4xZHZ3KSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci1jb2xvcik7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiAjZWVlO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgIzQ0MDE3MTtcbiAgY29sb3I6ICMxMTE7XG4gIHBhZGRpbmctbGVmdDogbWluKDAuNmR2aCwgMC4zZHZ3KTtcbiAgZGlzcGxheTogYmxvY2s7XG4gIHdoaXRlLXNwYWNlOiBub3JtYWw7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhLFxuI1RleHRBcmVhQ2hhdExvZ1tkYXRhLWNvbG9ydGhlbWU9J2RhcmsyJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhIHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2cgZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSBhIHtcbiAgY3Vyc29yOiBwb2ludGVyO1xuICBmb250LXdlaWdodDogYm9sZDtcbiAgY29sb3I6ICMxMTE7XG59XG4iLCIuZGVlcGxpYi1tb2RhbCB7XG4gIHBvc2l0aW9uOiBmaXhlZDtcbiAgdG9wOiAxMCU7XG4gIGxlZnQ6IDUwJTtcbiAgdHJhbnNmb3JtOiB0cmFuc2xhdGVYKC01MCUpO1xuICB6LWluZGV4OiAxMDAxO1xuICBkaXNwbGF5OiBmbGV4O1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uO1xuICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjVlbTtcbiAgd2lkdGg6IG1heCg1MGR2dywgMjVkdmgpO1xuICBmb250LXNpemU6IG1pbig0ZHZoLCAyZHZ3KTtcbiAgcGFkZGluZzogbWluKDJkdmgsIDFkdncpO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4yZHZoLCAwLjZkdncpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcblxuICAuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgd2lkdGg6IDEwMCU7XG4gICAgZm9udC1zaXplOiBtaW4oMi42ZHZoLCAxLjhkdncpO1xuICAgIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gICAgcGFkZGluZzogbWluKDFkdmgsIDAuNWR2dyk7XG4gIH1cblxuICBpbnB1dC5kZWVwbGliLW1vZGFsLWlucHV0IHtcbiAgICBtYXgtd2lkdGg6IG1heCg1MGR2aCwgMjVkdncpO1xuICB9XG5cbiAgLmRlZXBsaWItbW9kYWwtYnV0dG9uLWNvbnRhaW5lciB7XG4gICAgZGlzcGxheTogZmxleDtcbiAgICBmbGV4LWRpcmVjdGlvbjogcm93O1xuICAgIGp1c3RpZnktY29udGVudDogZmxleC1lbmQ7XG4gICAgZ2FwOiAwLjVlbTtcbiAgICB3aWR0aDogMTAwJTtcblxuICAgIC5kZWVwbGliLWJ1dHRvbiB7XG4gICAgICBmb250LXNpemU6IDAuOGVtO1xuICAgICAgZGlzcGxheTogZmxleDtcbiAgICAgIHdpZHRoOiBhdXRvO1xuICAgICAgcGFkZGluZzogbWluKDAuNHZoLCAwLjJ2dykgbWluKDJ2aCwgMXZ3KTtcblxuICAgICAgLmJ1dHRvbi1sYWJlbCB7XG4gICAgICAgIGRpc3BsYXk6IGNvbnRlbnRzO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLXByb21wdC1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGNlbnRlcjtcbiAgICBhbGlnbi1pdGVtczogY2VudGVyO1xuICB9XG59XG5cbi5kZWVwbGliLW1vZGFsLWJsb2NrZXIge1xuICB6LWluZGV4OiAxMDAwO1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMDtcbiAgbGVmdDogMDtcbiAgd2lkdGg6IDEwMGR2dztcbiAgaGVpZ2h0OiAxMDBkdmg7XG4gIGJhY2tncm91bmQtY29sb3I6IHJnYmEoMCwgMCwgMCwgMC41KTtcbn1cbiJdfQ== */`;
918
+ /*# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VSb290IjoiL21lZGlhL05WTUUvU3R1ZmYvQ29kZS9CQy9CQy1EZWVwTGliL3NyYy9zdHlsZXMiLCJzb3VyY2VzIjpbInZhcnMuc2NzcyIsImJ1dHRvbnMuc2NzcyIsImVsZW1lbnRzLnNjc3MiLCJpbnB1dHMuc2NzcyIsIm1lc3NhZ2VzLnNjc3MiLCJtb2RhbC5zY3NzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FBQUE7RUFFRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTs7O0FDZEY7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBRUE7RUFDQTtFQUNBOzs7QUFHRjtFQUNFOzs7QUFHRjtFQUNFO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FDM0NGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUdFO0VBQ0U7RUFDQTs7QUFISjtFQU1FO0VBQ0E7O0FBR0Y7RUFDRTs7O0FBSUo7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUN6R0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7O0FBR0Y7RUFDRTs7O0FBR0Y7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFJRjtFQUNFO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBOzs7QUFHRjtFQUNFO0VBQ0E7OztBQzdERjtFQUNFO0VBQ0E7OztBQUdGO0FBQUE7RUFFRTtFQUNBO0VBQ0E7OztBQUdGO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOzs7QUFHRjtBQUFBO0VBRUU7OztBQUdGO0VBQ0U7RUFDQTtFQUNBOzs7QUM3QkY7RUFDRTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBOztBQUVBO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7O0FBR0Y7RUFDRTs7QUFHRjtFQUNFO0VBQ0E7RUFDQTtFQUNBO0VBQ0E7O0FBRUE7RUFDRTtFQUNBO0VBQ0E7RUFDQTs7QUFFQTtFQUNFOztBQUtOO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7OztBQUlKO0VBQ0U7RUFDQTtFQUNBO0VBQ0E7RUFDQTtFQUNBO0VBQ0EiLCJzb3VyY2VzQ29udGVudCI6WyIuZGVlcGxpYi1zdWJzY3JlZW4sXG4uZGVlcGxpYi1tb2RhbCB7XG4gIC0tZGVlcGxpYi1iYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS10bWQtbWFpbiwgd2hpdGUpO1xuICAtLWRlZXBsaWItZWxlbWVudC1jb2xvcjogdmFyKC0tdG1kLWVsZW1lbnQsIHdoaXRlKTtcbiAgLS1kZWVwbGliLWVsZW1lbnQtaG92ZXItY29sb3I6IHZhcigtLXRtZC1lbGVtZW50LWhvdmVyLCBjeWFuKTtcbiAgLS1kZWVwbGliLWFjY2VudC1jb2xvcjogdmFyKC0tdG1kLWFjY2VudCwgI0ZGRkY4OCk7XG4gIC0tZGVlcGxpYi1ibG9ja2VkLWNvbG9yOiB2YXIoLS10bWQtYmxvY2tlZCwgcmVkKTtcbiAgLS1kZWVwbGliLXRleHQtY29sb3I6IHZhcigtLXRtZC10ZXh0LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LCBibGFjayk7XG4gIC0tZGVlcGxpYi1pY29uLWhvdmVyLWNvbG9yOiB2YXIoLS10bWQtYWNjZW50LWhvdmVyLCBibGFjayk7XG4gIC0tZGVlcGxpYi1ib3JkZXItY29sb3I6IHZhcigtLXRtZC1hY2NlbnQsIGJsYWNrKTtcbiAgLS1kZWVwbGliLWJvcmRlci13aWR0aDogbWluKDAuMnZoLCAwLjF2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItd2lkdGg6IG1pbigwLjJkdmgsIDAuMWR2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMXZoLCAwLjV2dyk7XG4gIC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzOiBtaW4oMWR2aCwgMC41ZHZ3KTtcbn1cbiIsIi5kZWVwbGliLWJ1dHRvbiB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xufVxuXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmcsXG4uZGVlcGxpYi1idXR0b24uYnV0dG9uLXN0eWxpbmc6OmJlZm9yZSB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiBpbWcge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMCU7XG4gIGxlZnQ6IDAlO1xuICB3aWR0aDogMTAwJTtcbiAgaGVpZ2h0OiAxMDAlO1xuICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0O1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWljb24tY29sb3IpO1xuICBiYWNrZ3JvdW5kLWJsZW5kLW1vZGU6IG11bHRpcGx5O1xuICBiYWNrZ3JvdW5kLXNpemU6IGNvbnRhaW47XG4gIG1hc2stcG9zaXRpb246IGxlZnQ7XG4gIG1hc2stc2l6ZTogY29udGFpbjtcbiAgYmFja2dyb3VuZC1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgbWFzay1yZXBlYXQ6IG5vLXJlcGVhdDtcbiAgY29sb3I6IHRyYW5zcGFyZW50O1xuXG4gIGJhY2tncm91bmQtaW1hZ2U6IHZhcigtLWltYWdlKTtcbiAgbWFzay1pbWFnZTogdmFyKC0taW1hZ2UpO1xuICBwb2ludGVyLWV2ZW50czogbm9uZTtcbn1cblxuLmRlZXBsaWItYnV0dG9uOmhvdmVyIGltZyB7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItaWNvbi1ob3Zlci1jb2xvcik7XG59XG5cbi5kZWVwbGliLWJ1dHRvbiAuYnV0dG9uLWxhYmVsIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQgIWltcG9ydGFudDtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGZvbnQtc2l6ZTogbWluKDMuNmR2aCwgMS44ZHZ3KTtcbn1cblxuLmRlZXBsaWItYnV0dG9uIC5idXR0b24tdG9vbHRpcCB7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG4iLCIjZGVlcGxpYi1wYWdlLWxhYmVsIHtcbiAgZGlzcGxheTogZmxleDtcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG59XG5cbiNkZWVwbGliLXN1YnNjcmVlbi10aXRsZSB7XG4gIHRleHQtYWxpZ246IGxlZnQ7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4uZGVlcGxpYi10ZXh0IHtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiB7XG4gIHBhZGRpbmc6IDA7XG4gIG1hcmdpbjogMDtcbiAgcG9pbnRlci1ldmVudHM6IG5vbmU7XG59XG5cbi5kZWVwbGliLXN1YnNjcmVlbiAqIHtcbiAgYm94LXNpemluZzogYm9yZGVyLWJveDtcbiAgcG9pbnRlci1ldmVudHM6IGFsbDtcbn1cblxuLmRlZXBsaWItc2V0dGluZ3Mge1xuICBkaXNwbGF5OiBncmlkO1xuICBncmlkLWF1dG8tcm93czogbWluLWNvbnRlbnQ7XG4gIHBhZGRpbmc6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG4gIGdhcDogMC4zZW07XG59XG5cbi5kZWVwbGliLW1pc2Mge1xuICBkaXNwbGF5OiBmbGV4O1xuICBhbGlnbi1pdGVtczogY2VudGVyO1xuICBmbGV4LWRpcmVjdGlvbjogY29sdW1uLXJldmVyc2U7XG4gIGdhcDogbWluKDF2aCwgMC41dncpO1xufVxuXG4uZGVlcGxpYi10b29sdGlwIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogY2VudGVyO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICBwYWRkaW5nOiBtaW4oMXZoLCAwLjV2dyk7XG4gIGZvbnQtc2l6ZTogMC44ZW07XG4gIGJvcmRlcjogbWluKDAuMnZoLCAwLjF2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICB6LWluZGV4OiAxO1xufVxuXG4uZGVlcGxpYi1vdmVyZmxvdy1ib3gge1xuICBib3JkZXI6IHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKSBzb2xpZCB2YXIoLS1kZWVwbGliLWJvcmRlci13aWR0aCk7XG59XG5cbi5kZWVwbGliLXByZXYtbmV4dCB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGp1c3RpZnktY29udGVudDogc3BhY2UtYmV0d2VlbjtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZ2FwOiBtaW4oMmR2aCwgMWR2dyk7XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xuICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICBib3JkZXI6IG1pbigwLjJ2aCwgMC4xdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcblxuICAuZGVlcGxpYi1wcmV2LW5leHQtYnV0dG9uIHtcbiAgICAmOmhvdmVyIHtcbiAgICAgIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1ob3Zlci1jb2xvcik7XG4gICAgICBib3JkZXItcmFkaXVzOiB2YXIoLS1kZWVwbGliLWJvcmRlci1yYWRpdXMpO1xuICAgIH1cbiAgICBcbiAgICBoZWlnaHQ6IDEwMCU7XG4gICAgYXNwZWN0LXJhdGlvOiAxO1xuICB9XG5cbiAgLmRlZXBsaWItcHJldi1uZXh0LWxhYmVsIHtcbiAgICB3aGl0ZS1zcGFjZTogbm93cmFwO1xuICB9XG59XG5cbiNkZWVwbGliLW5hdi1tZW51IHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgZ2FwOiBtaW4oMmR2aCwgMWR2dyk7XG59XG5cbiNkZWVwbGliLXN0b3JhZ2UtbWV0ZXIge1xuICBwb3NpdGlvbjogYWJzb2x1dGU7XG4gIHRvcDogMHB4O1xuICBsZWZ0OiAwcHg7XG4gIHdpZHRoOiAxMDAlO1xuICBoZWlnaHQ6IDEwMCU7XG4gIG92ZXJmbG93OiBoaWRkZW47XG4gIGJhY2tncm91bmQtY29sb3I6IHZhcigtLWRlZXBsaWItZWxlbWVudC1jb2xvcik7XG4gIGJvcmRlcjogdmFyKC0tZGVlcGxpYi1ib3JkZXItd2lkdGgpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogdmFyKC0tZGVlcGxpYi1ib3JkZXItcmFkaXVzKTtcbiAgei1pbmRleDogLTE7XG59XG5cbiNkZWVwbGliLXN0b3JhZ2UtYmFyIHtcbiAgaGVpZ2h0OiAxMDAlO1xuICB3aWR0aDogMCU7XG4gIGJhY2tncm91bmQ6IHZhcigtLWRlZXBsaWItYWNjZW50LWNvbG9yKTtcbn1cbiIsIi5kZWVwbGliLWNoZWNrYm94LWNvbnRhaW5lciB7XG4gIGRpc3BsYXk6IGZsZXg7XG4gIGZsZXgtZGlyZWN0aW9uOiByb3c7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC4zZW07XG59XG5cbi5kZWVwbGliLWNoZWNrYm94LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0IHtcbiAgd2lkdGg6IG1pbig1dmgsIDIuNXZ3KTtcbiAgaGVpZ2h0OiBtaW4oNXZoLCAyLjV2dyk7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cbi5kZWVwbGliLWNoZWNrYm94LWNvbnRhaW5lciBpbnB1dC5kZWVwbGliLWlucHV0W3R5cGU9XCJjaGVja2JveFwiXTpjaGVja2VkOjpiZWZvcmUge1xuICB3aWR0aDogODAlO1xuICBoZWlnaHQ6IDgwJTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIHtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgZ2FwOiAwLjNlbTtcbn1cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyOmhhcyhsYWJlbC5kZWVwbGliLXRleHQpIHtcbiAgbWFyZ2luLXRvcDogbWluKDF2aCwgMC41dncpO1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dCB7XG4gIGZvbnQtc2l6ZTogMC42ZW07XG4gIHBhZGRpbmc6IDVweCAwO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB0cmFuc3BhcmVudDtcbiAgb3V0bGluZTogbm9uZTtcbiAgcGFkZGluZy1sZWZ0OiBtaW4oMXZoLCAwLjV2dyk7XG4gIHBhZGRpbmctcmlnaHQ6IG1pbigxdmgsIDAuNXZ3KTtcbiAgbWluLWhlaWdodDogbWluKDVkdmgsIDIuNWR2dyk7XG4gIGJvcmRlci1yYWRpdXM6IG1pbigxLjBkdmgsIDAuNWR2dyk7XG59XG5cblxuLmRlZXBsaWItaW5wdXQtY29udGFpbmVyIGlucHV0LmRlZXBsaWItaW5wdXRbdHlwZT1cImNvbG9yXCJdIHtcbiAgcGFkZGluZzogMHB4O1xuICB3aWR0aDogbWluKDV2aCwgMi41dncpO1xuICBoZWlnaHQ6IG1pbig1dmgsIDIuNXZ3KTtcbiAgYm9yZGVyLXJhZGl1czogMHB4O1xufVxuXG4uZGVlcGxpYi1pbnB1dC1jb250YWluZXIgaW5wdXQuZGVlcGxpYi1pbnB1dFt0eXBlPVwiY29sb3JcIl06ZGlzYWJsZWQge1xuICBib3JkZXI6IHZhcigtLWRlZXBsaWItYmxvY2tlZC1jb2xvcikgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItd2lkdGgpO1xuICBjdXJzb3I6IG5vdC1hbGxvd2VkO1xufVxuXG5pbnB1dDo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbixcbmlucHV0Ojotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uIHtcbiAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lO1xuICBtYXJnaW46IDA7XG59XG5cbmlucHV0W3R5cGU9bnVtYmVyXSB7XG4gIGFwcGVhcmFuY2U6IHRleHRmaWVsZDtcbiAgLW1vei1hcHBlYXJhbmNlOiB0ZXh0ZmllbGQ7XG59XG4iLCIuZGVlcGxpYi1oaWdobGlnaHQtdGV4dCB7XG4gIGZvbnQtd2VpZ2h0OiBib2xkO1xuICBjb2xvcjogcmdiKDIwMywgMTg1LCAyMyk7XG59XG5cbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrJ10gZGl2LkNoYXRNZXNzYWdlLmRlZXBsaWItbWVzc2FnZSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2Uge1xuICBiYWNrZ3JvdW5kLWNvbG9yOiB2YXIoLS1kZWVwbGliLWVsZW1lbnQtY29sb3IpO1xuICBib3JkZXI6IG1pbigwLjJkdmgsIDAuMWR2dykgc29saWQgdmFyKC0tZGVlcGxpYi1ib3JkZXItY29sb3IpO1xuICBjb2xvcjogdmFyKC0tZGVlcGxpYi10ZXh0LWNvbG9yKTtcbn1cblxuI1RleHRBcmVhQ2hhdExvZyBkaXYuQ2hhdE1lc3NhZ2UuZGVlcGxpYi1tZXNzYWdlIHtcbiAgYmFja2dyb3VuZC1jb2xvcjogI2VlZTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkICM0NDAxNzE7XG4gIGNvbG9yOiAjMTExO1xuICBwYWRkaW5nLWxlZnQ6IG1pbigwLjZkdmgsIDAuM2R2dyk7XG4gIGRpc3BsYXk6IGJsb2NrO1xuICB3aGl0ZS1zcGFjZTogbm9ybWFsO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nW2RhdGEtY29sb3J0aGVtZT0nZGFyayddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSxcbiNUZXh0QXJlYUNoYXRMb2dbZGF0YS1jb2xvcnRoZW1lPSdkYXJrMiddIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGNvbG9yOiB2YXIoLS1kZWVwbGliLXRleHQtY29sb3IpO1xufVxuXG4jVGV4dEFyZWFDaGF0TG9nIGRpdi5DaGF0TWVzc2FnZS5kZWVwbGliLW1lc3NhZ2UgYSB7XG4gIGN1cnNvcjogcG9pbnRlcjtcbiAgZm9udC13ZWlnaHQ6IGJvbGQ7XG4gIGNvbG9yOiAjMTExO1xufVxuIiwiLmRlZXBsaWItbW9kYWwge1xuICBwb3NpdGlvbjogZml4ZWQ7XG4gIHRvcDogMTAlO1xuICBsZWZ0OiA1MCU7XG4gIHRyYW5zZm9ybTogdHJhbnNsYXRlWCgtNTAlKTtcbiAgei1pbmRleDogMTAwMTtcbiAgZGlzcGxheTogZmxleDtcbiAgZmxleC1kaXJlY3Rpb246IGNvbHVtbjtcbiAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gIGFsaWduLWl0ZW1zOiBjZW50ZXI7XG4gIGdhcDogMC41ZW07XG4gIHdpZHRoOiBtYXgoNTBkdncsIDI1ZHZoKTtcbiAgZm9udC1zaXplOiBtaW4oNGR2aCwgMmR2dyk7XG4gIHBhZGRpbmc6IG1pbigyZHZoLCAxZHZ3KTtcbiAgYmFja2dyb3VuZC1jb2xvcjogdmFyKC0tZGVlcGxpYi1lbGVtZW50LWNvbG9yKTtcbiAgYm9yZGVyLXJhZGl1czogbWluKDEuMmR2aCwgMC42ZHZ3KTtcbiAgYm9yZGVyOiBtaW4oMC4yZHZoLCAwLjFkdncpIHNvbGlkIHZhcigtLWRlZXBsaWItYm9yZGVyLWNvbG9yKTtcbiAgY29sb3I6IHZhcigtLWRlZXBsaWItdGV4dC1jb2xvcik7XG5cbiAgLmRlZXBsaWItbW9kYWwtaW5wdXQge1xuICAgIHdpZHRoOiAxMDAlO1xuICAgIGZvbnQtc2l6ZTogbWluKDIuNmR2aCwgMS44ZHZ3KTtcbiAgICBib3JkZXItcmFkaXVzOiBtaW4oMS4wZHZoLCAwLjVkdncpO1xuICAgIHBhZGRpbmc6IG1pbigxZHZoLCAwLjVkdncpO1xuICB9XG5cbiAgaW5wdXQuZGVlcGxpYi1tb2RhbC1pbnB1dCB7XG4gICAgbWF4LXdpZHRoOiBtYXgoNTBkdmgsIDI1ZHZ3KTtcbiAgfVxuXG4gIC5kZWVwbGliLW1vZGFsLWJ1dHRvbi1jb250YWluZXIge1xuICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgZmxleC1kaXJlY3Rpb246IHJvdztcbiAgICBqdXN0aWZ5LWNvbnRlbnQ6IGZsZXgtZW5kO1xuICAgIGdhcDogMC41ZW07XG4gICAgd2lkdGg6IDEwMCU7XG5cbiAgICAuZGVlcGxpYi1idXR0b24ge1xuICAgICAgZm9udC1zaXplOiAwLjhlbTtcbiAgICAgIGRpc3BsYXk6IGZsZXg7XG4gICAgICB3aWR0aDogYXV0bztcbiAgICAgIHBhZGRpbmc6IG1pbigwLjR2aCwgMC4ydncpIG1pbigydmgsIDF2dyk7XG5cbiAgICAgIC5idXR0b24tbGFiZWwge1xuICAgICAgICBkaXNwbGF5OiBjb250ZW50cztcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICAuZGVlcGxpYi1tb2RhbC1wcm9tcHQtY29udGFpbmVyIHtcbiAgICBkaXNwbGF5OiBmbGV4O1xuICAgIGZsZXgtZGlyZWN0aW9uOiBjb2x1bW47XG4gICAganVzdGlmeS1jb250ZW50OiBjZW50ZXI7XG4gICAgYWxpZ24taXRlbXM6IGNlbnRlcjtcbiAgfVxufVxuXG4uZGVlcGxpYi1tb2RhbC1ibG9ja2VyIHtcbiAgei1pbmRleDogMTAwMDtcbiAgcG9zaXRpb246IGZpeGVkO1xuICB0b3A6IDA7XG4gIGxlZnQ6IDA7XG4gIHdpZHRoOiAxMDBkdnc7XG4gIGhlaWdodDogMTAwZHZoO1xuICBiYWNrZ3JvdW5kLWNvbG9yOiByZ2JhKDAsIDAsIDAsIDAuNSk7XG59XG4iXX0= */`;
878
919
 
879
920
  // src/base/initialization.ts
880
921
  var modStorage;
@@ -921,7 +962,6 @@ async function init(options) {
921
962
  await options.initFunction?.();
922
963
  if (options.mainMenuOptions)
923
964
  MainMenu.setOptions(options.mainMenuOptions);
924
- VersionModule.checkVersionUpdate();
925
965
  for (const m of modules()) {
926
966
  if (m.defaultSettings && hasGetter(m, "defaultSettings") && m.settings && hasSetter(m, "settings")) {
927
967
  if (Object.entries(m.defaultSettings).length === 0) continue;
@@ -999,8 +1039,6 @@ var GUI = class _GUI extends BaseModule {
999
1039
  _subscreens;
1000
1040
  /** The mod's main menu screen. */
1001
1041
  _mainMenu;
1002
- /** The currently active subscreen, or `null` if none is active. */
1003
- _currentSubscreen = null;
1004
1042
  /** Options defining how the mod's settings button is displayed and behaves. */
1005
1043
  _modButtonOptions;
1006
1044
  /** Returns all registered subscreens. */
@@ -1011,38 +1049,12 @@ var GUI = class _GUI extends BaseModule {
1011
1049
  get mainMenu() {
1012
1050
  return this._mainMenu;
1013
1051
  }
1014
- /** Returns the currently active subscreen. */
1015
- get currentSubscreen() {
1016
- return this._currentSubscreen;
1017
- }
1018
- /**
1019
- * Sets the current subscreen.
1020
- * Accepts either a `BaseSubscreen` instance or the `name` of a subscreen.
1021
- *
1022
- * @throws If a string is provided but no subscreen with that name exists.
1023
- */
1024
- set currentSubscreen(subscreen) {
1025
- if (this._currentSubscreen) {
1026
- this._currentSubscreen.unload();
1027
- }
1028
- if (typeof subscreen === "string") {
1029
- const scr = this._subscreens?.find((s) => s.name === subscreen);
1030
- if (!scr) throw `Failed to find screen name ${subscreen}`;
1031
- this._currentSubscreen = scr;
1032
- } else {
1033
- this._currentSubscreen = subscreen;
1034
- }
1035
- if (this._currentSubscreen) {
1036
- this._currentSubscreen.load();
1037
- this._currentSubscreen.resize(true);
1038
- }
1039
- }
1040
1052
  /**
1041
1053
  * Creates the GUI instance and initializes the main menu.
1042
1054
  *
1043
1055
  * @throws If another `GUI` instance already exists.
1044
1056
  */
1045
- constructor(modButtonOptions) {
1057
+ constructor(guiOptions = null) {
1046
1058
  super();
1047
1059
  if (_GUI.instance) {
1048
1060
  throw new Error("Duplicate initialization");
@@ -1050,9 +1062,9 @@ var GUI = class _GUI extends BaseModule {
1050
1062
  for (const module of modules()) {
1051
1063
  if (!module.settingsScreen) continue;
1052
1064
  }
1053
- this._mainMenu = new MainMenu(this);
1065
+ this._mainMenu = guiOptions?.mainMenu ? new guiOptions.mainMenu(this) : new MainMenu(this);
1054
1066
  this._subscreens = [this._mainMenu];
1055
- this._modButtonOptions = modButtonOptions;
1067
+ this._modButtonOptions = guiOptions;
1056
1068
  _GUI.instance = this;
1057
1069
  }
1058
1070
  /**
@@ -1063,43 +1075,25 @@ var GUI = class _GUI extends BaseModule {
1063
1075
  * - Sets up the main menu and its subscreens.
1064
1076
  */
1065
1077
  load() {
1078
+ if (!this._modButtonOptions) return;
1066
1079
  for (const module of modules()) {
1067
1080
  if (!module.settingsScreen) continue;
1068
- this._subscreens.push(new module.settingsScreen({}, module));
1081
+ this._subscreens.push(new module.settingsScreen(module));
1069
1082
  }
1070
1083
  this._mainMenu.subscreens = this._subscreens;
1071
1084
  PreferenceRegisterExtensionSetting({
1072
- Identifier: this._modButtonOptions.Identifier,
1073
- ButtonText: this._modButtonOptions.ButtonText,
1074
- Image: this._modButtonOptions.Image,
1075
- load: /* @__PURE__ */ __name(() => {
1076
- setSubscreen(new MainMenu(this));
1085
+ Identifier: this._modButtonOptions.identifier,
1086
+ ButtonText: this._modButtonOptions.buttonText,
1087
+ Image: this._modButtonOptions.image,
1088
+ load: /* @__PURE__ */ __name(async () => {
1089
+ await setSubscreen(this._mainMenu);
1077
1090
  }, "load"),
1078
1091
  run: /* @__PURE__ */ __name(() => {
1079
- if (this._currentSubscreen) {
1080
- this._currentSubscreen.run();
1081
- const newCanvasPosition = [MainCanvas.canvas.offsetLeft, MainCanvas.canvas.offsetTop, MainCanvas.canvas.clientWidth, MainCanvas.canvas.clientHeight];
1082
- if (!CommonArraysEqual(newCanvasPosition, DrawCanvasPosition)) {
1083
- DrawCanvasPosition = newCanvasPosition;
1084
- this._currentSubscreen.resize(false);
1085
- }
1086
- }
1087
1092
  }, "run"),
1088
1093
  click: /* @__PURE__ */ __name(() => {
1089
- if (this._currentSubscreen) {
1090
- this._currentSubscreen.click();
1091
- }
1092
1094
  }, "click"),
1093
1095
  exit: /* @__PURE__ */ __name(() => {
1094
- if (this._currentSubscreen) {
1095
- this._currentSubscreen.exit();
1096
- }
1097
- }, "exit"),
1098
- unload: /* @__PURE__ */ __name(() => {
1099
- if (this._currentSubscreen) {
1100
- this._currentSubscreen.unload();
1101
- }
1102
- }, "unload")
1096
+ }, "exit")
1103
1097
  });
1104
1098
  }
1105
1099
  };
@@ -1112,29 +1106,38 @@ var VersionModule = class _VersionModule extends BaseModule {
1112
1106
  /** Whether the current session is running a new version compared to stored data */
1113
1107
  static isItNewVersion = false;
1114
1108
  /** The current mod version (retrieved from `ModSdkManager.ModInfo.version`) */
1115
- static Version;
1109
+ static version;
1116
1110
  /** Message to display when a new version is detected */
1117
- static NewVersionMessage = "";
1111
+ static newVersionMessage = "";
1118
1112
  /** List of registered migration handlers, sorted by version */
1119
- static Migrators = [];
1113
+ static migrators = [];
1114
+ /** Optional lifecycle hook. Runs before each migration */
1115
+ static beforeEach;
1116
+ /** Optional lifecycle hook. Runs after each migration */
1117
+ static afterEach;
1118
+ /** Optional lifecycle hook. Runs before all migrations */
1119
+ static beforeAll;
1120
+ /** Optional lifecycle hook. Runs after all migrations */
1121
+ static afterAll;
1122
+ constructor(options) {
1123
+ super();
1124
+ _VersionModule.newVersionMessage = options.newVersionMessage;
1125
+ _VersionModule.beforeEach = options.beforeEach;
1126
+ _VersionModule.afterEach = options.afterEach;
1127
+ _VersionModule.beforeAll = options.beforeAll;
1128
+ _VersionModule.afterAll = options.afterAll;
1129
+ }
1120
1130
  /**
1121
1131
  * Initializes the module on load:
1122
1132
  * - Stores the current mod version.
1123
1133
  * - Hooks into `ChatRoomSync` to show a "new version" message when applicable.
1124
1134
  */
1125
1135
  load() {
1126
- _VersionModule.Version = ModSdkManager.ModInfo.version;
1127
- ModSdkManager.prototype.hookFunction(
1128
- "ChatRoomSync",
1129
- HookPriority.Observe,
1130
- (args, next) => {
1131
- next(args);
1132
- if (modStorage.playerStorage.GlobalModule.doShowNewVersionMessage && _VersionModule.isItNewVersion) {
1133
- _VersionModule.sendNewVersionMessage();
1134
- }
1135
- },
1136
- "VersionModule"
1137
- );
1136
+ _VersionModule.version = ModSdkManager.ModInfo.version;
1137
+ _VersionModule.checkVersionUpdate();
1138
+ if (modStorage.playerStorage.GlobalModule.doShowNewVersionMessage && _VersionModule.isItNewVersion) {
1139
+ _VersionModule.sendNewVersionMessage();
1140
+ }
1138
1141
  }
1139
1142
  /**
1140
1143
  * Checks if the stored version differs from the current version.
@@ -1145,9 +1148,9 @@ var VersionModule = class _VersionModule extends BaseModule {
1145
1148
  * - Saves `modStorage`.
1146
1149
  */
1147
1150
  static checkVersionUpdate() {
1148
- const PreviousVersion = _VersionModule.loadVersion();
1149
- const CurrentVersion = _VersionModule.Version;
1150
- if (_VersionModule.isNewVersion(PreviousVersion, CurrentVersion)) {
1151
+ const previousVersion = _VersionModule.loadVersion();
1152
+ const currentVersion = _VersionModule.version;
1153
+ if (_VersionModule.isNewVersion(previousVersion, currentVersion)) {
1151
1154
  _VersionModule.isItNewVersion = true;
1152
1155
  _VersionModule.checkVersionMigration();
1153
1156
  _VersionModule.saveVersion();
@@ -1159,29 +1162,58 @@ var VersionModule = class _VersionModule extends BaseModule {
1159
1162
  * is newer than the previously stored version.
1160
1163
  */
1161
1164
  static checkVersionMigration() {
1162
- const PreviousVersion = _VersionModule.loadVersion();
1163
- for (const migrator of _VersionModule.Migrators) {
1164
- if (_VersionModule.isNewVersion(PreviousVersion, migrator.MigrationVersion)) {
1165
- migrator.Migrate();
1166
- deepLibLogger.info(`Migrating ${ModSdkManager.ModInfo.name} from ${PreviousVersion} to ${migrator.MigrationVersion} with ${migrator.constructor.name}`);
1167
- }
1165
+ const previousVersion = _VersionModule.loadVersion();
1166
+ const toMigrate = _VersionModule.migrators.filter(
1167
+ (m) => _VersionModule.isNewVersion(previousVersion, m.migrationVersion)
1168
+ );
1169
+ if (!toMigrate.length) return;
1170
+ _VersionModule.beforeAll?.();
1171
+ for (const migrator of toMigrate) {
1172
+ _VersionModule.beforeEach?.();
1173
+ migrator.migrate();
1174
+ deepLibLogger.info(
1175
+ `Migrating ${ModSdkManager.ModInfo.name} from ${previousVersion} to ${migrator.migrationVersion} with ${migrator.constructor.name}`
1176
+ );
1177
+ _VersionModule.afterEach?.();
1168
1178
  }
1179
+ _VersionModule.afterAll?.();
1169
1180
  }
1170
1181
  /**
1171
1182
  * Registers a new migrator for handling version-specific changes.
1172
1183
  * Migrators are sorted by their `MigrationVersion` in ascending order.
1173
1184
  */
1174
1185
  static registerMigrator(migrator) {
1175
- _VersionModule.Migrators.push(migrator);
1176
- _VersionModule.Migrators.sort((a, b) => a.MigrationVersion.localeCompare(b.MigrationVersion));
1177
- }
1178
- /** Sets the message that will be displayed when a new version is detected. */
1179
- static setNewVersionMessage(newVersionMessage) {
1180
- _VersionModule.NewVersionMessage = newVersionMessage;
1186
+ _VersionModule.migrators.push(migrator);
1187
+ _VersionModule.migrators.sort((a, b) => a.migrationVersion.localeCompare(b.migrationVersion));
1181
1188
  }
1182
1189
  /** Sends the currently configured "new version" message to the local player. */
1183
1190
  static sendNewVersionMessage() {
1184
- sendLocalMessage("deeplib-new-version", _VersionModule.NewVersionMessage);
1191
+ const beepLogLength = FriendListBeepLog.push({
1192
+ MemberNumber: Player.MemberNumber,
1193
+ MemberName: ModSdkManager.ModInfo.name,
1194
+ ChatRoomName: getText("module.version.version_update"),
1195
+ ChatRoomSpace: "X",
1196
+ Private: false,
1197
+ Sent: false,
1198
+ Time: /* @__PURE__ */ new Date(),
1199
+ Message: _VersionModule.newVersionMessage
1200
+ });
1201
+ const beepIdx = beepLogLength - 1;
1202
+ const title = CommonStringPartitionReplace(getText("module.version.new_version_toast_title"), {
1203
+ $modName$: ModSdkManager.ModInfo.name,
1204
+ $modVersion$: _VersionModule.version
1205
+ }).join("");
1206
+ const data = FriendListBeepLog[beepIdx];
1207
+ ServerShowBeep(_VersionModule.newVersionMessage, 1e4, {
1208
+ memberNumber: data.MemberNumber,
1209
+ memberName: data.MemberName,
1210
+ chatRoomName: data.ChatRoomName,
1211
+ ...data.Message && {
1212
+ onClick: /* @__PURE__ */ __name(() => {
1213
+ FriendListShowBeep(beepIdx);
1214
+ }, "onClick")
1215
+ }
1216
+ }, title);
1185
1217
  }
1186
1218
  /**
1187
1219
  * Determines if a given `candidate` version is newer than the `current` version.
@@ -1206,7 +1238,7 @@ var VersionModule = class _VersionModule extends BaseModule {
1206
1238
  /** Saves the current mod version into persistent player storage. */
1207
1239
  static saveVersion() {
1208
1240
  if (modStorage.playerStorage) {
1209
- Player[ModSdkManager.ModInfo.name].Version = _VersionModule.Version;
1241
+ Player[ModSdkManager.ModInfo.name].Version = _VersionModule.version;
1210
1242
  }
1211
1243
  }
1212
1244
  /** Loads the stored mod version from persistent player storage. */
@@ -1220,9 +1252,9 @@ var GuiDebug = class extends BaseSubscreen {
1220
1252
  static {
1221
1253
  __name(this, "GuiDebug");
1222
1254
  }
1223
- get name() {
1224
- return "debug";
1225
- }
1255
+ static subscreenOptions = {
1256
+ name: "debug"
1257
+ };
1226
1258
  get pageStructure() {
1227
1259
  return [
1228
1260
  [
@@ -1952,15 +1984,15 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1952
1984
  }
1953
1985
  subscreens = [];
1954
1986
  static options = {};
1955
- get name() {
1956
- return "mainmenu";
1957
- }
1987
+ static subscreenOptions = {
1988
+ name: "mainmenu"
1989
+ };
1958
1990
  constructor(module) {
1959
- super({ drawCharacter: true }, module);
1991
+ super(module);
1960
1992
  this.subscreens = module.subscreens;
1961
1993
  }
1962
1994
  load() {
1963
- if (!GUI.instance?.currentSubscreen) {
1995
+ if (!GUI.instance || CurrentModule !== "DeepLibMod") {
1964
1996
  this.setSubscreen(this);
1965
1997
  return;
1966
1998
  }
@@ -1981,21 +2013,21 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
1981
2013
  ElementMenu.AppendButton(menu, exitButton);
1982
2014
  }
1983
2015
  for (const screen of this.subscreens) {
1984
- if (screen.name == "mainmenu") continue;
2016
+ if (screen.options.name == "mainmenu") continue;
1985
2017
  const button = advElement.createButton({
1986
- id: `${screen.name}-button`,
2018
+ id: `${screen.options.name}-button`,
1987
2019
  onClick: /* @__PURE__ */ __name(() => {
1988
2020
  this.setSubscreen(screen);
1989
2021
  }, "onClick"),
1990
2022
  size: [null, 90],
1991
2023
  options: {
1992
- image: screen.icon,
1993
- label: getText(`mainmenu.button.${screen.name}`)
2024
+ image: screen.options.icon,
2025
+ label: getText(`mainmenu.button.${screen.options.name}`)
1994
2026
  }
1995
2027
  });
1996
2028
  layout.appendToSettingsDiv(button);
1997
2029
  }
1998
- const miscDiv = layout.createMiscDiv();
2030
+ const miscDiv = layout.getMiscDiv();
1999
2031
  layout.appendToSubscreen(miscDiv);
2000
2032
  if (_MainMenu.options.wikiLink) {
2001
2033
  const wikiButton = advElement.createButton({
@@ -2115,8 +2147,17 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
2115
2147
  exit() {
2116
2148
  CharacterAppearanceForceUpCharacter = -1;
2117
2149
  CharacterLoadCanvas(Player);
2118
- this.setSubscreen(null);
2119
- PreferenceSubscreenExtensionsClear();
2150
+ const returnScreen = typeof this.options.returnScreen === "function" ? this.options.returnScreen() : this.options.returnScreen;
2151
+ if (!returnScreen) {
2152
+ PreferenceOpenSubscreen("Extensions").then(() => {
2153
+ PreferenceSubscreenExtensionsClear();
2154
+ });
2155
+ } else if (returnScreen instanceof BaseSubscreen) {
2156
+ setSubscreen(returnScreen ?? null).then(() => {
2157
+ });
2158
+ } else if (Array.isArray(returnScreen)) {
2159
+ CommonSetScreen(...returnScreen);
2160
+ }
2120
2161
  }
2121
2162
  resize() {
2122
2163
  super.resize();
@@ -2127,6 +2168,18 @@ var MainMenu = class _MainMenu extends BaseSubscreen {
2127
2168
  _MainMenu.options = mainMenuOptions;
2128
2169
  }
2129
2170
  };
2171
+ async function PreferenceOpenSubscreen(subscreen, page = 1) {
2172
+ if (CurrentModule !== "Character" || CurrentScreen !== "Preference") {
2173
+ await CommonSetScreen("Character", "Preference");
2174
+ }
2175
+ PreferenceSubscreen?.unload?.();
2176
+ PreferenceSubscreen = PreferenceSubscreens.find((s) => s.name === subscreen) ?? null;
2177
+ if (!CommonIsNonNegativeInteger(page)) page = 1;
2178
+ PreferencePageCurrent = page;
2179
+ PreferenceMessage = "";
2180
+ PreferenceSubscreen?.load?.();
2181
+ }
2182
+ __name(PreferenceOpenSubscreen, "PreferenceOpenSubscreen");
2130
2183
 
2131
2184
  // src/screens/import_export.ts
2132
2185
  var GuiImportExport = class extends BaseSubscreen {
@@ -2134,11 +2187,11 @@ var GuiImportExport = class extends BaseSubscreen {
2134
2187
  __name(this, "GuiImportExport");
2135
2188
  }
2136
2189
  importExportOptions;
2137
- get name() {
2138
- return "import-export";
2139
- }
2190
+ static subscreenOptions = {
2191
+ name: "import-export"
2192
+ };
2140
2193
  constructor(importExportOptions) {
2141
- super({ drawCharacter: true });
2194
+ super();
2142
2195
  this.importExportOptions = importExportOptions;
2143
2196
  }
2144
2197
  load() {
@@ -2513,34 +2566,28 @@ __name(hasOverflow, "hasOverflow");
2513
2566
 
2514
2567
  // src/utilities/elements/layout.ts
2515
2568
  var layout = {
2516
- createSubscreen: elementCreateSubscreenDiv,
2517
2569
  getSubscreen: elementGetSubscreenDiv,
2518
2570
  appendToSubscreen: elementAppendToSubscreenDiv,
2519
2571
  removeSubscreen: elementRemoveSubscreenDiv,
2520
- createSettingsDiv: elementCreateSettingsDiv,
2521
2572
  getSettingsDiv: elementGetSettingsDiv,
2522
2573
  appendToSettingsDiv: elementAppendToSettingsDiv,
2523
2574
  removeSettingsDiv: elementRemoveSettingsDiv,
2524
- createMiscDiv: elementCreateMiscDiv,
2525
2575
  getMiscDiv: elementGetMiscDiv,
2526
2576
  appendToMiscDiv: elementAppendToMiscDiv,
2527
2577
  removeMiscDiv: elementRemoveMiscDiv
2528
2578
  };
2529
- function elementCreateSubscreenDiv() {
2530
- const subscreenDiv = elementGetSubscreenDiv();
2579
+ function elementGetSubscreenDiv() {
2580
+ const subscreenDiv = ElementWrap("deeplib-subscreen");
2531
2581
  if (subscreenDiv) {
2532
- console.error("Subscreen already exists");
2533
2582
  return subscreenDiv;
2534
2583
  }
2535
- const div = document.createElement("div");
2536
- div.id = "deeplib-subscreen";
2537
- div.classList.add("deeplib-subscreen", "HideOnPopup");
2584
+ const div = ElementCreate({
2585
+ tag: "div",
2586
+ classList: ["deeplib-subscreen", "HideOnPopup"],
2587
+ attributes: { id: "deeplib-subscreen" }
2588
+ });
2538
2589
  return document.body.appendChild(div);
2539
2590
  }
2540
- __name(elementCreateSubscreenDiv, "elementCreateSubscreenDiv");
2541
- function elementGetSubscreenDiv() {
2542
- return document.getElementById("deeplib-subscreen") ?? void 0;
2543
- }
2544
2591
  __name(elementGetSubscreenDiv, "elementGetSubscreenDiv");
2545
2592
  function elementRemoveSubscreenDiv() {
2546
2593
  return elementGetSubscreenDiv()?.remove();
@@ -2550,21 +2597,18 @@ function elementAppendToSubscreenDiv(...element) {
2550
2597
  return elementGetSubscreenDiv()?.append(...element);
2551
2598
  }
2552
2599
  __name(elementAppendToSubscreenDiv, "elementAppendToSubscreenDiv");
2553
- function elementCreateSettingsDiv() {
2554
- const settingsDiv = elementGetSettingsDiv();
2600
+ function elementGetSettingsDiv() {
2601
+ const settingsDiv = ElementWrap("deeplib-settings");
2555
2602
  if (settingsDiv) {
2556
- console.error("Settings screen already exists");
2557
2603
  return settingsDiv;
2558
2604
  }
2559
- const div = document.createElement("div");
2560
- div.id = "deeplib-settings";
2561
- div.classList.add("deeplib-settings");
2605
+ const div = ElementCreate({
2606
+ tag: "div",
2607
+ classList: ["deeplib-settings", "scroll-box"],
2608
+ attributes: { id: "deeplib-settings" }
2609
+ });
2562
2610
  return div;
2563
2611
  }
2564
- __name(elementCreateSettingsDiv, "elementCreateSettingsDiv");
2565
- function elementGetSettingsDiv() {
2566
- return document.getElementById("deeplib-settings") ?? void 0;
2567
- }
2568
2612
  __name(elementGetSettingsDiv, "elementGetSettingsDiv");
2569
2613
  function elementAppendToSettingsDiv(...element) {
2570
2614
  return elementGetSettingsDiv()?.append(...element);
@@ -2574,21 +2618,18 @@ function elementRemoveSettingsDiv() {
2574
2618
  return elementGetSettingsDiv()?.remove();
2575
2619
  }
2576
2620
  __name(elementRemoveSettingsDiv, "elementRemoveSettingsDiv");
2577
- function elementCreateMiscDiv() {
2578
- const miscDiv = elementGetMiscDiv();
2621
+ function elementGetMiscDiv() {
2622
+ const miscDiv = ElementWrap("deeplib-misc");
2579
2623
  if (miscDiv) {
2580
- console.error("Settings screen already exists");
2581
2624
  return miscDiv;
2582
2625
  }
2583
- const div = document.createElement("div");
2584
- div.id = "deeplib-misc";
2585
- div.classList.add("deeplib-misc");
2626
+ const div = ElementCreate({
2627
+ tag: "div",
2628
+ classList: ["deeplib-misc"],
2629
+ attributes: { id: "deeplib-misc" }
2630
+ });
2586
2631
  return div;
2587
2632
  }
2588
- __name(elementCreateMiscDiv, "elementCreateMiscDiv");
2589
- function elementGetMiscDiv() {
2590
- return document.getElementById("deeplib-misc");
2591
- }
2592
2633
  __name(elementGetMiscDiv, "elementGetMiscDiv");
2593
2634
  function elementAppendToMiscDiv(...element) {
2594
2635
  return elementGetMiscDiv()?.append(...element);