@bkm016/calcite 0.0.0-stage → 0.2.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.
Files changed (77) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +416 -2
  3. package/THIRD_PARTY_NOTICES.md +44 -0
  4. package/dist/accounts.d.ts +46 -0
  5. package/dist/accounts.js +194 -0
  6. package/dist/accounts.js.map +1 -0
  7. package/dist/cli.d.ts +2 -0
  8. package/dist/cli.js +332 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/client-core.d.ts +66 -0
  11. package/dist/client-core.js +530 -0
  12. package/dist/client-core.js.map +1 -0
  13. package/dist/client.d.ts +127 -0
  14. package/dist/client.js +185 -0
  15. package/dist/client.js.map +1 -0
  16. package/dist/display.d.ts +23 -0
  17. package/dist/display.js +164 -0
  18. package/dist/display.js.map +1 -0
  19. package/dist/hmc.d.ts +53 -0
  20. package/dist/hmc.js +168 -0
  21. package/dist/hmc.js.map +1 -0
  22. package/dist/index.d.ts +11 -0
  23. package/dist/index.js +8 -0
  24. package/dist/index.js.map +1 -0
  25. package/dist/install.d.ts +48 -0
  26. package/dist/install.js +119 -0
  27. package/dist/install.js.map +1 -0
  28. package/dist/java.d.ts +37 -0
  29. package/dist/java.js +222 -0
  30. package/dist/java.js.map +1 -0
  31. package/dist/loaders.d.ts +41 -0
  32. package/dist/loaders.js +86 -0
  33. package/dist/loaders.js.map +1 -0
  34. package/dist/lock.d.ts +13 -0
  35. package/dist/lock.js +79 -0
  36. package/dist/lock.js.map +1 -0
  37. package/dist/log.d.ts +13 -0
  38. package/dist/log.js +20 -0
  39. package/dist/log.js.map +1 -0
  40. package/dist/manager.d.ts +15 -0
  41. package/dist/manager.js +65 -0
  42. package/dist/manager.js.map +1 -0
  43. package/dist/mcp.d.ts +13 -0
  44. package/dist/mcp.js +377 -0
  45. package/dist/mcp.js.map +1 -0
  46. package/dist/mods.d.ts +21 -0
  47. package/dist/mods.js +135 -0
  48. package/dist/mods.js.map +1 -0
  49. package/dist/mojang.d.ts +54 -0
  50. package/dist/mojang.js +73 -0
  51. package/dist/mojang.js.map +1 -0
  52. package/dist/names.d.ts +53 -0
  53. package/dist/names.js +267 -0
  54. package/dist/names.js.map +1 -0
  55. package/dist/net.d.ts +26 -0
  56. package/dist/net.js +286 -0
  57. package/dist/net.js.map +1 -0
  58. package/dist/options.d.ts +14 -0
  59. package/dist/options.js +50 -0
  60. package/dist/options.js.map +1 -0
  61. package/dist/paths.d.ts +29 -0
  62. package/dist/paths.js +49 -0
  63. package/dist/paths.js.map +1 -0
  64. package/dist/probe-server.d.ts +28 -0
  65. package/dist/probe-server.js +132 -0
  66. package/dist/probe-server.js.map +1 -0
  67. package/dist/types.d.ts +235 -0
  68. package/dist/types.js +25 -0
  69. package/dist/types.js.map +1 -0
  70. package/dist/version.d.ts +2 -0
  71. package/dist/version.js +11 -0
  72. package/dist/version.js.map +1 -0
  73. package/dist/zip.d.ts +5 -0
  74. package/dist/zip.js +65 -0
  75. package/dist/zip.js.map +1 -0
  76. package/package.json +57 -4
  77. package/vendor/calcite-probe.jar +0 -0
