mcp-twin 1.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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * MCP Twin Manager - TypeScript Port
3
+ * Zero-downtime MCP server updates via twin/hot-swap architecture
4
+ */
5
+ interface TwinResult {
6
+ ok: boolean;
7
+ [key: string]: any;
8
+ }
9
+ /**
10
+ * MCPTwinManager - Manages twin MCP servers for zero-downtime updates
11
+ */
12
+ export declare class MCPTwinManager {
13
+ private twins;
14
+ private config;
15
+ private processes;
16
+ constructor();
17
+ private ensureDirs;
18
+ private loadConfig;
19
+ private defaultConfig;
20
+ private saveConfig;
21
+ private saveState;
22
+ private restoreState;
23
+ private processAlive;
24
+ private healthCheck;
25
+ private startServer;
26
+ private stopServer;
27
+ private sleep;
28
+ startTwins(serverName: string): Promise<TwinResult>;
29
+ reloadStandby(serverName: string): Promise<TwinResult>;
30
+ swapActive(serverName: string): Promise<TwinResult>;
31
+ stopTwins(serverName: string): Promise<TwinResult>;
32
+ getActivePort(serverName: string): number | null;
33
+ status(serverName?: string): Promise<TwinResult>;
34
+ getConfig(): TwinResult;
35
+ addServer(name: string, script: string, ports: [number, number]): TwinResult;
36
+ removeServer(name: string): TwinResult;
37
+ }
38
+ export declare function getTwinManager(): MCPTwinManager;
39
+ export default MCPTwinManager;
40
+ //# sourceMappingURL=twin-manager.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twin-manager.d.ts","sourceRoot":"","sources":["../src/twin-manager.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAuDH,UAAU,UAAU;IAClB,EAAE,EAAE,OAAO,CAAC;IACZ,CAAC,GAAG,EAAE,MAAM,GAAG,GAAG,CAAC;CACpB;AAQD;;GAEG;AACH,qBAAa,cAAc;IACzB,OAAO,CAAC,KAAK,CAAsC;IACnD,OAAO,CAAC,MAAM,CAAa;IAC3B,OAAO,CAAC,SAAS,CAAwC;;IAQzD,OAAO,CAAC,UAAU;IAQlB,OAAO,CAAC,UAAU;IAalB,OAAO,CAAC,aAAa;IAcrB,OAAO,CAAC,UAAU;IAIlB,OAAO,CAAC,SAAS;IAoBjB,OAAO,CAAC,YAAY;IA2BpB,OAAO,CAAC,YAAY;YASN,WAAW;IA8BzB,OAAO,CAAC,WAAW;YA+BL,UAAU;IAyBxB,OAAO,CAAC,KAAK;IAMP,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAsEnD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IA0DtD,UAAU,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAqCnD,SAAS,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAuBxD,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI;IAY1C,MAAM,CAAC,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC;IAiEtD,SAAS,IAAI,UAAU;IAQvB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,GAAG,UAAU;IAuB5E,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU;CAiBvC;AAKD,wBAAgB,cAAc,IAAI,cAAc,CAK/C;AAED,eAAe,cAAc,CAAC"}
@@ -0,0 +1,518 @@
1
+ "use strict";
2
+ /**
3
+ * MCP Twin Manager - TypeScript Port
4
+ * Zero-downtime MCP server updates via twin/hot-swap architecture
5
+ */
6
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
7
+ if (k2 === undefined) k2 = k;
8
+ var desc = Object.getOwnPropertyDescriptor(m, k);
9
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
10
+ desc = { enumerable: true, get: function() { return m[k]; } };
11
+ }
12
+ Object.defineProperty(o, k2, desc);
13
+ }) : (function(o, m, k, k2) {
14
+ if (k2 === undefined) k2 = k;
15
+ o[k2] = m[k];
16
+ }));
17
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
18
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
19
+ }) : function(o, v) {
20
+ o["default"] = v;
21
+ });
22
+ var __importStar = (this && this.__importStar) || (function () {
23
+ var ownKeys = function(o) {
24
+ ownKeys = Object.getOwnPropertyNames || function (o) {
25
+ var ar = [];
26
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
27
+ return ar;
28
+ };
29
+ return ownKeys(o);
30
+ };
31
+ return function (mod) {
32
+ if (mod && mod.__esModule) return mod;
33
+ var result = {};
34
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
35
+ __setModuleDefault(result, mod);
36
+ return result;
37
+ };
38
+ })();
39
+ Object.defineProperty(exports, "__esModule", { value: true });
40
+ exports.MCPTwinManager = void 0;
41
+ exports.getTwinManager = getTwinManager;
42
+ const child_process_1 = require("child_process");
43
+ const fs = __importStar(require("fs"));
44
+ const path = __importStar(require("path"));
45
+ const net = __importStar(require("net"));
46
+ const os = __importStar(require("os"));
47
+ var ServerState;
48
+ (function (ServerState) {
49
+ ServerState["STOPPED"] = "stopped";
50
+ ServerState["STARTING"] = "starting";
51
+ ServerState["RUNNING"] = "running";
52
+ ServerState["FAILED"] = "failed";
53
+ ServerState["RELOADING"] = "reloading";
54
+ })(ServerState || (ServerState = {}));
55
+ // Paths
56
+ const CONFIG_DIR = path.join(os.homedir(), '.mcp-twin');
57
+ const CONFIG_FILE = path.join(CONFIG_DIR, 'config.json');
58
+ const STATE_FILE = path.join(CONFIG_DIR, 'state.json');
59
+ const LOG_DIR = path.join(CONFIG_DIR, 'logs');
60
+ /**
61
+ * MCPTwinManager - Manages twin MCP servers for zero-downtime updates
62
+ */
63
+ class MCPTwinManager {
64
+ constructor() {
65
+ this.twins = new Map();
66
+ this.processes = new Map();
67
+ this.ensureDirs();
68
+ this.config = this.loadConfig();
69
+ this.restoreState();
70
+ }
71
+ ensureDirs() {
72
+ [CONFIG_DIR, LOG_DIR].forEach(dir => {
73
+ if (!fs.existsSync(dir)) {
74
+ fs.mkdirSync(dir, { recursive: true });
75
+ }
76
+ });
77
+ }
78
+ loadConfig() {
79
+ if (fs.existsSync(CONFIG_FILE)) {
80
+ try {
81
+ return JSON.parse(fs.readFileSync(CONFIG_FILE, 'utf8'));
82
+ }
83
+ catch {
84
+ return this.defaultConfig();
85
+ }
86
+ }
87
+ const config = this.defaultConfig();
88
+ this.saveConfig(config);
89
+ return config;
90
+ }
91
+ defaultConfig() {
92
+ return {
93
+ servers: {}, // Will be populated by auto-detect
94
+ settings: {
95
+ autoHealthCheck: true,
96
+ healthCheckInterval: 30,
97
+ autoRestartOnFailure: true,
98
+ maxRestartAttempts: 3,
99
+ startupWait: 2000,
100
+ shutdownTimeout: 5000
101
+ }
102
+ };
103
+ }
104
+ saveConfig(config) {
105
+ fs.writeFileSync(CONFIG_FILE, JSON.stringify(config || this.config, null, 2));
106
+ }
107
+ saveState() {
108
+ const state = {};
109
+ this.twins.forEach((twin, name) => {
110
+ state[name] = {
111
+ name: twin.name,
112
+ scriptPath: twin.scriptPath,
113
+ portA: twin.portA,
114
+ portB: twin.portB,
115
+ active: twin.active,
116
+ stateA: twin.stateA,
117
+ stateB: twin.stateB,
118
+ pidA: twin.pidA,
119
+ pidB: twin.pidB,
120
+ lastSwap: twin.lastSwap,
121
+ reloadCount: twin.reloadCount
122
+ };
123
+ });
124
+ fs.writeFileSync(STATE_FILE, JSON.stringify(state, null, 2));
125
+ }
126
+ restoreState() {
127
+ if (!fs.existsSync(STATE_FILE))
128
+ return;
129
+ try {
130
+ const state = JSON.parse(fs.readFileSync(STATE_FILE, 'utf8'));
131
+ Object.entries(state).forEach(([name, data]) => {
132
+ // Verify processes are still alive
133
+ const stateA = data.pidA && this.processAlive(data.pidA)
134
+ ? ServerState.RUNNING : ServerState.STOPPED;
135
+ const stateB = data.pidB && this.processAlive(data.pidB)
136
+ ? ServerState.RUNNING : ServerState.STOPPED;
137
+ this.twins.set(name, {
138
+ ...data,
139
+ stateA,
140
+ stateB,
141
+ pidA: stateA === ServerState.RUNNING ? data.pidA : null,
142
+ pidB: stateB === ServerState.RUNNING ? data.pidB : null,
143
+ errorA: null,
144
+ errorB: null
145
+ });
146
+ });
147
+ }
148
+ catch (err) {
149
+ console.error('[MCPTwin] Failed to restore state:', err);
150
+ }
151
+ }
152
+ processAlive(pid) {
153
+ try {
154
+ process.kill(pid, 0);
155
+ return true;
156
+ }
157
+ catch {
158
+ return false;
159
+ }
160
+ }
161
+ async healthCheck(port, pid) {
162
+ // Check PID first (works for stdio MCP servers)
163
+ if (pid && this.processAlive(pid)) {
164
+ return true;
165
+ }
166
+ // TCP port check (works for HTTP servers)
167
+ return new Promise(resolve => {
168
+ const socket = new net.Socket();
169
+ socket.setTimeout(2000);
170
+ socket.on('connect', () => {
171
+ socket.destroy();
172
+ resolve(true);
173
+ });
174
+ socket.on('timeout', () => {
175
+ socket.destroy();
176
+ resolve(false);
177
+ });
178
+ socket.on('error', () => {
179
+ socket.destroy();
180
+ resolve(false);
181
+ });
182
+ socket.connect(port, 'localhost');
183
+ });
184
+ }
185
+ startServer(script, port, serverName, slot) {
186
+ if (!fs.existsSync(script)) {
187
+ return null;
188
+ }
189
+ const logFile = path.join(LOG_DIR, `${serverName}_${slot}.log`);
190
+ const logStream = fs.createWriteStream(logFile, { flags: 'a' });
191
+ const cfg = this.config.servers[serverName] || {};
192
+ const pythonCmd = cfg.python || 'python3';
193
+ try {
194
+ // All twin servers run in HTTP mode for hot-swap support
195
+ const proc = (0, child_process_1.spawn)(pythonCmd, [script, '--http', '--port', String(port)], {
196
+ cwd: path.dirname(script),
197
+ detached: true,
198
+ stdio: ['ignore', logStream, logStream]
199
+ });
200
+ proc.unref();
201
+ const key = `${serverName}_${slot}`;
202
+ this.processes.set(key, proc);
203
+ return proc.pid || null;
204
+ }
205
+ catch (err) {
206
+ console.error(`[MCPTwin] Failed to start ${serverName}_${slot}:`, err);
207
+ return null;
208
+ }
209
+ }
210
+ async stopServer(pid, timeout = 5000) {
211
+ if (!pid || !this.processAlive(pid)) {
212
+ return true;
213
+ }
214
+ try {
215
+ process.kill(pid, 'SIGTERM');
216
+ // Wait for graceful shutdown
217
+ const start = Date.now();
218
+ while (Date.now() - start < timeout) {
219
+ if (!this.processAlive(pid)) {
220
+ return true;
221
+ }
222
+ await this.sleep(100);
223
+ }
224
+ // Force kill
225
+ process.kill(pid, 'SIGKILL');
226
+ return true;
227
+ }
228
+ catch {
229
+ return false;
230
+ }
231
+ }
232
+ sleep(ms) {
233
+ return new Promise(resolve => setTimeout(resolve, ms));
234
+ }
235
+ // === PUBLIC API ===
236
+ async startTwins(serverName) {
237
+ if (!this.config.servers[serverName]) {
238
+ return {
239
+ ok: false,
240
+ error: `Unknown server: ${serverName}. Available: ${Object.keys(this.config.servers).join(', ')}`
241
+ };
242
+ }
243
+ if (this.twins.has(serverName)) {
244
+ const twin = this.twins.get(serverName);
245
+ if (twin.stateA === ServerState.RUNNING || twin.stateB === ServerState.RUNNING) {
246
+ return {
247
+ ok: false,
248
+ error: `Twins already running for ${serverName}. Use 'twin stop ${serverName}' first.`
249
+ };
250
+ }
251
+ }
252
+ const cfg = this.config.servers[serverName];
253
+ const script = cfg.script.replace('~', os.homedir());
254
+ if (!fs.existsSync(script)) {
255
+ return { ok: false, error: `Script not found: ${script}` };
256
+ }
257
+ const [portA, portB] = cfg.ports;
258
+ const startupWait = this.config.settings.startupWait;
259
+ // Start server A
260
+ const pidA = this.startServer(script, portA, serverName, 'a');
261
+ await this.sleep(startupWait);
262
+ const healthA = await this.healthCheck(portA, pidA);
263
+ // Start server B
264
+ const pidB = this.startServer(script, portB, serverName, 'b');
265
+ await this.sleep(startupWait);
266
+ const healthB = await this.healthCheck(portB, pidB);
267
+ const twin = {
268
+ name: serverName,
269
+ scriptPath: script,
270
+ portA,
271
+ portB,
272
+ active: 'a',
273
+ stateA: healthA ? ServerState.RUNNING : ServerState.FAILED,
274
+ stateB: healthB ? ServerState.RUNNING : ServerState.FAILED,
275
+ pidA,
276
+ pidB,
277
+ lastSwap: null,
278
+ reloadCount: 0,
279
+ errorA: healthA ? null : 'Health check failed',
280
+ errorB: healthB ? null : 'Health check failed'
281
+ };
282
+ this.twins.set(serverName, twin);
283
+ this.saveState();
284
+ return {
285
+ ok: healthA || healthB,
286
+ server: serverName,
287
+ active: `a (port ${portA})`,
288
+ standby: `b (port ${portB})`,
289
+ statusA: twin.stateA,
290
+ statusB: twin.stateB,
291
+ pidA,
292
+ pidB,
293
+ hint: "Use 'twin status' to check, 'twin reload' after code changes"
294
+ };
295
+ }
296
+ async reloadStandby(serverName) {
297
+ if (!this.twins.has(serverName)) {
298
+ return {
299
+ ok: false,
300
+ error: `No twins running for ${serverName}. Use 'twin start ${serverName}' first.`
301
+ };
302
+ }
303
+ const twin = this.twins.get(serverName);
304
+ const standby = twin.active === 'a' ? 'b' : 'a';
305
+ const standbyPort = standby === 'b' ? twin.portB : twin.portA;
306
+ const standbyPid = standby === 'b' ? twin.pidB : twin.pidA;
307
+ // Mark as reloading
308
+ if (standby === 'b') {
309
+ twin.stateB = ServerState.RELOADING;
310
+ }
311
+ else {
312
+ twin.stateA = ServerState.RELOADING;
313
+ }
314
+ this.saveState();
315
+ // Stop standby
316
+ if (standbyPid) {
317
+ await this.stopServer(standbyPid, this.config.settings.shutdownTimeout);
318
+ }
319
+ // Start new instance
320
+ const newPid = this.startServer(twin.scriptPath, standbyPort, serverName, standby);
321
+ await this.sleep(this.config.settings.startupWait);
322
+ const healthy = await this.healthCheck(standbyPort, newPid);
323
+ // Update state
324
+ if (standby === 'b') {
325
+ twin.pidB = newPid;
326
+ twin.stateB = healthy ? ServerState.RUNNING : ServerState.FAILED;
327
+ twin.errorB = healthy ? null : 'Health check failed after reload';
328
+ }
329
+ else {
330
+ twin.pidA = newPid;
331
+ twin.stateA = healthy ? ServerState.RUNNING : ServerState.FAILED;
332
+ twin.errorA = healthy ? null : 'Health check failed after reload';
333
+ }
334
+ twin.reloadCount++;
335
+ this.saveState();
336
+ return {
337
+ ok: healthy,
338
+ server: serverName,
339
+ reloaded: `standby (${standby}) on port ${standbyPort}`,
340
+ healthy,
341
+ newPid,
342
+ reloadCount: twin.reloadCount,
343
+ hint: healthy
344
+ ? `Standby ready. Use 'twin swap ${serverName}' to switch traffic.`
345
+ : `Health check failed. Check logs: ${path.join(LOG_DIR, `${serverName}_${standby}.log`)}`
346
+ };
347
+ }
348
+ async swapActive(serverName) {
349
+ if (!this.twins.has(serverName)) {
350
+ return { ok: false, error: `No twins running for ${serverName}` };
351
+ }
352
+ const twin = this.twins.get(serverName);
353
+ const newActive = twin.active === 'a' ? 'b' : 'a';
354
+ const newPort = newActive === 'b' ? twin.portB : twin.portA;
355
+ const newState = newActive === 'b' ? twin.stateB : twin.stateA;
356
+ // Check standby is healthy
357
+ if (newState !== ServerState.RUNNING) {
358
+ return {
359
+ ok: false,
360
+ error: `Standby server (${newActive}) not healthy: ${newState}`,
361
+ hint: `Run 'twin reload ${serverName}' first to bring standby online`
362
+ };
363
+ }
364
+ const oldActive = twin.active;
365
+ const oldPort = oldActive === 'a' ? twin.portA : twin.portB;
366
+ // Swap
367
+ twin.active = newActive;
368
+ twin.lastSwap = Date.now();
369
+ this.saveState();
370
+ return {
371
+ ok: true,
372
+ server: serverName,
373
+ previousActive: `${oldActive} (port ${oldPort})`,
374
+ newActive: `${newActive} (port ${newPort})`,
375
+ swappedAt: twin.lastSwap,
376
+ hint: 'Traffic now routing to new active. Old server is now standby.'
377
+ };
378
+ }
379
+ async stopTwins(serverName) {
380
+ if (!this.twins.has(serverName)) {
381
+ return { ok: false, error: `No twins for ${serverName}` };
382
+ }
383
+ const twin = this.twins.get(serverName);
384
+ const timeout = this.config.settings.shutdownTimeout;
385
+ const stoppedA = await this.stopServer(twin.pidA, timeout);
386
+ const stoppedB = await this.stopServer(twin.pidB, timeout);
387
+ this.twins.delete(serverName);
388
+ this.saveState();
389
+ return {
390
+ ok: stoppedA && stoppedB,
391
+ server: serverName,
392
+ stopped: true,
393
+ stoppedA,
394
+ stoppedB
395
+ };
396
+ }
397
+ getActivePort(serverName) {
398
+ const twin = this.twins.get(serverName);
399
+ if (!twin)
400
+ return null;
401
+ if (twin.active === 'a' && twin.stateA === ServerState.RUNNING) {
402
+ return twin.portA;
403
+ }
404
+ else if (twin.active === 'b' && twin.stateB === ServerState.RUNNING) {
405
+ return twin.portB;
406
+ }
407
+ return null;
408
+ }
409
+ async status(serverName) {
410
+ if (serverName) {
411
+ if (!this.twins.has(serverName)) {
412
+ if (this.config.servers[serverName]) {
413
+ return {
414
+ ok: true,
415
+ server: serverName,
416
+ status: 'not_started',
417
+ hint: `Use 'twin start ${serverName}' to start twins`
418
+ };
419
+ }
420
+ return { ok: false, error: `Unknown server: ${serverName}` };
421
+ }
422
+ const twin = this.twins.get(serverName);
423
+ const healthA = await this.healthCheck(twin.portA, twin.pidA);
424
+ const healthB = await this.healthCheck(twin.portB, twin.pidB);
425
+ return {
426
+ ok: true,
427
+ server: serverName,
428
+ active: twin.active,
429
+ serverA: {
430
+ port: twin.portA,
431
+ state: twin.stateA,
432
+ pid: twin.pidA,
433
+ healthy: healthA,
434
+ isActive: twin.active === 'a'
435
+ },
436
+ serverB: {
437
+ port: twin.portB,
438
+ state: twin.stateB,
439
+ pid: twin.pidB,
440
+ healthy: healthB,
441
+ isActive: twin.active === 'b'
442
+ },
443
+ reloadCount: twin.reloadCount,
444
+ lastSwap: twin.lastSwap
445
+ };
446
+ }
447
+ // All twins
448
+ const twinsStatus = {};
449
+ for (const [name, twin] of this.twins) {
450
+ const healthA = await this.healthCheck(twin.portA, twin.pidA);
451
+ const healthB = await this.healthCheck(twin.portB, twin.pidB);
452
+ twinsStatus[name] = {
453
+ active: twin.active,
454
+ ports: [twin.portA, twin.portB],
455
+ states: [twin.stateA, twin.stateB],
456
+ healthy: [healthA, healthB],
457
+ reloadCount: twin.reloadCount
458
+ };
459
+ }
460
+ return {
461
+ ok: true,
462
+ twins: twinsStatus,
463
+ available: Object.keys(this.config.servers),
464
+ configPath: CONFIG_FILE
465
+ };
466
+ }
467
+ getConfig() {
468
+ return {
469
+ ok: true,
470
+ configPath: CONFIG_FILE,
471
+ config: this.config
472
+ };
473
+ }
474
+ addServer(name, script, ports) {
475
+ const scriptPath = script.replace('~', os.homedir());
476
+ if (!fs.existsSync(scriptPath)) {
477
+ return { ok: false, error: `Script not found: ${scriptPath}` };
478
+ }
479
+ this.config.servers[name] = {
480
+ script: scriptPath,
481
+ ports,
482
+ healthEndpoint: '/health',
483
+ startupTimeout: 10,
484
+ python: 'python3'
485
+ };
486
+ this.saveConfig();
487
+ return {
488
+ ok: true,
489
+ added: name,
490
+ config: this.config.servers[name]
491
+ };
492
+ }
493
+ removeServer(name) {
494
+ if (!this.config.servers[name]) {
495
+ return { ok: false, error: `Server not in config: ${name}` };
496
+ }
497
+ if (this.twins.has(name)) {
498
+ return {
499
+ ok: false,
500
+ error: `Server has running twins. Stop them first with 'twin stop ${name}'`
501
+ };
502
+ }
503
+ delete this.config.servers[name];
504
+ this.saveConfig();
505
+ return { ok: true, removed: name };
506
+ }
507
+ }
508
+ exports.MCPTwinManager = MCPTwinManager;
509
+ // Singleton
510
+ let _twinManager = null;
511
+ function getTwinManager() {
512
+ if (!_twinManager) {
513
+ _twinManager = new MCPTwinManager();
514
+ }
515
+ return _twinManager;
516
+ }
517
+ exports.default = MCPTwinManager;
518
+ //# sourceMappingURL=twin-manager.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"twin-manager.js","sourceRoot":"","sources":["../src/twin-manager.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAykBH,wCAKC;AA5kBD,iDAAoD;AACpD,uCAAyB;AACzB,2CAA6B;AAC7B,yCAA2B;AAC3B,uCAAyB;AAKzB,IAAK,WAMJ;AAND,WAAK,WAAW;IACd,kCAAmB,CAAA;IACnB,oCAAqB,CAAA;IACrB,kCAAmB,CAAA;IACnB,gCAAiB,CAAA;IACjB,sCAAuB,CAAA;AACzB,CAAC,EANI,WAAW,KAAX,WAAW,QAMf;AA2CD,QAAQ;AACR,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,CAAC,CAAC;AACxD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;AACzD,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,YAAY,CAAC,CAAC;AACvD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC;AAE9C;;GAEG;AACH,MAAa,cAAc;IAKzB;QAJQ,UAAK,GAA4B,IAAI,GAAG,EAAE,CAAC;QAE3C,cAAS,GAA8B,IAAI,GAAG,EAAE,CAAC;QAGvD,IAAI,CAAC,UAAU,EAAE,CAAC;QAClB,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,YAAY,EAAE,CAAC;IACtB,CAAC;IAEO,UAAU;QAChB,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE;YAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,GAAG,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YACzC,CAAC;QACH,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,UAAU;QAChB,IAAI,EAAE,CAAC,UAAU,CAAC,WAAW,CAAC,EAAE,CAAC;YAC/B,IAAI,CAAC;gBACH,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,CAAC;YAC1D,CAAC;YAAC,MAAM,CAAC;gBACP,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,MAAM,MAAM,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACpC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,CAAC;QACxB,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,aAAa;QACnB,OAAO;YACL,OAAO,EAAE,EAAE,EAAG,mCAAmC;YACjD,QAAQ,EAAE;gBACR,eAAe,EAAE,IAAI;gBACrB,mBAAmB,EAAE,EAAE;gBACvB,oBAAoB,EAAE,IAAI;gBAC1B,kBAAkB,EAAE,CAAC;gBACrB,WAAW,EAAE,IAAI;gBACjB,eAAe,EAAE,IAAI;aACtB;SACF,CAAC;IACJ,CAAC;IAEO,UAAU,CAAC,MAAmB;QACpC,EAAE,CAAC,aAAa,CAAC,WAAW,EAAE,IAAI,CAAC,SAAS,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;IAEO,SAAS;QACf,MAAM,KAAK,GAAwB,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE;YAChC,KAAK,CAAC,IAAI,CAAC,GAAG;gBACZ,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,UAAU,EAAE,IAAI,CAAC,UAAU;gBAC3B,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC;QACJ,CAAC,CAAC,CAAC;QACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;IAC/D,CAAC;IAEO,YAAY;QAClB,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC;YAAE,OAAO;QAEvC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAC9D,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAgB,EAAE,EAAE;gBAC5D,mCAAmC;gBACnC,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;oBACtD,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC;gBAC9C,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;oBACtD,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC;gBAE9C,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE;oBACnB,GAAG,IAAI;oBACP,MAAM;oBACN,MAAM;oBACN,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;oBACvD,IAAI,EAAE,MAAM,KAAK,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;oBACvD,MAAM,EAAE,IAAI;oBACZ,MAAM,EAAE,IAAI;iBACb,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,oCAAoC,EAAE,GAAG,CAAC,CAAC;QAC3D,CAAC;IACH,CAAC;IAEO,YAAY,CAAC,GAAW;QAC9B,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,GAAmB;QACzD,gDAAgD;QAChD,IAAI,GAAG,IAAI,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,0CAA0C;QAC1C,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;YAC3B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YAChC,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAExB,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,OAAO,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;QACpC,CAAC,CAAC,CAAC;IACL,CAAC;IAEO,WAAW,CAAC,MAAc,EAAE,IAAY,EAAE,UAAkB,EAAE,IAAgB;QACpF,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,IAAI,IAAI,MAAM,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,EAAE,CAAC,iBAAiB,CAAC,OAAO,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,CAAC,CAAC;QAEhE,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAClD,MAAM,SAAS,GAAG,GAAG,CAAC,MAAM,IAAI,SAAS,CAAC;QAE1C,IAAI,CAAC;YACH,yDAAyD;YACzD,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,SAAS,EAAE,CAAC,MAAM,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,CAAC,EAAE;gBACxE,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;gBACzB,QAAQ,EAAE,IAAI;gBACd,KAAK,EAAE,CAAC,QAAQ,EAAE,SAAS,EAAE,SAAS,CAAC;aACxC,CAAC,CAAC;YAEH,IAAI,CAAC,KAAK,EAAE,CAAC;YAEb,MAAM,GAAG,GAAG,GAAG,UAAU,IAAI,IAAI,EAAE,CAAC;YACpC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YAE9B,OAAO,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC;QAC1B,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,OAAO,CAAC,KAAK,CAAC,6BAA6B,UAAU,IAAI,IAAI,GAAG,EAAE,GAAG,CAAC,CAAC;YACvE,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,UAAU,CAAC,GAAkB,EAAE,UAAkB,IAAI;QACjE,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;YACpC,OAAO,IAAI,CAAC;QACd,CAAC;QAED,IAAI,CAAC;YACH,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAE7B,6BAA6B;YAC7B,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;YACzB,OAAO,IAAI,CAAC,GAAG,EAAE,GAAG,KAAK,GAAG,OAAO,EAAE,CAAC;gBACpC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,CAAC;oBAC5B,OAAO,IAAI,CAAC;gBACd,CAAC;gBACD,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YACxB,CAAC;YAED,aAAa;YACb,OAAO,CAAC,IAAI,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YAC7B,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,EAAU;QACtB,OAAO,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;IACzD,CAAC;IAED,qBAAqB;IAErB,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;YACrC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,mBAAmB,UAAU,gBAAgB,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;aAClG,CAAC;QACJ,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YACzC,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;gBAC/E,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,6BAA6B,UAAU,oBAAoB,UAAU,UAAU;iBACvF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC5C,MAAM,MAAM,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,MAAM,EAAE,EAAE,CAAC;QAC7D,CAAC;QAED,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,GAAG,GAAG,CAAC,KAAK,CAAC;QACjC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC;QAErD,iBAAiB;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEpD,iBAAiB;QACjB,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC;QAC9D,MAAM,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC,CAAC;QAC9B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAe;YACvB,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,MAAM;YAClB,KAAK;YACL,KAAK;YACL,MAAM,EAAE,GAAG;YACX,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;YAC1D,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM;YAC1D,IAAI;YACJ,IAAI;YACJ,QAAQ,EAAE,IAAI;YACd,WAAW,EAAE,CAAC;YACd,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB;YAC9C,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,qBAAqB;SAC/C,CAAC;QAEF,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,OAAO;YACL,EAAE,EAAE,OAAO,IAAI,OAAO;YACtB,MAAM,EAAE,UAAU;YAClB,MAAM,EAAE,WAAW,KAAK,GAAG;YAC3B,OAAO,EAAE,WAAW,KAAK,GAAG;YAC5B,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,OAAO,EAAE,IAAI,CAAC,MAAM;YACpB,IAAI;YACJ,IAAI;YACJ,IAAI,EAAE,8DAA8D;SACrE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,UAAkB;QACpC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,wBAAwB,UAAU,qBAAqB,UAAU,UAAU;aACnF,CAAC;QACJ,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACzC,MAAM,OAAO,GAAe,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC5D,MAAM,WAAW,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC9D,MAAM,UAAU,GAAG,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QAE3D,oBAAoB;QACpB,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC;QACtC,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,MAAM,GAAG,WAAW,CAAC,SAAS,CAAC;QACtC,CAAC;QACD,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,eAAe;QACf,IAAI,UAAU,EAAE,CAAC;YACf,MAAM,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC,CAAC;QAC1E,CAAC;QAED,qBAAqB;QACrB,MAAM,MAAM,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;QACnF,MAAM,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;QACnD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC;QAE5D,eAAe;QACf,IAAI,OAAO,KAAK,GAAG,EAAE,CAAC;YACpB,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YACjE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC;QACpE,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,MAAM,CAAC;YACnB,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC;YACjE,IAAI,CAAC,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,kCAAkC,CAAC;QACpE,CAAC;QAED,IAAI,CAAC,WAAW,EAAE,CAAC;QACnB,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,OAAO;YACL,EAAE,EAAE,OAAO;YACX,MAAM,EAAE,UAAU;YAClB,QAAQ,EAAE,YAAY,OAAO,aAAa,WAAW,EAAE;YACvD,OAAO;YACP,MAAM;YACN,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,OAAO;gBACX,CAAC,CAAC,iCAAiC,UAAU,sBAAsB;gBACnE,CAAC,CAAC,oCAAoC,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,UAAU,IAAI,OAAO,MAAM,CAAC,EAAE;SAC7F,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU,CAAC,UAAkB;QACjC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,wBAAwB,UAAU,EAAE,EAAE,CAAC;QACpE,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACzC,MAAM,SAAS,GAAe,IAAI,CAAC,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QAC9D,MAAM,OAAO,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAC5D,MAAM,QAAQ,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC;QAE/D,2BAA2B;QAC3B,IAAI,QAAQ,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACrC,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,mBAAmB,SAAS,kBAAkB,QAAQ,EAAE;gBAC/D,IAAI,EAAE,oBAAoB,UAAU,iCAAiC;aACtE,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;QAC9B,MAAM,OAAO,GAAG,SAAS,KAAK,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC;QAE5D,OAAO;QACP,IAAI,CAAC,MAAM,GAAG,SAAS,CAAC;QACxB,IAAI,CAAC,QAAQ,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,MAAM,EAAE,UAAU;YAClB,cAAc,EAAE,GAAG,SAAS,UAAU,OAAO,GAAG;YAChD,SAAS,EAAE,GAAG,SAAS,UAAU,OAAO,GAAG;YAC3C,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,IAAI,EAAE,+DAA+D;SACtE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,SAAS,CAAC,UAAkB;QAChC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAChC,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,gBAAgB,UAAU,EAAE,EAAE,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,eAAe,CAAC;QAErD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAC3D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAE3D,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;QAC9B,IAAI,CAAC,SAAS,EAAE,CAAC;QAEjB,OAAO;YACL,EAAE,EAAE,QAAQ,IAAI,QAAQ;YACxB,MAAM,EAAE,UAAU;YAClB,OAAO,EAAE,IAAI;YACb,QAAQ;YACR,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,aAAa,CAAC,UAAkB;QAC9B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxC,IAAI,CAAC,IAAI;YAAE,OAAO,IAAI,CAAC;QAEvB,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YAC/D,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;aAAM,IAAI,IAAI,CAAC,MAAM,KAAK,GAAG,IAAI,IAAI,CAAC,MAAM,KAAK,WAAW,CAAC,OAAO,EAAE,CAAC;YACtE,OAAO,IAAI,CAAC,KAAK,CAAC;QACpB,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,UAAmB;QAC9B,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBAChC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC,EAAE,CAAC;oBACpC,OAAO;wBACL,EAAE,EAAE,IAAI;wBACR,MAAM,EAAE,UAAU;wBAClB,MAAM,EAAE,aAAa;wBACrB,IAAI,EAAE,mBAAmB,UAAU,kBAAkB;qBACtD,CAAC;gBACJ,CAAC;gBACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,mBAAmB,UAAU,EAAE,EAAE,CAAC;YAC/D,CAAC;YAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC;YACzC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE9D,OAAO;gBACL,EAAE,EAAE,IAAI;gBACR,MAAM,EAAE,UAAU;gBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,OAAO,EAAE;oBACP,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,KAAK,EAAE,IAAI,CAAC,MAAM;oBAClB,GAAG,EAAE,IAAI,CAAC,IAAI;oBACd,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,GAAG;iBAC9B;gBACD,OAAO,EAAE;oBACP,IAAI,EAAE,IAAI,CAAC,KAAK;oBAChB,KAAK,EAAE,IAAI,CAAC,MAAM;oBAClB,GAAG,EAAE,IAAI,CAAC,IAAI;oBACd,OAAO,EAAE,OAAO;oBAChB,QAAQ,EAAE,IAAI,CAAC,MAAM,KAAK,GAAG;iBAC9B;gBACD,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ;aACxB,CAAC;QACJ,CAAC;QAED,YAAY;QACZ,MAAM,WAAW,GAAwB,EAAE,CAAC;QAE5C,KAAK,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACtC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAC9D,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC;YAE9D,WAAW,CAAC,IAAI,CAAC,GAAG;gBAClB,MAAM,EAAE,IAAI,CAAC,MAAM;gBACnB,KAAK,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC;gBAC/B,MAAM,EAAE,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;gBAClC,OAAO,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC;gBAC3B,WAAW,EAAE,IAAI,CAAC,WAAW;aAC9B,CAAC;QACJ,CAAC;QAED,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,WAAW;YAClB,SAAS,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC;YAC3C,UAAU,EAAE,WAAW;SACxB,CAAC;IACJ,CAAC;IAED,SAAS;QACP,OAAO;YACL,EAAE,EAAE,IAAI;YACR,UAAU,EAAE,WAAW;YACvB,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,IAAY,EAAE,MAAc,EAAE,KAAuB;QAC7D,MAAM,UAAU,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;QAErD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,qBAAqB,UAAU,EAAE,EAAE,CAAC;QACjE,CAAC;QAED,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG;YAC1B,MAAM,EAAE,UAAU;YAClB,KAAK;YACL,cAAc,EAAE,SAAS;YACzB,cAAc,EAAE,EAAE;YAClB,MAAM,EAAE,SAAS;SAClB,CAAC;QACF,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,OAAO;YACL,EAAE,EAAE,IAAI;YACR,KAAK,EAAE,IAAI;YACX,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC;SAClC,CAAC;IACJ,CAAC;IAED,YAAY,CAAC,IAAY;QACvB,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAC/B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,yBAAyB,IAAI,EAAE,EAAE,CAAC;QAC/D,CAAC;QAED,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACzB,OAAO;gBACL,EAAE,EAAE,KAAK;gBACT,KAAK,EAAE,6DAA6D,IAAI,GAAG;aAC5E,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACjC,IAAI,CAAC,UAAU,EAAE,CAAC;QAElB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IACrC,CAAC;CACF;AA/fD,wCA+fC;AAED,YAAY;AACZ,IAAI,YAAY,GAA0B,IAAI,CAAC;AAE/C,SAAgB,cAAc;IAC5B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,YAAY,GAAG,IAAI,cAAc,EAAE,CAAC;IACtC,CAAC;IACD,OAAO,YAAY,CAAC;AACtB,CAAC;AAED,kBAAe,cAAc,CAAC"}