@@ -0,0 +1,530 @@
1
+ import { randomBytes } from 'node:crypto';
2
+ import { EventEmitter } from 'node:events';
3
+ import { mkdir, rm, writeFile } from 'node:fs/promises';
4
+ import { Socket } from 'node:net';
5
+ import { join } from 'node:path';
6
+ import { prepareAccount, syncAccount } from './accounts.js';
7
+ import { acquireDisplay, which } from './display.js';
8
+ import { hmcListEntry, hmcQuote, hmcVersionArgs, killTree, runHmc, writeHmcProfile } from './hmc.js';
9
+ import { installProbe, prepareGame } from './install.js';
10
+ import { parseLoader } from './loaders.js';
11
+ import { acquireLock } from './lock.js';
12
+ import { logger } from './log.js';
13
+ import { resolveMods, syncMods } from './mods.js';
14
+ import { javaProxyProps } from './net.js';
15
+ import { supportsQuickPlay } from './mojang.js';
16
+ import { defaultOptions, writeOptions } from './options.js';
17
+ import { resolvePaths } from './paths.js';
18
+ import { ProbeError, ProbeServer } from './probe-server.js';
19
+ import { CalciteError, defaultUsername, parseServer, } from './types.js';
20
+ const NAME_RE = /^[A-Za-z0-9_.-]{1,64}$/;
21
+ const MAX_LOG = 5000;
22
+ const MAX_CHAT = 1000;
23
+ /** Escapes a value for a java.util.Properties file. */
24
+ function propValue(value) {
25
+ return value.replace(/\\/g, '\\\\').replace(/[:=]/g, (c) => `\\${c}`);
26
+ }
27
+ async function tcpReachable(host, port, timeoutMs = 3000) {
28
+ return new Promise((resolve) => {
29
+ const socket = new Socket();
30
+ const done = (ok) => {
31
+ socket.destroy();
32
+ resolve(ok);
33
+ };
34
+ socket.setTimeout(timeoutMs, () => done(false));
35
+ socket.once('error', () => done(false));
36
+ socket.connect(port, host, () => done(true));
37
+ });
38
+ }
39
+ /** Screens shown while joining or changing dimension; the player is not playable yet. */
40
+ const LOADING_SCREEN = /LevelLoading|ReceivingLevel|ProgressScreen|ConnectScreen|GenericMessage|DownloadingTerrain/;
41
+ export const sleep = (ms) => new Promise((r) => setTimeout(r, ms));
42
+ /** Process lifecycle of a client: preparing, launching, the probe connection, reconnects and shutdown. */
43
+ export class ClientCore extends EventEmitter {
44
+ options;
45
+ paths;
46
+ gameDir;
47
+ render;
48
+ account;
49
+ server;
50
+ phaseValue = 'idle';
51
+ logs = [];
52
+ chats = [];
53
+ seq = 0;
54
+ probe = null;
55
+ run = null;
56
+ display = null;
57
+ releaseInstance = null;
58
+ probeConfig = null;
59
+ game = null;
60
+ mods = [];
61
+ headlessValue = false;
62
+ lastState;
63
+ lastError;
64
+ /** Error code of a failure that relaunching cannot fix (reported by start() instead of "crashed"). */
65
+ fatalCode;
66
+ startedAt;
67
+ reconnects = 0;
68
+ stopping = false;
69
+ poller = null;
70
+ inGameSince = 0;
71
+ relaunching = false;
72
+ everInGame = false;
73
+ joinRequested = false;
74
+ log;
75
+ constructor(options) {
76
+ super();
77
+ if (!NAME_RE.test(options.name)) {
78
+ throw new CalciteError('bad_name', `Invalid client name "${options.name}" (allowed: letters, digits, - _ .)`);
79
+ }
80
+ this.options = options;
81
+ this.paths = options.paths ?? resolvePaths();
82
+ this.gameDir = join(this.paths.instances, options.name);
83
+ this.render = options.render ?? 'on-demand';
84
+ this.account = options.account ?? { type: 'offline', username: defaultUsername(options.name) };
85
+ if (this.account.type === 'offline' && !/^[A-Za-z0-9_]{3,16}$/.test(this.account.username)) {
86
+ throw new CalciteError('bad_username', `Offline username must be 3-16 letters, digits or underscores: "${this.account.username}"`);
87
+ }
88
+ this.server = options.server ? parseServer(options.server) : undefined;
89
+ if (!parseLoader(options.loader) && options.mods?.length) {
90
+ throw new CalciteError('bad_mod', 'Mods need a mod loader (loader "fabric", "forge" or "neoforge")');
91
+ }
92
+ this.log = logger(`client:${options.name}`);
93
+ this.on('error', () => undefined); // never crash the host process on an unhandled 'error' event
94
+ }
95
+ get phase() {
96
+ return this.phaseValue;
97
+ }
98
+ get headless() {
99
+ return this.headlessValue;
100
+ }
101
+ setPhase(phase) {
102
+ if (phase === this.phaseValue)
103
+ return;
104
+ this.phaseValue = phase;
105
+ this.note(`phase → ${phase}`);
106
+ this.emit('phase', phase);
107
+ }
108
+ note(line) {
109
+ this.pushLog('calcite', line);
110
+ this.log.debug(line);
111
+ }
112
+ pushLog(source, line) {
113
+ const entry = { seq: ++this.seq, time: Date.now(), source, line };
114
+ this.logs.push(entry);
115
+ if (this.logs.length > MAX_LOG)
116
+ this.logs.splice(0, this.logs.length - MAX_LOG);
117
+ this.emit('log', entry);
118
+ if (source === 'game') {
119
+ const chat = /\[CHAT\] (.*)$/.exec(line);
120
+ if (chat) {
121
+ const c = { seq: entry.seq, time: entry.time, message: chat[1] };
122
+ this.chats.push(c);
123
+ if (this.chats.length > MAX_CHAT)
124
+ this.chats.splice(0, this.chats.length - MAX_CHAT);
125
+ this.emit('chat', c);
126
+ }
127
+ }
128
+ }
129
+ // ------------------------------------------------------------------ lifecycle
130
+ /**
131
+ * Prepares everything (Java, game files, mappings), launches the client and resolves once it is in a world
132
+ * (or on the title screen when no server is configured).
133
+ */
134
+ async start() {
135
+ if (!['idle', 'stopped', 'crashed'].includes(this.phaseValue)) {
136
+ throw new CalciteError('already_running', `Client "${this.options.name}" is already ${this.phaseValue}`);
137
+ }
138
+ this.stopping = false;
139
+ this.everInGame = false;
140
+ this.reconnects = 0;
141
+ this.lastError = undefined;
142
+ this.fatalCode = undefined;
143
+ const timeout = this.options.startTimeoutMs ?? 15 * 60_000;
144
+ try {
145
+ this.releaseInstance = await acquireLock(join(this.gameDir, '.calcite.lock'), { timeoutMs: 0 });
146
+ }
147
+ catch {
148
+ throw new CalciteError('instance_busy', `Client "${this.options.name}" is already running in another process`);
149
+ }
150
+ try {
151
+ await this.prepare();
152
+ await this.launch();
153
+ await this.waitUntilStarted(timeout);
154
+ return this.status();
155
+ }
156
+ catch (err) {
157
+ this.lastError = err.message;
158
+ await this.shutdown('crashed');
159
+ throw err;
160
+ }
161
+ }
162
+ /** Downloads and verifies everything needed to launch (idempotent). */
163
+ async prepare() {
164
+ this.setPhase('preparing');
165
+ this.headlessValue = this.resolveHeadless();
166
+ const game = await prepareGame(this.paths, {
167
+ version: this.options.version,
168
+ loader: this.options.loader,
169
+ javaPath: this.options.javaPath,
170
+ allowJavaDownload: this.options.allowJavaDownload,
171
+ headless: this.headlessValue,
172
+ onLine: (line) => this.note(`installer: ${line}`),
173
+ });
174
+ this.game = game;
175
+ if (game.names.kind === 'unsupported')
176
+ this.note(`probe disabled: ${game.names.reason}`);
177
+ const loader = game.loader ? ` with ${game.loader.kind} ${game.loader.build}` : '';
178
+ this.note(`java ${game.java.version} (${game.java.path}) for Minecraft ${game.json.id}${loader}`);
179
+ this.mods = game.loader ? await resolveMods(this.paths, this.options.mods ?? [], game.json.id, game.loader.kind) : [];
180
+ await syncMods(this.gameDir, this.mods);
181
+ for (const m of this.mods)
182
+ this.note(`mod ${m.name} (${m.source})`);
183
+ }
184
+ resolveHeadless() {
185
+ if (this.render === 'off')
186
+ return true;
187
+ if (this.account.type === 'offline' && process.platform !== 'linux') {
188
+ this.note('offline accounts can only render on Linux with Xvfb (HeadlessMC policy); running headless — use a Microsoft account for screenshots');
189
+ return true;
190
+ }
191
+ return false;
192
+ }
193
+ async launch() {
194
+ const { json, java, loader, names, hmcJar } = this.game;
195
+ const probeJar = await installProbe(this.paths);
196
+ if (this.server) {
197
+ this.setPhase('waiting_for_server');
198
+ const deadline = Date.now() + (this.options.waitForServerMs ?? 120_000);
199
+ while (!(await tcpReachable(this.server.host, this.server.port))) {
200
+ if (this.stopping)
201
+ throw new CalciteError('stopped', 'Stopped while waiting for the server');
202
+ if (Date.now() > deadline)
203
+ throw new CalciteError('server_unreachable', `Server ${this.server.host}:${this.server.port} is not reachable`);
204
+ await sleep(2000);
205
+ }
206
+ }
207
+ // probe endpoint + config (paths inside may contain spaces; the config file itself lives in a safe dir)
208
+ this.probe = new ProbeServer();
209
+ await this.probe.listen();
210
+ this.probe.on('connected', () => this.onProbeConnected());
211
+ this.probe.on('disconnected', () => this.note('probe disconnected'));
212
+ this.probeConfig = join(this.paths.probe, `${this.options.name}-${randomBytes(6).toString('hex')}.properties`);
213
+ const cfg = [
214
+ `port=${this.probe.port}`,
215
+ `token=${this.probe.token}`,
216
+ // name tables the probe tries in order (a mapping file or "official")
217
+ ...(names.kind === 'probe' ? names.candidates.map((c, i) => `mappings.${i + 1}=${propValue(c)}`) : []),
218
+ `headless=${this.headlessValue}`,
219
+ `render=${this.render === 'always' ? 'on' : 'off'}`,
220
+ 'exitOnDisconnect=true',
221
+ '',
222
+ ].join('\n');
223
+ await mkdir(this.paths.probe, { recursive: true });
224
+ await writeFile(this.probeConfig, cfg, { mode: 0o600 });
225
+ await writeOptions(this.gameDir, defaultOptions({ renderDistance: this.options.renderDistance, maxFps: this.options.maxFps }));
226
+ let displayEnv = {};
227
+ let virtualDisplay = false;
228
+ if (!this.headlessValue) {
229
+ // offline accounts may only render on a virtual display (HeadlessMC); on-demand clients stay invisible when Xvfb exists
230
+ this.display = await acquireDisplay({ forceVirtual: this.account.type === 'offline' || (this.render === 'on-demand' && which('Xvfb') !== null) });
231
+ displayEnv = this.display.env;
232
+ virtualDisplay = this.display.virtual;
233
+ }
234
+ const proxyArgs = Object.entries(javaProxyProps()).map(([k, v]) => `-D${k}=${v}`);
235
+ const jvmArgs = [`-Xmx${this.options.memory ?? '2G'}`, ...proxyArgs, ...(this.options.jvmArgs ?? [])];
236
+ if (names.kind !== 'unsupported')
237
+ jvmArgs.unshift(`-javaagent:${probeJar}=${this.probeConfig}`);
238
+ // HeadlessMC's stubbed LWJGL buffers have no native address; JOML's Unsafe path writes to it and crashes the JVM
239
+ if (this.headlessValue)
240
+ jvmArgs.unshift('-Djoml.nounsafe=true');
241
+ const gameArgs = [...(this.options.gameArgs ?? [])];
242
+ if (this.server) {
243
+ if (supportsQuickPlay(json))
244
+ gameArgs.unshift('--quickPlayMultiplayer', `${this.server.host}:${this.server.port}`);
245
+ else
246
+ gameArgs.unshift('--server', this.server.host, '--port', String(this.server.port));
247
+ }
248
+ const offline = this.account.type === 'offline';
249
+ // a private HeadlessMC location per client: its own account selection, config and caches
250
+ const location = join(this.gameDir, '.headlessmc');
251
+ let accountName;
252
+ try {
253
+ accountName = await prepareAccount(this.paths, location, this.account);
254
+ }
255
+ catch (err) {
256
+ const code = err.code;
257
+ throw code ? new CalciteError(code, err.message) : err;
258
+ }
259
+ await writeHmcProfile(location, json.id, this.gameDir, java.major, loader);
260
+ const props = {
261
+ 'hmc.files.mc': this.paths.minecraft,
262
+ 'hmc.files.game': this.gameDir,
263
+ 'hmc.java.versions': hmcListEntry(java.path),
264
+ 'hmc.java.download': 'false',
265
+ // HeadlessMC only lets offline accounts render when it sees Xvfb running
266
+ 'hmc.xvfb.check': String(virtualDisplay),
267
+ };
268
+ const command = [
269
+ 'launch',
270
+ ...hmcVersionArgs(json.id, loader),
271
+ ...(offline ? ['--offline'] : []),
272
+ ...(this.headlessValue ? ['--headless'] : []),
273
+ `--jvm=${jvmArgs.map(hmcQuote).join(' ')}`,
274
+ ...(gameArgs.length ? [`--game=${gameArgs.map(hmcQuote).join(' ')}`] : []),
275
+ ];
276
+ const env = { ...process.env, ...displayEnv };
277
+ const sync = () => {
278
+ if (!offline)
279
+ void syncAccount(this.paths, location, accountName).catch((err) => this.note(`account sync failed: ${err.message}`));
280
+ };
281
+ this.setPhase('starting');
282
+ this.joinRequested = false;
283
+ this.startedAt = Date.now();
284
+ const spawnGame = async () => {
285
+ let launched;
286
+ const launchedPromise = new Promise((r) => (launched = r));
287
+ // 26.x+: when no graphics backend can be created the game opens a modal error box and blocks forever
288
+ const backendErrors = [];
289
+ let backendTimer;
290
+ const noBackend = () => {
291
+ if (run !== this.run || this.stopping)
292
+ return;
293
+ const hint = process.platform === 'linux'
294
+ ? ' On Linux without a GPU install Mesa EGL (apt install libegl1 libegl-mesa0) or Vulkan (apt install mesa-vulkan-drivers), or use render "off".'
295
+ : ' Update the graphics drivers, or use render "off".';
296
+ this.fatalCode = 'renderer_unavailable';
297
+ this.lastError = `No graphics backend could be created: ${backendErrors.join('; ')}.${hint}`;
298
+ this.note(this.lastError);
299
+ this.setPhase('crashed');
300
+ void killTree(run.child);
301
+ };
302
+ this.run = runHmc({
303
+ javaPath: this.game.launcherJava.path,
304
+ hmcJar,
305
+ location,
306
+ props,
307
+ command,
308
+ env,
309
+ onLine: (line) => {
310
+ this.pushLog('game', line);
311
+ if (/Setting user:|Minecraft exited|LWJGL Version|Backend library/i.test(line))
312
+ launched();
313
+ const failure = /BackendCreationException: (.*)/.exec(line);
314
+ if (failure) {
315
+ backendErrors.push(failure[1].trim());
316
+ clearTimeout(backendTimer);
317
+ backendTimer = setTimeout(noBackend, 20_000);
318
+ }
319
+ else if (/Using graphics backend/.test(line))
320
+ clearTimeout(backendTimer);
321
+ },
322
+ });
323
+ const run = this.run;
324
+ void run.exited.then(() => clearTimeout(backendTimer));
325
+ void run.exited.then((code) => {
326
+ sync();
327
+ this.onGameExit(run, code);
328
+ });
329
+ // the session HeadlessMC refreshed before launching goes back to the shared store
330
+ void launchedPromise.then(sync);
331
+ };
332
+ await spawnGame();
333
+ }
334
+ async onProbeConnected() {
335
+ this.note('probe connected');
336
+ if (this.phaseValue === 'starting' || this.phaseValue === 'reconnecting')
337
+ this.setPhase('connecting');
338
+ if (!this.poller) {
339
+ this.poller = setInterval(() => void this.poll(), 1000);
340
+ }
341
+ }
342
+ async poll() {
343
+ if (!this.probe?.connected)
344
+ return;
345
+ let state;
346
+ try {
347
+ state = await this.probe.request('state', {}, 10_000);
348
+ }
349
+ catch (err) {
350
+ if (err instanceof ProbeError && err.code === 'not_ready')
351
+ return;
352
+ return;
353
+ }
354
+ const prev = this.lastState;
355
+ this.lastState = state;
356
+ if (JSON.stringify(prev) !== JSON.stringify(state))
357
+ this.emit('state', state);
358
+ if (state.screen && /LoadingErrorScreen|ModLoadingError/.test(state.screen) && !this.fatalCode && this.run) {
359
+ // Forge/NeoForge stay on an error screen when mods fail to load; relaunching would not help
360
+ const errors = this.logs.filter((l) => l.source === 'game' && /\/(ERROR|FATAL)\]|Exception|[Mm]issing|requires/.test(l.line)).slice(-12);
361
+ this.fatalCode = 'mod_loading_failed';
362
+ this.lastError = `Mod loading failed (${state.screen}); check the mods and the loader version:\n${errors.map((l) => l.line).join('\n')}`;
363
+ this.note(this.lastError);
364
+ this.setPhase('crashed');
365
+ void killTree(this.run.child);
366
+ return;
367
+ }
368
+ if (state.inGame && !state.loading && !LOADING_SCREEN.test(state.screen ?? '')) {
369
+ if (this.phaseValue !== 'in_game') {
370
+ this.inGameSince = Date.now();
371
+ this.everInGame = true;
372
+ this.setPhase('in_game');
373
+ }
374
+ else if (this.reconnects > 0 && Date.now() - this.inGameSince > 60_000) {
375
+ this.reconnects = 0; // stable again
376
+ }
377
+ }
378
+ else if (this.server &&
379
+ !this.joinRequested &&
380
+ this.phaseValue === 'connecting' &&
381
+ state.screen === 'TitleScreen' &&
382
+ !state.loading) {
383
+ // Pre-1.20 versions may ignore --server (e.g. 1.16.4+ when multiplayer privileges cannot be checked)
384
+ this.joinRequested = true;
385
+ this.note(`joining ${this.server.host}:${this.server.port} from the title screen`);
386
+ this.probe.request('connect', { host: this.server.host, port: this.server.port }).catch((err) => this.note(`join failed: ${err.message}`));
387
+ }
388
+ else if (state.screen === 'DisconnectedScreen' && this.phaseValue !== 'disconnected' && this.phaseValue !== 'reconnecting') {
389
+ this.lastError = `Disconnected: ${state.disconnectReason ?? 'unknown reason'}`;
390
+ this.setPhase('disconnected');
391
+ void this.maybeReconnect();
392
+ }
393
+ }
394
+ reconnectLimit() {
395
+ const r = this.options.reconnect;
396
+ if (r === false)
397
+ return 0;
398
+ if (typeof r === 'object')
399
+ return r.maxAttempts ?? 10;
400
+ return 10;
401
+ }
402
+ async maybeReconnect() {
403
+ if (this.stopping || this.relaunching || !this.server)
404
+ return;
405
+ if (this.reconnects >= this.reconnectLimit()) {
406
+ this.note(`not reconnecting: ${this.reconnects} attempts used`);
407
+ return;
408
+ }
409
+ this.relaunching = true;
410
+ try {
411
+ this.reconnects++;
412
+ const delay = Math.min(5000 * 2 ** (this.reconnects - 1), 60_000);
413
+ this.setPhase('reconnecting');
414
+ this.note(`reconnecting in ${delay}ms (attempt ${this.reconnects})`);
415
+ if (this.run)
416
+ await killTree(this.run.child);
417
+ await sleep(delay);
418
+ if (this.stopping)
419
+ return;
420
+ await this.cleanupRun();
421
+ await this.launch();
422
+ }
423
+ catch (err) {
424
+ this.lastError = err.message;
425
+ this.setPhase('crashed');
426
+ }
427
+ finally {
428
+ this.relaunching = false;
429
+ }
430
+ }
431
+ onGameExit(run, code) {
432
+ if (run !== this.run)
433
+ return; // an older run
434
+ this.emit('exit', code);
435
+ this.note(`game process exited with code ${code}`);
436
+ if (this.stopping || this.relaunching || this.fatalCode)
437
+ return;
438
+ const tail = this.logs.filter((l) => l.source === 'game').slice(-15).map((l) => l.line).join('\n');
439
+ this.lastError = `Game exited with code ${code}${tail ? `:\n${tail}` : ''}`;
440
+ this.setPhase('crashed');
441
+ // a crash during the very first start is reported to start(); later crashes are retried
442
+ if (this.everInGame)
443
+ void this.maybeReconnect();
444
+ }
445
+ async waitUntilStarted(timeoutMs) {
446
+ const deadline = Date.now() + timeoutMs;
447
+ for (;;) {
448
+ const phase = this.phaseValue;
449
+ if (phase === 'in_game')
450
+ return;
451
+ if (!this.server && this.lastState?.ready && this.lastState.loading === false && phase === 'connecting')
452
+ return;
453
+ if (phase === 'crashed')
454
+ throw new CalciteError(this.fatalCode ?? 'crashed', this.lastError ?? 'The game crashed during startup');
455
+ if (phase === 'disconnected' && this.reconnectLimit() === 0)
456
+ throw new CalciteError('disconnected', this.lastError ?? 'Disconnected');
457
+ if (Date.now() > deadline)
458
+ throw new CalciteError('start_timeout', `Client did not start within ${timeoutMs}ms (phase ${phase})`);
459
+ await sleep(250);
460
+ }
461
+ }
462
+ async cleanupRun() {
463
+ if (this.poller) {
464
+ clearInterval(this.poller);
465
+ this.poller = null;
466
+ }
467
+ if (this.run) {
468
+ await killTree(this.run.child);
469
+ this.run = null;
470
+ }
471
+ if (this.probe) {
472
+ await this.probe.close();
473
+ this.probe = null;
474
+ }
475
+ if (this.probeConfig) {
476
+ await rm(this.probeConfig, { force: true });
477
+ this.probeConfig = null;
478
+ }
479
+ this.display?.release();
480
+ this.display = null;
481
+ this.lastState = undefined;
482
+ }
483
+ async shutdown(final) {
484
+ this.stopping = true;
485
+ await this.cleanupRun();
486
+ if (this.releaseInstance) {
487
+ await this.releaseInstance();
488
+ this.releaseInstance = null;
489
+ }
490
+ this.setPhase(final);
491
+ }
492
+ /** Stops the game and releases all resources. */
493
+ async stop() {
494
+ if (this.phaseValue === 'stopped' || this.phaseValue === 'idle')
495
+ return;
496
+ this.setPhase('stopping');
497
+ await this.shutdown('stopped');
498
+ }
499
+ status() {
500
+ return {
501
+ name: this.options.name,
502
+ version: this.game?.json.id ?? this.options.version,
503
+ loader: this.game?.loader ? `${this.game.loader.kind}@${this.game.loader.build}` : this.options.loader,
504
+ mods: this.mods.length ? this.mods.map((m) => m.name) : undefined,
505
+ phase: this.phaseValue,
506
+ render: this.render,
507
+ headless: this.headlessValue,
508
+ account: this.account,
509
+ server: this.server,
510
+ gameDir: this.gameDir,
511
+ pid: this.run?.child.pid,
512
+ java: this.game?.java.version,
513
+ startedAt: this.startedAt,
514
+ reconnects: this.reconnects,
515
+ lastError: this.lastError,
516
+ probeConnected: !!this.probe?.connected,
517
+ game: this.lastState,
518
+ };
519
+ }
520
+ // ------------------------------------------------------------------ operations
521
+ requireProbe() {
522
+ if (this.game?.names.kind === 'unsupported') {
523
+ throw new CalciteError('unsupported_version', this.game.names.reason);
524
+ }
525
+ if (!this.probe?.connected)
526
+ throw new CalciteError('not_connected', `Client "${this.options.name}" is not running (phase ${this.phaseValue})`);
527
+ return this.probe;
528
+ }
529
+ }
530
+ //# sourceMappingURL=client-core.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client-core.js","sourceRoot":"","sources":["../src/client-core.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAC3C,OAAO,EAAE,KAAK,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC5D,OAAO,EAAE,cAAc,EAAE,KAAK,EAAqB,MAAM,cAAc,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,QAAQ,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAe,MAAM,UAAU,CAAC;AAClH,OAAO,EAAE,YAAY,EAAE,WAAW,EAAqB,MAAM,cAAc,CAAC;AAC5E,OAAO,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AACxC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAClC,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAgB,MAAM,WAAW,CAAC;AAChE,OAAO,EAAE,cAAc,EAAE,MAAM,UAAU,CAAC;AAC1C,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AAC5D,OAAO,EAAE,YAAY,EAAqB,MAAM,YAAY,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EACL,YAAY,EACZ,eAAe,EACf,WAAW,GAUZ,MAAM,YAAY,CAAC;AAEpB,MAAM,OAAO,GAAG,wBAAwB,CAAC;AACzC,MAAM,OAAO,GAAG,IAAI,CAAC;AACrB,MAAM,QAAQ,GAAG,IAAI,CAAC;AAEtB,uDAAuD;AACvD,SAAS,SAAS,CAAC,KAAa;IAC9B,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;AACxE,CAAC;AAED,KAAK,UAAU,YAAY,CAAC,IAAY,EAAE,IAAY,EAAE,SAAS,GAAG,IAAI;IACtE,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,MAAM,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;QAC5B,MAAM,IAAI,GAAG,CAAC,EAAW,EAAE,EAAE;YAC3B,MAAM,CAAC,OAAO,EAAE,CAAC;YACjB,OAAO,CAAC,EAAE,CAAC,CAAC;QACd,CAAC,CAAC;QACF,MAAM,CAAC,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QACxC,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;IAC/C,CAAC,CAAC,CAAC;AACL,CAAC;AAED,yFAAyF;AACzF,MAAM,cAAc,GAAG,4FAA4F,CAAC;AAEpH,MAAM,CAAC,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC;AAE3E,0GAA0G;AAC1G,MAAM,OAAgB,UAAW,SAAQ,YAAY;IAC1C,OAAO,CAAoE;IAC3E,KAAK,CAAe;IACpB,OAAO,CAAS;IAChB,MAAM,CAAa;IACnB,OAAO,CAAU;IACjB,MAAM,CAAiB;IAEtB,UAAU,GAAU,MAAM,CAAC;IAC3B,IAAI,GAAc,EAAE,CAAC;IACrB,KAAK,GAAe,EAAE,CAAC;IACvB,GAAG,GAAG,CAAC,CAAC;IACR,KAAK,GAAuB,IAAI,CAAC;IACnC,GAAG,GAAkB,IAAI,CAAC;IAC1B,OAAO,GAAwB,IAAI,CAAC;IACpC,eAAe,GAAiC,IAAI,CAAC;IACrD,WAAW,GAAkB,IAAI,CAAC;IAClC,IAAI,GAAwB,IAAI,CAAC;IACjC,IAAI,GAAc,EAAE,CAAC;IACnB,aAAa,GAAG,KAAK,CAAC;IACtB,SAAS,CAAwB;IACnC,SAAS,CAAqB;IACtC,sGAAsG;IAC9F,SAAS,CAAqB;IAC9B,SAAS,CAAqB;IAC9B,UAAU,GAAG,CAAC,CAAC;IACf,QAAQ,GAAG,KAAK,CAAC;IACjB,MAAM,GAA0B,IAAI,CAAC;IACrC,WAAW,GAAG,CAAC,CAAC;IAChB,WAAW,GAAG,KAAK,CAAC;IACpB,UAAU,GAAG,KAAK,CAAC;IACnB,aAAa,GAAG,KAAK,CAAC;IACb,GAAG,CAAC;IAErB,YAAY,OAAsB;QAChC,KAAK,EAAE,CAAC;QACR,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAChC,MAAM,IAAI,YAAY,CAAC,UAAU,EAAE,wBAAwB,OAAO,CAAC,IAAI,qCAAqC,CAAC,CAAC;QAChH,CAAC;QACD,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,IAAI,CAAC,CAAC;QACxD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,WAAW,CAAC;QAC5C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,EAAE,IAAI,EAAE,SAAS,EAAE,QAAQ,EAAE,eAAe,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;QAC/F,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC3F,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,kEAAkE,IAAI,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACrI,CAAC;QACD,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;QACvE,IAAI,CAAC,WAAW,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,CAAC;YACzD,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,iEAAiE,CAAC,CAAC;QACvG,CAAC;QACD,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC,UAAU,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAC5C,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC,CAAC,CAAC,6DAA6D;IAClG,CAAC;IAED,IAAI,KAAK;QACP,OAAO,IAAI,CAAC,UAAU,CAAC;IACzB,CAAC;IAED,IAAI,QAAQ;QACV,OAAO,IAAI,CAAC,aAAa,CAAC;IAC5B,CAAC;IAEO,QAAQ,CAAC,KAAY;QAC3B,IAAI,KAAK,KAAK,IAAI,CAAC,UAAU;YAAE,OAAO;QACtC,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,WAAW,KAAK,EAAE,CAAC,CAAC;QAC9B,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC5B,CAAC;IAEO,IAAI,CAAC,IAAY;QACvB,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAC9B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC;IAEO,OAAO,CAAC,MAAyB,EAAE,IAAY;QACrD,MAAM,KAAK,GAAY,EAAE,GAAG,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE,IAAI,CAAC,GAAG,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;QAC3E,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC;QAChF,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QACxB,IAAI,MAAM,KAAK,MAAM,EAAE,CAAC;YACtB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACzC,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,CAAC,GAAa,EAAE,GAAG,EAAE,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC3E,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBACnB,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ;oBAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,QAAQ,CAAC,CAAC;gBACrF,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;YACvB,CAAC;QACH,CAAC;IACH,CAAC;IAED,+EAA+E;IAE/E;;;OAGG;IACH,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC;YAC9D,MAAM,IAAI,YAAY,CAAC,iBAAiB,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,gBAAgB,IAAI,CAAC,UAAU,EAAE,CAAC,CAAC;QAC3G,CAAC;QACD,IAAI,CAAC,QAAQ,GAAG,KAAK,CAAC;QACtB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QACxB,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,cAAc,IAAI,EAAE,GAAG,MAAM,CAAC;QAC3D,IAAI,CAAC;YACH,IAAI,CAAC,eAAe,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,eAAe,CAAC,EAAE,EAAE,SAAS,EAAE,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,yCAAyC,CAAC,CAAC;QACjH,CAAC;QACD,IAAI,CAAC;YACH,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;YACpB,MAAM,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC,MAAM,EAAE,CAAC;QACvB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,GAAI,GAAa,CAAC,OAAO,CAAC;YACxC,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC/B,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED,uEAAuE;IACvE,KAAK,CAAC,OAAO;QACX,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QAC3B,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC,eAAe,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE;YACzC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO;YAC7B,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM;YAC3B,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,QAAQ;YAC/B,iBAAiB,EAAE,IAAI,CAAC,OAAO,CAAC,iBAAiB;YACjD,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC;SAClD,CAAC,CAAC;QACH,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC,CAAC;QACzF,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACnF,IAAI,CAAC,IAAI,CAAC,QAAQ,IAAI,CAAC,IAAI,CAAC,OAAO,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,mBAAmB,IAAI,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,CAAC,CAAC;QAClG,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QACtH,MAAM,QAAQ,CAAC,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACxC,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,MAAM,GAAG,CAAC,CAAC;IACtE,CAAC;IAEO,eAAe;QACrB,IAAI,IAAI,CAAC,MAAM,KAAK,KAAK;YAAE,OAAO,IAAI,CAAC;QACvC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;YACpE,IAAI,CAAC,IAAI,CAAC,qIAAqI,CAAC,CAAC;YACjJ,OAAO,IAAI,CAAC;QACd,CAAC;QACD,OAAO,KAAK,CAAC;IACf,CAAC;IAEO,KAAK,CAAC,MAAM;QAClB,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAK,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEhD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,CAAC;YACpC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,eAAe,IAAI,OAAO,CAAC,CAAC;YACxE,OAAO,CAAC,CAAC,MAAM,YAAY,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;gBACjE,IAAI,IAAI,CAAC,QAAQ;oBAAE,MAAM,IAAI,YAAY,CAAC,SAAS,EAAE,sCAAsC,CAAC,CAAC;gBAC7F,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;oBAAE,MAAM,IAAI,YAAY,CAAC,oBAAoB,EAAE,UAAU,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,mBAAmB,CAAC,CAAC;gBAC3I,MAAM,KAAK,CAAC,IAAI,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QAED,wGAAwG;QACxG,IAAI,CAAC,KAAK,GAAG,IAAI,WAAW,EAAE,CAAC;QAC/B,MAAM,IAAI,CAAC,KAAK,CAAC,MAAM,EAAE,CAAC;QAC1B,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,WAAW,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,gBAAgB,EAAE,CAAC,CAAC;QAC1D,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,cAAc,EAAE,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC,CAAC;QACrE,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,WAAW,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;QAC/G,MAAM,GAAG,GAAG;YACV,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE;YACzB,SAAS,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE;YAC3B,sEAAsE;YACtE,GAAG,CAAC,KAAK,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACtG,YAAY,IAAI,CAAC,aAAa,EAAE;YAChC,UAAU,IAAI,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,EAAE;YACnD,uBAAuB;YACvB,EAAE;SACH,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACb,MAAM,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACnD,MAAM,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,GAAG,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QAExD,MAAM,YAAY,CAAC,IAAI,CAAC,OAAO,EAAE,cAAc,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,OAAO,CAAC,cAAc,EAAE,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC;QAE/H,IAAI,UAAU,GAA2B,EAAE,CAAC;QAC5C,IAAI,cAAc,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,CAAC;YACxB,wHAAwH;YACxH,IAAI,CAAC,OAAO,GAAG,MAAM,cAAc,CAAC,EAAE,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,WAAW,IAAI,KAAK,CAAC,MAAM,CAAC,KAAK,IAAI,CAAC,EAAE,CAAC,CAAC;YAClJ,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC;YAC9B,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC;QACxC,CAAC;QAED,MAAM,SAAS,GAAG,MAAM,CAAC,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClF,MAAM,OAAO,GAAG,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,EAAE,EAAE,GAAG,SAAS,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,CAAC;QACtG,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa;YAAE,OAAO,CAAC,OAAO,CAAC,cAAc,QAAQ,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC,CAAC;QAChG,iHAAiH;QACjH,IAAI,IAAI,CAAC,aAAa;YAAE,OAAO,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;QAChE,MAAM,QAAQ,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,QAAQ,IAAI,EAAE,CAAC,CAAC,CAAC;QACpD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,IAAI,iBAAiB,CAAC,IAAI,CAAC;gBAAE,QAAQ,CAAC,OAAO,CAAC,wBAAwB,EAAE,GAAG,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC;;gBAC9G,QAAQ,CAAC,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC;QAC1F,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,SAAS,CAAC;QAChD,yFAAyF;QACzF,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,aAAa,CAAC,CAAC;QACnD,IAAI,WAAmB,CAAC;QACxB,IAAI,CAAC;YACH,WAAW,GAAG,MAAM,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACzE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,IAAI,GAAI,GAAyB,CAAC,IAAI,CAAC;YAC7C,MAAM,IAAI,CAAC,CAAC,CAAC,IAAI,YAAY,CAAC,IAAI,EAAG,GAAa,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;QACpE,CAAC;QACD,MAAM,eAAe,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,OAAO,EAAE,IAAI,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAC3E,MAAM,KAAK,GAA2B;YACpC,cAAc,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS;YACpC,gBAAgB,EAAE,IAAI,CAAC,OAAO;YAC9B,mBAAmB,EAAE,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5C,mBAAmB,EAAE,OAAO;YAC5B,yEAAyE;YACzE,gBAAgB,EAAE,MAAM,CAAC,cAAc,CAAC;SACzC,CAAC;QACF,MAAM,OAAO,GAAG;YACd,QAAQ;YACR,GAAG,cAAc,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC;YAClC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YACjC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC7C,SAAS,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;YAC1C,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,UAAU,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAC3E,CAAC;QACF,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,UAAU,EAAE,CAAC;QAC9C,MAAM,IAAI,GAAG,GAAG,EAAE;YAChB,IAAI,CAAC,OAAO;gBAAE,KAAK,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,WAAW,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,wBAAyB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QAChJ,CAAC,CAAC;QAEF,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1B,IAAI,CAAC,aAAa,GAAG,KAAK,CAAC;QAC3B,IAAI,CAAC,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC5B,MAAM,SAAS,GAAG,KAAK,IAAI,EAAE;YAC3B,IAAI,QAAqB,CAAC;YAC1B,MAAM,eAAe,GAAG,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,CAAC;YACjE,qGAAqG;YACrG,MAAM,aAAa,GAAa,EAAE,CAAC;YACnC,IAAI,YAAwC,CAAC;YAC7C,MAAM,SAAS,GAAG,GAAG,EAAE;gBACrB,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,QAAQ;oBAAE,OAAO;gBAC9C,MAAM,IAAI,GACR,OAAO,CAAC,QAAQ,KAAK,OAAO;oBAC1B,CAAC,CAAC,+IAA+I;oBACjJ,CAAC,CAAC,oDAAoD,CAAC;gBAC3D,IAAI,CAAC,SAAS,GAAG,sBAAsB,CAAC;gBACxC,IAAI,CAAC,SAAS,GAAG,yCAAyC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC7F,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;gBACzB,KAAK,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC;YACF,IAAI,CAAC,GAAG,GAAG,MAAM,CAAC;gBAChB,QAAQ,EAAE,IAAI,CAAC,IAAK,CAAC,YAAY,CAAC,IAAI;gBACtC,MAAM;gBACN,QAAQ;gBACR,KAAK;gBACL,OAAO;gBACP,GAAG;gBACH,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;oBACf,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;oBAC3B,IAAI,+DAA+D,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,QAAQ,EAAE,CAAC;oBAC3F,MAAM,OAAO,GAAG,gCAAgC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBAC5D,IAAI,OAAO,EAAE,CAAC;wBACZ,aAAa,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;wBACtC,YAAY,CAAC,YAAY,CAAC,CAAC;wBAC3B,YAAY,GAAG,UAAU,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;oBAC/C,CAAC;yBAAM,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;wBAAE,YAAY,CAAC,YAAY,CAAC,CAAC;gBAC7E,CAAC;aACF,CAAC,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACrB,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,YAAY,CAAC,CAAC,CAAC;YACvD,KAAK,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE;gBAC5B,IAAI,EAAE,CAAC;gBACP,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAC7B,CAAC,CAAC,CAAC;YACH,kFAAkF;YAClF,KAAK,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC,CAAC;QAEF,MAAM,SAAS,EAAE,CAAC;IACpB,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,IAAI,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QAC7B,IAAI,IAAI,CAAC,UAAU,KAAK,UAAU,IAAI,IAAI,CAAC,UAAU,KAAK,cAAc;YAAE,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACtG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,GAAG,EAAE,CAAC,KAAK,IAAI,CAAC,IAAI,EAAE,EAAE,IAAI,CAAC,CAAC;QAC1D,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,IAAI;QAChB,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS;YAAE,OAAO;QACnC,IAAI,KAAgB,CAAC;QACrB,IAAI,CAAC;YACH,KAAK,GAAG,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,CAAY,OAAO,EAAE,EAAE,EAAE,MAAM,CAAC,CAAC;QACnE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,YAAY,UAAU,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW;gBAAE,OAAO;YAClE,OAAO;QACT,CAAC;QACD,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC;QAC5B,IAAI,CAAC,SAAS,GAAG,KAAK,CAAC;QACvB,IAAI,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;YAAE,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QAC9E,IAAI,KAAK,CAAC,MAAM,IAAI,oCAAoC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YAC3G,4FAA4F;YAC5F,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,IAAI,iDAAiD,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;YACzI,IAAI,CAAC,SAAS,GAAG,oBAAoB,CAAC;YACtC,IAAI,CAAC,SAAS,GAAG,uBAAuB,KAAK,CAAC,MAAM,8CAA8C,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACzI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;YAC1B,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YACzB,KAAK,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC9B,OAAO;QACT,CAAC;QACD,IAAI,KAAK,CAAC,MAAM,IAAI,CAAC,KAAK,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,EAAE,CAAC,EAAE,CAAC;YAC/E,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,EAAE,CAAC;gBAClC,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;gBAC9B,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;gBACvB,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;YAC3B,CAAC;iBAAM,IAAI,IAAI,CAAC,UAAU,GAAG,CAAC,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,GAAG,MAAM,EAAE,CAAC;gBACzE,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,CAAC,eAAe;YACtC,CAAC;QACH,CAAC;aAAM,IACL,IAAI,CAAC,MAAM;YACX,CAAC,IAAI,CAAC,aAAa;YACnB,IAAI,CAAC,UAAU,KAAK,YAAY;YAChC,KAAK,CAAC,MAAM,KAAK,aAAa;YAC9B,CAAC,KAAK,CAAC,OAAO,EACd,CAAC;YACD,qGAAqG;YACrG,IAAI,CAAC,aAAa,GAAG,IAAI,CAAC;YAC1B,IAAI,CAAC,IAAI,CAAC,WAAW,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,wBAAwB,CAAC,CAAC;YACnF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,gBAAiB,GAAa,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;QACxJ,CAAC;aAAM,IAAI,KAAK,CAAC,MAAM,KAAK,oBAAoB,IAAI,IAAI,CAAC,UAAU,KAAK,cAAc,IAAI,IAAI,CAAC,UAAU,KAAK,cAAc,EAAE,CAAC;YAC7H,IAAI,CAAC,SAAS,GAAG,iBAAiB,KAAK,CAAC,gBAAgB,IAAI,gBAAgB,EAAE,CAAC;YAC/E,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC9B,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;QAC7B,CAAC;IACH,CAAC;IAEO,cAAc;QACpB,MAAM,CAAC,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QACjC,IAAI,CAAC,KAAK,KAAK;YAAE,OAAO,CAAC,CAAC;QAC1B,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,CAAC,CAAC,WAAW,IAAI,EAAE,CAAC;QACtD,OAAO,EAAE,CAAC;IACZ,CAAC;IAEO,KAAK,CAAC,cAAc;QAC1B,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,MAAM;YAAE,OAAO;QAC9D,IAAI,IAAI,CAAC,UAAU,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YAC7C,IAAI,CAAC,IAAI,CAAC,qBAAqB,IAAI,CAAC,UAAU,gBAAgB,CAAC,CAAC;YAChE,OAAO;QACT,CAAC;QACD,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,IAAI,CAAC;YACH,IAAI,CAAC,UAAU,EAAE,CAAC;YAClB,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC;YAClE,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC;YAC9B,IAAI,CAAC,IAAI,CAAC,mBAAmB,KAAK,eAAe,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;YACrE,IAAI,IAAI,CAAC,GAAG;gBAAE,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC7C,MAAM,KAAK,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,IAAI,CAAC,QAAQ;gBAAE,OAAO;YAC1B,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;YACxB,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACtB,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,SAAS,GAAI,GAAa,CAAC,OAAO,CAAC;YACxC,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QAC3B,CAAC;gBAAS,CAAC;YACT,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAC3B,CAAC;IACH,CAAC;IAEO,UAAU,CAAC,GAAW,EAAE,IAAmB;QACjD,IAAI,GAAG,KAAK,IAAI,CAAC,GAAG;YAAE,OAAO,CAAC,eAAe;QAC7C,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;QACxB,IAAI,CAAC,IAAI,CAAC,iCAAiC,IAAI,EAAE,CAAC,CAAC;QACnD,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,WAAW,IAAI,IAAI,CAAC,SAAS;YAAE,OAAO;QAChE,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnG,IAAI,CAAC,SAAS,GAAG,yBAAyB,IAAI,GAAG,IAAI,CAAC,CAAC,CAAC,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;QAC5E,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;QACzB,wFAAwF;QACxF,IAAI,IAAI,CAAC,UAAU;YAAE,KAAK,IAAI,CAAC,cAAc,EAAE,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,gBAAgB,CAAC,SAAiB;QAC9C,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;QACxC,SAAS,CAAC;YACR,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC;YAC9B,IAAI,KAAK,KAAK,SAAS;gBAAE,OAAO;YAChC,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,SAAS,EAAE,KAAK,IAAI,IAAI,CAAC,SAAS,CAAC,OAAO,KAAK,KAAK,IAAI,KAAK,KAAK,YAAY;gBAAE,OAAO;YAChH,IAAI,KAAK,KAAK,SAAS;gBAAE,MAAM,IAAI,YAAY,CAAC,IAAI,CAAC,SAAS,IAAI,SAAS,EAAC,IAAI,CAAC,SAAS,IAAI,iCAAiC,CAAC,CAAC;YACjI,IAAI,KAAK,KAAK,cAAc,IAAI,IAAI,CAAC,cAAc,EAAE,KAAK,CAAC;gBAAE,MAAM,IAAI,YAAY,CAAC,cAAc,EAAE,IAAI,CAAC,SAAS,IAAI,cAAc,CAAC,CAAC;YACtI,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ;gBAAE,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,+BAA+B,SAAS,aAAa,KAAK,GAAG,CAAC,CAAC;YAClI,MAAM,KAAK,CAAC,GAAG,CAAC,CAAC;QACnB,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU;QACtB,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,aAAa,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC3B,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACrB,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAC/B,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC;QAClB,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QACpB,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YAC5C,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QAC1B,CAAC;QACD,IAAI,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC;QACxB,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;QACpB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAY;QACjC,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC;QACrB,MAAM,IAAI,CAAC,UAAU,EAAE,CAAC;QACxB,IAAI,IAAI,CAAC,eAAe,EAAE,CAAC;YACzB,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;YAC7B,IAAI,CAAC,eAAe,GAAG,IAAI,CAAC;QAC9B,CAAC;QACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IACvB,CAAC;IAED,iDAAiD;IACjD,KAAK,CAAC,IAAI;QACR,IAAI,IAAI,CAAC,UAAU,KAAK,SAAS,IAAI,IAAI,CAAC,UAAU,KAAK,MAAM;YAAE,OAAO;QACxE,IAAI,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC1B,MAAM,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC;IACjC,CAAC;IAED,MAAM;QACJ,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YACvB,OAAO,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,OAAO,CAAC,OAAO;YACnD,MAAM,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YACtG,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;YACjE,KAAK,EAAE,IAAI,CAAC,UAAU;YACtB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,QAAQ,EAAE,IAAI,CAAC,aAAa;YAC5B,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,MAAM,EAAE,IAAI,CAAC,MAAM;YACnB,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,GAAG;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,OAAO;YAC7B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,cAAc,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS;YACvC,IAAI,EAAE,IAAI,CAAC,SAAS;SACrB,CAAC;IACJ,CAAC;IAED,gFAAgF;IAEtE,YAAY;QACpB,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,KAAK,aAAa,EAAE,CAAC;YAC5C,MAAM,IAAI,YAAY,CAAC,qBAAqB,EAAE,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;QACxE,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,KAAK,EAAE,SAAS;YAAE,MAAM,IAAI,YAAY,CAAC,eAAe,EAAE,WAAW,IAAI,CAAC,OAAO,CAAC,IAAI,2BAA2B,IAAI,CAAC,UAAU,GAAG,CAAC,CAAC;QAC/I,OAAO,IAAI,CAAC,KAAK,CAAC;IACpB,CAAC;CACF"}