@cisco_open/linting-orchestrator 1.0.0-rc.4
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/LICENSE +201 -0
- package/NOTICE +5 -0
- package/README.md +43 -0
- package/build/cli/api-client.d.ts +170 -0
- package/build/cli/api-client.d.ts.map +1 -0
- package/build/cli/api-client.js +284 -0
- package/build/cli/api-client.js.map +1 -0
- package/build/cli/commands/agents.d.ts +7 -0
- package/build/cli/commands/agents.d.ts.map +1 -0
- package/build/cli/commands/agents.js +694 -0
- package/build/cli/commands/agents.js.map +1 -0
- package/build/cli/commands/completion.d.ts +9 -0
- package/build/cli/commands/completion.d.ts.map +1 -0
- package/build/cli/commands/completion.js +177 -0
- package/build/cli/commands/completion.js.map +1 -0
- package/build/cli/commands/config.d.ts +10 -0
- package/build/cli/commands/config.d.ts.map +1 -0
- package/build/cli/commands/config.js +284 -0
- package/build/cli/commands/config.js.map +1 -0
- package/build/cli/commands/health.d.ts +11 -0
- package/build/cli/commands/health.d.ts.map +1 -0
- package/build/cli/commands/health.js +38 -0
- package/build/cli/commands/health.js.map +1 -0
- package/build/cli/commands/help.d.ts +6 -0
- package/build/cli/commands/help.d.ts.map +1 -0
- package/build/cli/commands/help.js +20 -0
- package/build/cli/commands/help.js.map +1 -0
- package/build/cli/commands/history.d.ts +11 -0
- package/build/cli/commands/history.d.ts.map +1 -0
- package/build/cli/commands/history.js +50 -0
- package/build/cli/commands/history.js.map +1 -0
- package/build/cli/commands/jobs.d.ts +12 -0
- package/build/cli/commands/jobs.d.ts.map +1 -0
- package/build/cli/commands/jobs.js +84 -0
- package/build/cli/commands/jobs.js.map +1 -0
- package/build/cli/commands/lint.d.ts +15 -0
- package/build/cli/commands/lint.d.ts.map +1 -0
- package/build/cli/commands/lint.js +384 -0
- package/build/cli/commands/lint.js.map +1 -0
- package/build/cli/commands/ps.d.ts +8 -0
- package/build/cli/commands/ps.d.ts.map +1 -0
- package/build/cli/commands/ps.js +74 -0
- package/build/cli/commands/ps.js.map +1 -0
- package/build/cli/commands/reproduce.d.ts +9 -0
- package/build/cli/commands/reproduce.d.ts.map +1 -0
- package/build/cli/commands/reproduce.js +31 -0
- package/build/cli/commands/reproduce.js.map +1 -0
- package/build/cli/commands/reset.d.ts +5 -0
- package/build/cli/commands/reset.d.ts.map +1 -0
- package/build/cli/commands/reset.js +13 -0
- package/build/cli/commands/reset.js.map +1 -0
- package/build/cli/commands/results.d.ts +13 -0
- package/build/cli/commands/results.d.ts.map +1 -0
- package/build/cli/commands/results.js +129 -0
- package/build/cli/commands/results.js.map +1 -0
- package/build/cli/commands/rulesets/check.d.ts +12 -0
- package/build/cli/commands/rulesets/check.d.ts.map +1 -0
- package/build/cli/commands/rulesets/check.js +226 -0
- package/build/cli/commands/rulesets/check.js.map +1 -0
- package/build/cli/commands/rulesets/index.d.ts +5 -0
- package/build/cli/commands/rulesets/index.d.ts.map +1 -0
- package/build/cli/commands/rulesets/index.js +6 -0
- package/build/cli/commands/rulesets/index.js.map +1 -0
- package/build/cli/commands/rulesets/view.d.ts +16 -0
- package/build/cli/commands/rulesets/view.d.ts.map +1 -0
- package/build/cli/commands/rulesets/view.js +100 -0
- package/build/cli/commands/rulesets/view.js.map +1 -0
- package/build/cli/commands/start.d.ts +16 -0
- package/build/cli/commands/start.d.ts.map +1 -0
- package/build/cli/commands/start.js +167 -0
- package/build/cli/commands/start.js.map +1 -0
- package/build/cli/commands/status.d.ts +9 -0
- package/build/cli/commands/status.d.ts.map +1 -0
- package/build/cli/commands/status.js +46 -0
- package/build/cli/commands/status.js.map +1 -0
- package/build/cli/commands/stop.d.ts +11 -0
- package/build/cli/commands/stop.d.ts.map +1 -0
- package/build/cli/commands/stop.js +78 -0
- package/build/cli/commands/stop.js.map +1 -0
- package/build/cli/config-manager.d.ts +134 -0
- package/build/cli/config-manager.d.ts.map +1 -0
- package/build/cli/config-manager.js +288 -0
- package/build/cli/config-manager.js.map +1 -0
- package/build/cli/formatters.d.ts +62 -0
- package/build/cli/formatters.d.ts.map +1 -0
- package/build/cli/formatters.js +715 -0
- package/build/cli/formatters.js.map +1 -0
- package/build/cli/history-manager.d.ts +97 -0
- package/build/cli/history-manager.d.ts.map +1 -0
- package/build/cli/history-manager.js +201 -0
- package/build/cli/history-manager.js.map +1 -0
- package/build/cli/index.d.ts +16 -0
- package/build/cli/index.d.ts.map +1 -0
- package/build/cli/index.js +335 -0
- package/build/cli/index.js.map +1 -0
- package/build/cli/list-rulesets.d.ts +15 -0
- package/build/cli/list-rulesets.d.ts.map +1 -0
- package/build/cli/list-rulesets.js +193 -0
- package/build/cli/list-rulesets.js.map +1 -0
- package/build/cli/utils/connection-error.d.ts +9 -0
- package/build/cli/utils/connection-error.d.ts.map +1 -0
- package/build/cli/utils/connection-error.js +30 -0
- package/build/cli/utils/connection-error.js.map +1 -0
- package/build/cli/utils/embedded-server.d.ts +21 -0
- package/build/cli/utils/embedded-server.d.ts.map +1 -0
- package/build/cli/utils/embedded-server.js +61 -0
- package/build/cli/utils/embedded-server.js.map +1 -0
- package/build/cli/utils/mode-validator.d.ts +13 -0
- package/build/cli/utils/mode-validator.d.ts.map +1 -0
- package/build/cli/utils/mode-validator.js +31 -0
- package/build/cli/utils/mode-validator.js.map +1 -0
- package/build/cli/utils/port-checker.d.ts +20 -0
- package/build/cli/utils/port-checker.d.ts.map +1 -0
- package/build/cli/utils/port-checker.js +49 -0
- package/build/cli/utils/port-checker.js.map +1 -0
- package/build/config.d.ts +57 -0
- package/build/config.d.ts.map +1 -0
- package/build/config.js +527 -0
- package/build/config.js.map +1 -0
- package/build/document-accessor.d.ts +79 -0
- package/build/document-accessor.d.ts.map +1 -0
- package/build/document-accessor.js +148 -0
- package/build/document-accessor.js.map +1 -0
- package/build/formatters/reproduce-markdown.d.ts +14 -0
- package/build/formatters/reproduce-markdown.d.ts.map +1 -0
- package/build/formatters/reproduce-markdown.js +182 -0
- package/build/formatters/reproduce-markdown.js.map +1 -0
- package/build/formatters/sarif-builder.d.ts +86 -0
- package/build/formatters/sarif-builder.d.ts.map +1 -0
- package/build/formatters/sarif-builder.js +276 -0
- package/build/formatters/sarif-builder.js.map +1 -0
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +174 -0
- package/build/index.js.map +1 -0
- package/build/logger.d.ts +38 -0
- package/build/logger.d.ts.map +1 -0
- package/build/logger.js +105 -0
- package/build/logger.js.map +1 -0
- package/build/mock-server.d.ts +2 -0
- package/build/mock-server.d.ts.map +1 -0
- package/build/mock-server.js +290 -0
- package/build/mock-server.js.map +1 -0
- package/build/orchestrator.d.ts +149 -0
- package/build/orchestrator.d.ts.map +1 -0
- package/build/orchestrator.js +874 -0
- package/build/orchestrator.js.map +1 -0
- package/build/ruleset-loader.d.ts +79 -0
- package/build/ruleset-loader.d.ts.map +1 -0
- package/build/ruleset-loader.js +514 -0
- package/build/ruleset-loader.js.map +1 -0
- package/build/schemas.d.ts +2568 -0
- package/build/schemas.d.ts.map +1 -0
- package/build/schemas.js +674 -0
- package/build/schemas.js.map +1 -0
- package/build/server.d.ts +39 -0
- package/build/server.d.ts.map +1 -0
- package/build/server.js +834 -0
- package/build/server.js.map +1 -0
- package/build/storage/memory-storage.d.ts +190 -0
- package/build/storage/memory-storage.d.ts.map +1 -0
- package/build/storage/memory-storage.js +629 -0
- package/build/storage/memory-storage.js.map +1 -0
- package/build/storage/redis-storage.d.ts +134 -0
- package/build/storage/redis-storage.d.ts.map +1 -0
- package/build/storage/redis-storage.js +236 -0
- package/build/storage/redis-storage.js.map +1 -0
- package/build/storage/storage-adapter.d.ts +189 -0
- package/build/storage/storage-adapter.d.ts.map +1 -0
- package/build/storage/storage-adapter.js +36 -0
- package/build/storage/storage-adapter.js.map +1 -0
- package/build/types.d.ts +981 -0
- package/build/types.d.ts.map +1 -0
- package/build/types.js +5 -0
- package/build/types.js.map +1 -0
- package/build/utils/version.d.ts +40 -0
- package/build/utils/version.d.ts.map +1 -0
- package/build/utils/version.js +94 -0
- package/build/utils/version.js.map +1 -0
- package/build/validation.d.ts +95 -0
- package/build/validation.d.ts.map +1 -0
- package/build/validation.js +150 -0
- package/build/validation.js.map +1 -0
- package/build/worker-pool.d.ts +137 -0
- package/build/worker-pool.d.ts.map +1 -0
- package/build/worker-pool.js +549 -0
- package/build/worker-pool.js.map +1 -0
- package/build/worker.d.ts +2 -0
- package/build/worker.d.ts.map +1 -0
- package/build/worker.js +427 -0
- package/build/worker.js.map +1 -0
- package/package.json +110 -0
- package/rulesets/CHANGELOG.md +25 -0
- package/rulesets/config/rulesets.yaml +96 -0
- package/rulesets/sources/README.md +47 -0
- package/rulesets/sources/example/oas-recommended/v1.0.0/ruleset.yaml +6 -0
- package/rulesets/sources/example/oas-recommended/v2.0.0/ruleset.yaml +14 -0
|
@@ -0,0 +1,549 @@
|
|
|
1
|
+
// Copyright 2026 Cisco Systems, Inc. and its affiliates
|
|
2
|
+
//
|
|
3
|
+
// SPDX-License-Identifier: Apache-2.0
|
|
4
|
+
/**
|
|
5
|
+
* Worker Pool Manager
|
|
6
|
+
*
|
|
7
|
+
* Manages a pool of worker threads for parallel OpenAPI document linting.
|
|
8
|
+
*
|
|
9
|
+
* Architecture:
|
|
10
|
+
* - Worker-per-ruleset: Each worker is dedicated to a specific ruleset
|
|
11
|
+
* - Document affinity: Routes tasks to workers that have the document cached
|
|
12
|
+
* - Dynamic scaling: Scales up/down based on queue depth and load
|
|
13
|
+
* - Health monitoring: Auto-restarts failed workers
|
|
14
|
+
*
|
|
15
|
+
* Workflow:
|
|
16
|
+
* 1. Initialize: Create min workers per ruleset
|
|
17
|
+
* 2. Execute: Route task to appropriate worker based on ruleset + document affinity
|
|
18
|
+
* 3. Scale: Add/remove workers based on load
|
|
19
|
+
* 4. Monitor: Health checks, restart failures
|
|
20
|
+
*
|
|
21
|
+
* @module worker-pool
|
|
22
|
+
*/
|
|
23
|
+
import { Worker } from 'worker_threads';
|
|
24
|
+
import path from 'path';
|
|
25
|
+
import os from 'os';
|
|
26
|
+
import { fileURLToPath } from 'url';
|
|
27
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
28
|
+
const __dirname = path.dirname(__filename);
|
|
29
|
+
// ============================================
|
|
30
|
+
// Worker Pool Manager
|
|
31
|
+
// ============================================
|
|
32
|
+
export class WorkerPoolManager {
|
|
33
|
+
config;
|
|
34
|
+
rulesetLoader;
|
|
35
|
+
documentStore;
|
|
36
|
+
resolverPath;
|
|
37
|
+
workers = new Map();
|
|
38
|
+
workersByRuleset = new Map(); // ruleset -> Set<workerId>
|
|
39
|
+
pendingTasks = new Map(); // taskId -> resolver
|
|
40
|
+
workerReadyCallbacks = []; // Bounded wait queue for tasks waiting on a free worker
|
|
41
|
+
initialized = false;
|
|
42
|
+
totalTasksExecuted = 0;
|
|
43
|
+
totalExecutionTime = 0;
|
|
44
|
+
scalingMonitorInterval = null;
|
|
45
|
+
constructor(config, rulesetLoader, documentStore, resolverPath) {
|
|
46
|
+
this.config = config;
|
|
47
|
+
this.rulesetLoader = rulesetLoader;
|
|
48
|
+
this.documentStore = documentStore;
|
|
49
|
+
this.resolverPath = resolverPath;
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Initialize worker pool with minimum workers per ruleset
|
|
53
|
+
*/
|
|
54
|
+
async initialize() {
|
|
55
|
+
if (this.initialized) {
|
|
56
|
+
throw new Error('Worker pool already initialized');
|
|
57
|
+
}
|
|
58
|
+
console.log('š§ Initializing Worker Pool...');
|
|
59
|
+
// Get all available rulesets
|
|
60
|
+
const rulesets = this.rulesetLoader.listRulesets();
|
|
61
|
+
if (rulesets.length === 0) {
|
|
62
|
+
throw new Error('No rulesets available - cannot initialize worker pool');
|
|
63
|
+
}
|
|
64
|
+
// Calculate optimal worker count
|
|
65
|
+
const cpuCount = os.cpus().length;
|
|
66
|
+
const maxWorkersTotal = Math.min(this.config.totalMaxWorkers, cpuCount * 2);
|
|
67
|
+
const minWorkersPerRuleset = Math.max(1, Math.floor(maxWorkersTotal / rulesets.length));
|
|
68
|
+
console.log(` CPU cores: ${cpuCount}`);
|
|
69
|
+
console.log(` Rulesets: ${rulesets.length}`);
|
|
70
|
+
console.log(` Workers per ruleset: ${minWorkersPerRuleset}`);
|
|
71
|
+
console.log(` Total max workers: ${maxWorkersTotal}`);
|
|
72
|
+
// Create minimum workers for each ruleset
|
|
73
|
+
const workerPromises = [];
|
|
74
|
+
const failedRulesets = [];
|
|
75
|
+
for (const ruleset of rulesets) {
|
|
76
|
+
const workersToCreate = Math.min(minWorkersPerRuleset, this.config.minWorkersPerRuleset);
|
|
77
|
+
for (let i = 0; i < workersToCreate; i++) {
|
|
78
|
+
workerPromises.push(this.createWorker(ruleset.name, ruleset.defaultVersion).catch(error => {
|
|
79
|
+
console.error(` ā Failed to create worker for ${ruleset.name}: ${error.message}`);
|
|
80
|
+
failedRulesets.push(ruleset.name);
|
|
81
|
+
}));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
// Wait for all workers to initialize
|
|
85
|
+
await Promise.all(workerPromises);
|
|
86
|
+
if (this.workers.size === 0) {
|
|
87
|
+
throw new Error('Failed to initialize any workers - check ruleset configurations');
|
|
88
|
+
}
|
|
89
|
+
if (failedRulesets.length > 0) {
|
|
90
|
+
console.warn(` ā ļø Some rulesets failed to load: ${[...new Set(failedRulesets)].join(', ')}`);
|
|
91
|
+
}
|
|
92
|
+
this.initialized = true;
|
|
93
|
+
console.log(`ā
Worker Pool initialized with ${this.workers.size} workers`);
|
|
94
|
+
this.logPoolStatus();
|
|
95
|
+
// Start dynamic scaling monitor
|
|
96
|
+
this.startScalingMonitor();
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Execute task on appropriate worker
|
|
100
|
+
*/
|
|
101
|
+
async executeTask(request) {
|
|
102
|
+
if (!this.initialized) {
|
|
103
|
+
throw new Error('Worker pool not initialized');
|
|
104
|
+
}
|
|
105
|
+
const { taskId, documentId, rulesetName, rulesetVersion, ruleOverrides, timeout } = request;
|
|
106
|
+
// Resolve ruleset version
|
|
107
|
+
const version = rulesetVersion || this.rulesetLoader.getMetadata(rulesetName).defaultVersion;
|
|
108
|
+
// Get document path (zero-copy architecture!)
|
|
109
|
+
const documentPath = await this.documentStore.getDocumentPath(documentId);
|
|
110
|
+
// Verify document exists
|
|
111
|
+
const exists = await this.documentStore.documentExists(documentId);
|
|
112
|
+
if (!exists) {
|
|
113
|
+
throw new Error(`Document not found: ${documentId}`);
|
|
114
|
+
}
|
|
115
|
+
// Find appropriate worker
|
|
116
|
+
const worker = await this.selectWorker(rulesetName, version, documentId);
|
|
117
|
+
if (!worker) {
|
|
118
|
+
throw new Error(`No available worker for ruleset: ${rulesetName}@${version}`);
|
|
119
|
+
}
|
|
120
|
+
// Execute task
|
|
121
|
+
return this.executeOnWorker(worker, {
|
|
122
|
+
taskId,
|
|
123
|
+
documentId,
|
|
124
|
+
documentPath,
|
|
125
|
+
ruleOverrides,
|
|
126
|
+
timeout: timeout || this.config.taskTimeout
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
/**
|
|
130
|
+
* Select best worker for task (document affinity routing)
|
|
131
|
+
*/
|
|
132
|
+
async selectWorker(rulesetName, rulesetVersion, documentId) {
|
|
133
|
+
const rulesetKey = `${rulesetName}@${rulesetVersion}`;
|
|
134
|
+
const workerIds = this.workersByRuleset.get(rulesetKey);
|
|
135
|
+
if (!workerIds || workerIds.size === 0) {
|
|
136
|
+
// No workers for this ruleset - try to create one
|
|
137
|
+
await this.createWorker(rulesetName, rulesetVersion);
|
|
138
|
+
return this.selectWorker(rulesetName, rulesetVersion, documentId);
|
|
139
|
+
}
|
|
140
|
+
// Get candidate workers
|
|
141
|
+
const candidates = [];
|
|
142
|
+
for (const workerId of workerIds) {
|
|
143
|
+
const worker = this.workers.get(workerId);
|
|
144
|
+
if (worker && worker.status !== 'error' && worker.status !== 'terminated') {
|
|
145
|
+
candidates.push(worker);
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (candidates.length === 0) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
// Priority 1: Workers with cached document (document affinity)
|
|
152
|
+
const withDocument = candidates.filter(w => w.status === 'ready' && w.cachedDocumentId === documentId);
|
|
153
|
+
if (withDocument.length > 0) {
|
|
154
|
+
// Return least busy worker with document cached
|
|
155
|
+
return withDocument.reduce((best, current) => current.taskCount < best.taskCount ? current : best);
|
|
156
|
+
}
|
|
157
|
+
// Priority 2: Ready workers (no cache hit)
|
|
158
|
+
const readyWorkers = candidates.filter(w => w.status === 'ready');
|
|
159
|
+
if (readyWorkers.length > 0) {
|
|
160
|
+
// Return least busy ready worker
|
|
161
|
+
return readyWorkers.reduce((best, current) => current.taskCount < best.taskCount ? current : best);
|
|
162
|
+
}
|
|
163
|
+
// Priority 3: Wait for a busy worker to become ready (bounded wait)
|
|
164
|
+
const waitTimeout = this.config.workerWaitTimeout ?? 30000;
|
|
165
|
+
return new Promise((resolve) => {
|
|
166
|
+
const timer = setTimeout(() => {
|
|
167
|
+
// Remove from queue on timeout
|
|
168
|
+
const idx = this.workerReadyCallbacks.findIndex(cb => cb.resolve === resolve);
|
|
169
|
+
if (idx !== -1)
|
|
170
|
+
this.workerReadyCallbacks.splice(idx, 1);
|
|
171
|
+
resolve(null);
|
|
172
|
+
}, waitTimeout);
|
|
173
|
+
this.workerReadyCallbacks.push({
|
|
174
|
+
rulesetKey,
|
|
175
|
+
resolve,
|
|
176
|
+
timer
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Execute task on specific worker
|
|
182
|
+
*/
|
|
183
|
+
executeOnWorker(workerInfo, task) {
|
|
184
|
+
return new Promise((resolve, reject) => {
|
|
185
|
+
const { taskId, documentId, documentPath, ruleOverrides, timeout } = task;
|
|
186
|
+
// Mark worker as busy
|
|
187
|
+
workerInfo.status = 'busy';
|
|
188
|
+
workerInfo.currentTaskId = taskId;
|
|
189
|
+
// Set up result handler
|
|
190
|
+
const resultHandler = (msg) => {
|
|
191
|
+
if (msg.type === 'result' && msg.payload.taskId === taskId) {
|
|
192
|
+
// Clean up
|
|
193
|
+
workerInfo.worker.off('message', resultHandler);
|
|
194
|
+
this.pendingTasks.delete(taskId);
|
|
195
|
+
// Update worker status
|
|
196
|
+
workerInfo.status = 'ready';
|
|
197
|
+
workerInfo.currentTaskId = undefined;
|
|
198
|
+
workerInfo.taskCount++;
|
|
199
|
+
// Drain worker-ready queue: notify first waiter for this ruleset
|
|
200
|
+
this.notifyWorkerReady(workerInfo);
|
|
201
|
+
if (msg.payload.success) {
|
|
202
|
+
// Update metrics
|
|
203
|
+
this.totalTasksExecuted++;
|
|
204
|
+
this.totalExecutionTime += msg.payload.executionTime;
|
|
205
|
+
workerInfo.averageExecutionTime =
|
|
206
|
+
(workerInfo.averageExecutionTime * (workerInfo.taskCount - 1) + msg.payload.executionTime) /
|
|
207
|
+
workerInfo.taskCount;
|
|
208
|
+
// Update cache tracking
|
|
209
|
+
if (msg.payload.cacheHit) {
|
|
210
|
+
workerInfo.cachedDocumentId = documentId;
|
|
211
|
+
workerInfo.cachedAt = new Date();
|
|
212
|
+
}
|
|
213
|
+
resolve({
|
|
214
|
+
taskId,
|
|
215
|
+
success: true,
|
|
216
|
+
results: msg.payload.results,
|
|
217
|
+
executionTime: msg.payload.executionTime,
|
|
218
|
+
workerId: workerInfo.workerId,
|
|
219
|
+
cacheHit: msg.payload.cacheHit
|
|
220
|
+
});
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
reject(new Error(msg.payload.error || 'Task execution failed'));
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
};
|
|
227
|
+
// Set up error handler
|
|
228
|
+
const errorHandler = (error) => {
|
|
229
|
+
workerInfo.worker.off('message', resultHandler);
|
|
230
|
+
workerInfo.worker.off('error', errorHandler);
|
|
231
|
+
this.pendingTasks.delete(taskId);
|
|
232
|
+
workerInfo.status = 'error';
|
|
233
|
+
workerInfo.currentTaskId = undefined;
|
|
234
|
+
reject(new Error(`Worker error: ${error.message}`));
|
|
235
|
+
// Try to restart worker
|
|
236
|
+
this.handleWorkerFailure(workerInfo);
|
|
237
|
+
};
|
|
238
|
+
// Set up timeout
|
|
239
|
+
const timer = setTimeout(() => {
|
|
240
|
+
workerInfo.worker.off('message', resultHandler);
|
|
241
|
+
workerInfo.worker.off('error', errorHandler);
|
|
242
|
+
this.pendingTasks.delete(taskId);
|
|
243
|
+
workerInfo.status = 'ready';
|
|
244
|
+
workerInfo.currentTaskId = undefined;
|
|
245
|
+
// Drain worker-ready queue on timeout (worker becomes available)
|
|
246
|
+
this.notifyWorkerReady(workerInfo);
|
|
247
|
+
const timeoutError = new Error(`Task timeout after ${timeout}ms`);
|
|
248
|
+
timeoutError.code = 'TIMEOUT';
|
|
249
|
+
reject(timeoutError);
|
|
250
|
+
}, timeout);
|
|
251
|
+
// Register handlers
|
|
252
|
+
workerInfo.worker.on('message', resultHandler);
|
|
253
|
+
workerInfo.worker.on('error', errorHandler);
|
|
254
|
+
this.pendingTasks.set(taskId, (result) => {
|
|
255
|
+
clearTimeout(timer);
|
|
256
|
+
resolve(result);
|
|
257
|
+
});
|
|
258
|
+
// Send execute message to worker
|
|
259
|
+
workerInfo.worker.postMessage({
|
|
260
|
+
type: 'execute',
|
|
261
|
+
payload: {
|
|
262
|
+
taskId,
|
|
263
|
+
documentId,
|
|
264
|
+
documentPath,
|
|
265
|
+
timeout,
|
|
266
|
+
ruleOverrides
|
|
267
|
+
}
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Create new worker for ruleset
|
|
273
|
+
*/
|
|
274
|
+
async createWorker(rulesetName, rulesetVersion) {
|
|
275
|
+
const workerId = `${rulesetName}-${rulesetVersion}-${Date.now()}-${Math.random().toString(36).substr(2, 9)}`;
|
|
276
|
+
const rulesetKey = `${rulesetName}@${rulesetVersion}`;
|
|
277
|
+
// Check total worker limit
|
|
278
|
+
if (this.workers.size >= this.config.totalMaxWorkers) {
|
|
279
|
+
throw new Error(`Worker pool at max capacity: ${this.config.totalMaxWorkers}`);
|
|
280
|
+
}
|
|
281
|
+
// Load ruleset to get path
|
|
282
|
+
const ruleset = await this.rulesetLoader.loadVersion(rulesetName, rulesetVersion);
|
|
283
|
+
const rulesetPath = ruleset.rulesetPath;
|
|
284
|
+
// Create worker thread
|
|
285
|
+
const workerScriptPath = path.join(__dirname, 'worker.js');
|
|
286
|
+
const worker = new Worker(workerScriptPath, {
|
|
287
|
+
workerData: {
|
|
288
|
+
workerId,
|
|
289
|
+
rulesetName,
|
|
290
|
+
rulesetVersion,
|
|
291
|
+
rulesetPath,
|
|
292
|
+
rulesetLoader: ruleset.loader ?? 'bundler',
|
|
293
|
+
resolverPath: this.resolverPath,
|
|
294
|
+
config: {
|
|
295
|
+
documentCache: this.config.documentCache,
|
|
296
|
+
taskTimeout: this.config.taskTimeout
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
});
|
|
300
|
+
// Create worker info
|
|
301
|
+
const workerInfo = {
|
|
302
|
+
workerId,
|
|
303
|
+
worker,
|
|
304
|
+
rulesetName,
|
|
305
|
+
rulesetVersion,
|
|
306
|
+
status: 'initializing',
|
|
307
|
+
taskCount: 0,
|
|
308
|
+
averageExecutionTime: 0,
|
|
309
|
+
lastHeartbeat: new Date(),
|
|
310
|
+
createdAt: new Date(),
|
|
311
|
+
restartCount: 0
|
|
312
|
+
};
|
|
313
|
+
// Wait for worker to become ready
|
|
314
|
+
await new Promise((resolve, reject) => {
|
|
315
|
+
const timeout = setTimeout(() => {
|
|
316
|
+
reject(new Error(`Worker ${workerId} initialization timeout`));
|
|
317
|
+
}, 30000); // 30s timeout
|
|
318
|
+
const messageHandler = (msg) => {
|
|
319
|
+
if (msg.type === 'ready') {
|
|
320
|
+
clearTimeout(timeout);
|
|
321
|
+
worker.off('message', messageHandler);
|
|
322
|
+
worker.off('error', errorHandler);
|
|
323
|
+
workerInfo.status = 'ready';
|
|
324
|
+
resolve();
|
|
325
|
+
}
|
|
326
|
+
else if (msg.type === 'error') {
|
|
327
|
+
clearTimeout(timeout);
|
|
328
|
+
worker.off('message', messageHandler);
|
|
329
|
+
worker.off('error', errorHandler);
|
|
330
|
+
reject(new Error(msg.payload.error || 'Worker initialization failed'));
|
|
331
|
+
}
|
|
332
|
+
};
|
|
333
|
+
const errorHandler = (error) => {
|
|
334
|
+
clearTimeout(timeout);
|
|
335
|
+
worker.off('message', messageHandler);
|
|
336
|
+
worker.off('error', errorHandler);
|
|
337
|
+
reject(error);
|
|
338
|
+
};
|
|
339
|
+
worker.on('message', messageHandler);
|
|
340
|
+
worker.on('error', errorHandler);
|
|
341
|
+
});
|
|
342
|
+
// Register worker
|
|
343
|
+
this.workers.set(workerId, workerInfo);
|
|
344
|
+
if (!this.workersByRuleset.has(rulesetKey)) {
|
|
345
|
+
this.workersByRuleset.set(rulesetKey, new Set());
|
|
346
|
+
}
|
|
347
|
+
this.workersByRuleset.get(rulesetKey).add(workerId);
|
|
348
|
+
console.log(` ā
Worker ${workerId} ready (${rulesetName}@${rulesetVersion})`);
|
|
349
|
+
}
|
|
350
|
+
/**
|
|
351
|
+
* Notify the first waiter in the worker-ready queue that a worker is available.
|
|
352
|
+
* Called when a worker transitions back to 'ready' after completing a task or timing out.
|
|
353
|
+
*/
|
|
354
|
+
notifyWorkerReady(workerInfo) {
|
|
355
|
+
const rulesetKey = `${workerInfo.rulesetName}@${workerInfo.rulesetVersion}`;
|
|
356
|
+
// Find the first callback waiting for this ruleset
|
|
357
|
+
const idx = this.workerReadyCallbacks.findIndex(cb => cb.rulesetKey === rulesetKey);
|
|
358
|
+
if (idx !== -1) {
|
|
359
|
+
const callback = this.workerReadyCallbacks.splice(idx, 1)[0];
|
|
360
|
+
clearTimeout(callback.timer);
|
|
361
|
+
callback.resolve(workerInfo);
|
|
362
|
+
}
|
|
363
|
+
}
|
|
364
|
+
/**
|
|
365
|
+
* Handle worker failure (auto-restart)
|
|
366
|
+
*/
|
|
367
|
+
async handleWorkerFailure(workerInfo) {
|
|
368
|
+
console.error(`ā Worker ${workerInfo.workerId} failed`);
|
|
369
|
+
// Check restart limit
|
|
370
|
+
if (workerInfo.restartCount >= this.config.maxRetries) {
|
|
371
|
+
console.error(` Maximum retries exceeded for ${workerInfo.workerId}`);
|
|
372
|
+
workerInfo.status = 'terminated';
|
|
373
|
+
return;
|
|
374
|
+
}
|
|
375
|
+
// Terminate failed worker
|
|
376
|
+
try {
|
|
377
|
+
await workerInfo.worker.terminate();
|
|
378
|
+
}
|
|
379
|
+
catch (error) {
|
|
380
|
+
// Ignore termination errors
|
|
381
|
+
}
|
|
382
|
+
// Remove from maps
|
|
383
|
+
this.workers.delete(workerInfo.workerId);
|
|
384
|
+
const rulesetKey = `${workerInfo.rulesetName}@${workerInfo.rulesetVersion}`;
|
|
385
|
+
this.workersByRuleset.get(rulesetKey)?.delete(workerInfo.workerId);
|
|
386
|
+
// Create replacement worker
|
|
387
|
+
try {
|
|
388
|
+
console.log(` š Restarting worker for ${workerInfo.rulesetName}@${workerInfo.rulesetVersion}`);
|
|
389
|
+
await this.createWorker(workerInfo.rulesetName, workerInfo.rulesetVersion);
|
|
390
|
+
}
|
|
391
|
+
catch (error) {
|
|
392
|
+
console.error(` Failed to restart worker: ${error instanceof Error ? error.message : String(error)}`);
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
/**
|
|
396
|
+
* Dynamic scaling monitor ā checks queue pressure every 2 seconds.
|
|
397
|
+
*
|
|
398
|
+
* Scale-up: If pending waiters for a ruleset >= scaleUpThreshold and
|
|
399
|
+
* current workers < maxWorkersPerRuleset, spawn a new worker.
|
|
400
|
+
* Scale-down: If all workers for a ruleset are idle (ready) and
|
|
401
|
+
* current workers > minWorkersPerRuleset, terminate one.
|
|
402
|
+
*/
|
|
403
|
+
startScalingMonitor() {
|
|
404
|
+
const SCALING_CHECK_INTERVAL_MS = 2000;
|
|
405
|
+
this.scalingMonitorInterval = setInterval(() => {
|
|
406
|
+
for (const [rulesetKey, workerIds] of this.workersByRuleset) {
|
|
407
|
+
const currentWorkers = workerIds.size;
|
|
408
|
+
if (currentWorkers === 0)
|
|
409
|
+
continue;
|
|
410
|
+
// Count pending waiters for this ruleset
|
|
411
|
+
const pendingForRuleset = this.workerReadyCallbacks
|
|
412
|
+
.filter(cb => cb.rulesetKey === rulesetKey).length;
|
|
413
|
+
// Count busy workers for this ruleset
|
|
414
|
+
let busyCount = 0;
|
|
415
|
+
let readyCount = 0;
|
|
416
|
+
for (const workerId of workerIds) {
|
|
417
|
+
const worker = this.workers.get(workerId);
|
|
418
|
+
if (worker?.status === 'busy')
|
|
419
|
+
busyCount++;
|
|
420
|
+
if (worker?.status === 'ready')
|
|
421
|
+
readyCount++;
|
|
422
|
+
}
|
|
423
|
+
// Scale UP: queue pressure exceeds threshold and we have capacity
|
|
424
|
+
if (pendingForRuleset >= this.config.scaleUpThreshold
|
|
425
|
+
&& currentWorkers < this.config.maxWorkersPerRuleset
|
|
426
|
+
&& this.workers.size < this.config.totalMaxWorkers) {
|
|
427
|
+
// Parse rulesetName@rulesetVersion
|
|
428
|
+
const [rulesetName, rulesetVersion] = rulesetKey.split('@');
|
|
429
|
+
console.log(`š Scaling up ${rulesetKey}: ${currentWorkers} workers, ${pendingForRuleset} pending waiters`);
|
|
430
|
+
this.createWorker(rulesetName, rulesetVersion).catch(err => {
|
|
431
|
+
console.error(` ā ļø Scale-up failed for ${rulesetKey}: ${err instanceof Error ? err.message : String(err)}`);
|
|
432
|
+
});
|
|
433
|
+
}
|
|
434
|
+
// Scale DOWN: all workers idle, we have more than minimum
|
|
435
|
+
if (readyCount === currentWorkers && busyCount === 0 && pendingForRuleset === 0
|
|
436
|
+
&& currentWorkers > this.config.minWorkersPerRuleset) {
|
|
437
|
+
this.scaleDownOne(rulesetKey);
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
}, SCALING_CHECK_INTERVAL_MS);
|
|
441
|
+
// Don't let the interval prevent process exit
|
|
442
|
+
if (this.scalingMonitorInterval.unref) {
|
|
443
|
+
this.scalingMonitorInterval.unref();
|
|
444
|
+
}
|
|
445
|
+
}
|
|
446
|
+
/**
|
|
447
|
+
* Terminate one idle worker for a ruleset (scale down).
|
|
448
|
+
* Picks the worker with the lowest task count (least utilized).
|
|
449
|
+
*/
|
|
450
|
+
async scaleDownOne(rulesetKey) {
|
|
451
|
+
const workerIds = this.workersByRuleset.get(rulesetKey);
|
|
452
|
+
if (!workerIds)
|
|
453
|
+
return;
|
|
454
|
+
// Find the least-utilized ready worker
|
|
455
|
+
let target = null;
|
|
456
|
+
for (const workerId of workerIds) {
|
|
457
|
+
const worker = this.workers.get(workerId);
|
|
458
|
+
if (worker?.status === 'ready') {
|
|
459
|
+
if (!target || worker.taskCount < target.taskCount) {
|
|
460
|
+
target = worker;
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
if (!target)
|
|
465
|
+
return;
|
|
466
|
+
console.log(`š Scaling down ${rulesetKey}: removing worker ${target.workerId} (${workerIds.size} ā ${workerIds.size - 1})`);
|
|
467
|
+
try {
|
|
468
|
+
await target.worker.terminate();
|
|
469
|
+
}
|
|
470
|
+
catch {
|
|
471
|
+
// Ignore termination errors
|
|
472
|
+
}
|
|
473
|
+
this.workers.delete(target.workerId);
|
|
474
|
+
workerIds.delete(target.workerId);
|
|
475
|
+
}
|
|
476
|
+
/**
|
|
477
|
+
* Get pool statistics
|
|
478
|
+
*/
|
|
479
|
+
getStats() {
|
|
480
|
+
const stats = {
|
|
481
|
+
totalWorkers: this.workers.size,
|
|
482
|
+
readyWorkers: 0,
|
|
483
|
+
busyWorkers: 0,
|
|
484
|
+
errorWorkers: 0,
|
|
485
|
+
workersByRuleset: new Map(),
|
|
486
|
+
totalTasksExecuted: this.totalTasksExecuted,
|
|
487
|
+
averageExecutionTime: this.totalTasksExecuted > 0 ? this.totalExecutionTime / this.totalTasksExecuted : 0,
|
|
488
|
+
pendingWaiters: this.workerReadyCallbacks.length
|
|
489
|
+
};
|
|
490
|
+
for (const worker of this.workers.values()) {
|
|
491
|
+
if (worker.status === 'ready')
|
|
492
|
+
stats.readyWorkers++;
|
|
493
|
+
if (worker.status === 'busy')
|
|
494
|
+
stats.busyWorkers++;
|
|
495
|
+
if (worker.status === 'error')
|
|
496
|
+
stats.errorWorkers++;
|
|
497
|
+
const rulesetKey = `${worker.rulesetName}@${worker.rulesetVersion}`;
|
|
498
|
+
stats.workersByRuleset.set(rulesetKey, (stats.workersByRuleset.get(rulesetKey) || 0) + 1);
|
|
499
|
+
}
|
|
500
|
+
return stats;
|
|
501
|
+
}
|
|
502
|
+
/**
|
|
503
|
+
* Shutdown all workers
|
|
504
|
+
*/
|
|
505
|
+
async shutdown() {
|
|
506
|
+
console.log('š Shutting down worker pool...');
|
|
507
|
+
// Stop scaling monitor
|
|
508
|
+
if (this.scalingMonitorInterval) {
|
|
509
|
+
clearInterval(this.scalingMonitorInterval);
|
|
510
|
+
this.scalingMonitorInterval = null;
|
|
511
|
+
}
|
|
512
|
+
const shutdownPromises = [];
|
|
513
|
+
for (const workerInfo of this.workers.values()) {
|
|
514
|
+
const terminatePromise = workerInfo.worker.terminate()
|
|
515
|
+
.then(() => { })
|
|
516
|
+
.catch(error => {
|
|
517
|
+
console.error(`Error terminating worker ${workerInfo.workerId}:`, error);
|
|
518
|
+
});
|
|
519
|
+
shutdownPromises.push(terminatePromise);
|
|
520
|
+
}
|
|
521
|
+
await Promise.all(shutdownPromises);
|
|
522
|
+
// Clear all pending waiters (resolve with null so they don't hang)
|
|
523
|
+
for (const cb of this.workerReadyCallbacks) {
|
|
524
|
+
clearTimeout(cb.timer);
|
|
525
|
+
cb.resolve(null);
|
|
526
|
+
}
|
|
527
|
+
this.workerReadyCallbacks = [];
|
|
528
|
+
this.workers.clear();
|
|
529
|
+
this.workersByRuleset.clear();
|
|
530
|
+
this.pendingTasks.clear();
|
|
531
|
+
this.initialized = false;
|
|
532
|
+
console.log('ā
Worker pool shutdown complete');
|
|
533
|
+
}
|
|
534
|
+
/**
|
|
535
|
+
* Log current pool status
|
|
536
|
+
*/
|
|
537
|
+
logPoolStatus() {
|
|
538
|
+
const stats = this.getStats();
|
|
539
|
+
console.log(`\nš Worker Pool Status:`);
|
|
540
|
+
console.log(` Total workers: ${stats.totalWorkers}`);
|
|
541
|
+
console.log(` Ready: ${stats.readyWorkers}, Busy: ${stats.busyWorkers}, Error: ${stats.errorWorkers}`);
|
|
542
|
+
console.log(` Workers by ruleset:`);
|
|
543
|
+
for (const [ruleset, count] of stats.workersByRuleset.entries()) {
|
|
544
|
+
console.log(` ${ruleset}: ${count}`);
|
|
545
|
+
}
|
|
546
|
+
console.log();
|
|
547
|
+
}
|
|
548
|
+
}
|
|
549
|
+
//# sourceMappingURL=worker-pool.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker-pool.js","sourceRoot":"","sources":["../src/worker-pool.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,EAAE;AACF,sCAAsC;AAEtC;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAC;AACxC,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAKpC,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AAyD3C,+CAA+C;AAC/C,sBAAsB;AACtB,+CAA+C;AAE/C,MAAM,OAAO,iBAAiB;IAelB;IACA;IACA;IACA;IAjBF,OAAO,GAA4B,IAAI,GAAG,EAAE,CAAC;IAC7C,gBAAgB,GAA6B,IAAI,GAAG,EAAE,CAAC,CAAC,2BAA2B;IACnF,YAAY,GAA8C,IAAI,GAAG,EAAE,CAAC,CAAC,qBAAqB;IAC1F,oBAAoB,GAIvB,EAAE,CAAC,CAAC,wDAAwD;IACzD,WAAW,GAAG,KAAK,CAAC;IACpB,kBAAkB,GAAG,CAAC,CAAC;IACvB,kBAAkB,GAAG,CAAC,CAAC;IACvB,sBAAsB,GAA0C,IAAI,CAAC;IAE7E,YACU,MAAwB,EACxB,aAA4B,EAC5B,aAAmC,EACnC,YAAqB;QAHrB,WAAM,GAAN,MAAM,CAAkB;QACxB,kBAAa,GAAb,aAAa,CAAe;QAC5B,kBAAa,GAAb,aAAa,CAAsB;QACnC,iBAAY,GAAZ,YAAY,CAAS;IAC3B,CAAC;IAEL;;OAEG;IACH,KAAK,CAAC,UAAU;QACd,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,IAAI,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACrD,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,gCAAgC,CAAC,CAAC;QAE9C,6BAA6B;QAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;QAEnD,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC;QAC3E,CAAC;QAED,iCAAiC;QACjC,MAAM,QAAQ,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC;QAClC,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,QAAQ,GAAG,CAAC,CAAC,CAAC;QAC5E,MAAM,oBAAoB,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,KAAK,CAAC,eAAe,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;QAExF,OAAO,CAAC,GAAG,CAAC,iBAAiB,QAAQ,EAAE,CAAC,CAAC;QACzC,OAAO,CAAC,GAAG,CAAC,gBAAgB,QAAQ,CAAC,MAAM,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,GAAG,CAAC,2BAA2B,oBAAoB,EAAE,CAAC,CAAC;QAC/D,OAAO,CAAC,GAAG,CAAC,yBAAyB,eAAe,EAAE,CAAC,CAAC;QAExD,0CAA0C;QAC1C,MAAM,cAAc,GAAoB,EAAE,CAAC;QAC3C,MAAM,cAAc,GAAa,EAAE,CAAC;QAEpC,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;YAC/B,MAAM,eAAe,GAAG,IAAI,CAAC,GAAG,CAAC,oBAAoB,EAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAC;YAEzF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,eAAe,EAAE,CAAC,EAAE,EAAE,CAAC;gBACzC,cAAc,CAAC,IAAI,CACjB,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,EAAE;oBACpE,OAAO,CAAC,KAAK,CAAC,oCAAoC,OAAO,CAAC,IAAI,KAAK,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC;oBACpF,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;gBACpC,CAAC,CAAC,CACH,CAAC;YACJ,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAElC,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC5B,MAAM,IAAI,KAAK,CAAC,iEAAiE,CAAC,CAAC;QACrF,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,OAAO,CAAC,IAAI,CAAC,wCAAwC,CAAC,GAAG,IAAI,GAAG,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QAClG,CAAC;QAED,IAAI,CAAC,WAAW,GAAG,IAAI,CAAC;QACxB,OAAO,CAAC,GAAG,CAAC,kCAAkC,IAAI,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,CAAC;QAC3E,IAAI,CAAC,aAAa,EAAE,CAAC;QAErB,gCAAgC;QAChC,IAAI,CAAC,mBAAmB,EAAE,CAAC;IAC7B,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,OAA2B;QAC3C,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,6BAA6B,CAAC,CAAC;QACjD,CAAC;QAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,WAAW,EAAE,cAAc,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,OAAO,CAAC;QAE5F,0BAA0B;QAC1B,MAAM,OAAO,GAAG,cAAc,IAAI,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC,cAAc,CAAC;QAE7F,8CAA8C;QAC9C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;QAE1E,yBAAyB;QACzB,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,cAAc,CAAC,UAAU,CAAC,CAAC;QACnE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,uBAAuB,UAAU,EAAE,CAAC,CAAC;QACvD,CAAC;QAED,0BAA0B;QAC1B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC;QAEzE,IAAI,CAAC,MAAM,EAAE,CAAC;YACZ,MAAM,IAAI,KAAK,CAAC,oCAAoC,WAAW,IAAI,OAAO,EAAE,CAAC,CAAC;QAChF,CAAC;QAED,eAAe;QACf,OAAO,IAAI,CAAC,eAAe,CAAC,MAAM,EAAE;YAClC,MAAM;YACN,UAAU;YACV,YAAY;YACZ,aAAa;YACb,OAAO,EAAE,OAAO,IAAI,IAAI,CAAC,MAAM,CAAC,WAAW;SAC5C,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CACxB,WAAmB,EACnB,cAAsB,EACtB,UAAkB;QAElB,MAAM,UAAU,GAAG,GAAG,WAAW,IAAI,cAAc,EAAE,CAAC;QACtD,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QAExD,IAAI,CAAC,SAAS,IAAI,SAAS,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YACvC,kDAAkD;YAClD,MAAM,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;YACrD,OAAO,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,cAAc,EAAE,UAAU,CAAC,CAAC;QACpE,CAAC;QAED,wBAAwB;QACxB,MAAM,UAAU,GAAiB,EAAE,CAAC;QACpC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,MAAM,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO,IAAI,MAAM,CAAC,MAAM,KAAK,YAAY,EAAE,CAAC;gBAC1E,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;YAC1B,CAAC;QACH,CAAC;QAED,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC5B,OAAO,IAAI,CAAC;QACd,CAAC;QAED,+DAA+D;QAC/D,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CACpC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,IAAI,CAAC,CAAC,gBAAgB,KAAK,UAAU,CAC/D,CAAC;QAEF,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,gDAAgD;YAChD,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC3C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACpD,CAAC;QACJ,CAAC;QAED,2CAA2C;QAC3C,MAAM,YAAY,GAAG,UAAU,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,CAAC;QAElE,IAAI,YAAY,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC5B,iCAAiC;YACjC,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,OAAO,EAAE,EAAE,CAC3C,OAAO,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,CACpD,CAAC;QACJ,CAAC;QAED,oEAAoE;QACpE,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,iBAAiB,IAAI,KAAK,CAAC;QAC3D,OAAO,IAAI,OAAO,CAAoB,CAAC,OAAO,EAAE,EAAE;YAChD,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,+BAA+B;gBAC/B,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,OAAO,KAAK,OAAO,CAAC,CAAC;gBAC9E,IAAI,GAAG,KAAK,CAAC,CAAC;oBAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;gBACzD,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,EAAE,WAAW,CAAC,CAAC;YAEhB,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC;gBAC7B,UAAU;gBACV,OAAO;gBACP,KAAK;aACN,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,eAAe,CACrB,UAAsB,EACtB,IAMC;QAED,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,YAAY,EAAE,aAAa,EAAE,OAAO,EAAE,GAAG,IAAI,CAAC;YAE1E,sBAAsB;YACtB,UAAU,CAAC,MAAM,GAAG,MAAM,CAAC;YAC3B,UAAU,CAAC,aAAa,GAAG,MAAM,CAAC;YAElC,wBAAwB;YACxB,MAAM,aAAa,GAAG,CAAC,GAAQ,EAAE,EAAE;gBACjC,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,CAAC,MAAM,KAAK,MAAM,EAAE,CAAC;oBAC3D,WAAW;oBACX,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;oBAChD,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;oBAEjC,uBAAuB;oBACvB,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;oBAC5B,UAAU,CAAC,aAAa,GAAG,SAAS,CAAC;oBACrC,UAAU,CAAC,SAAS,EAAE,CAAC;oBAEvB,iEAAiE;oBACjE,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;oBAEnC,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;wBACxB,iBAAiB;wBACjB,IAAI,CAAC,kBAAkB,EAAE,CAAC;wBAC1B,IAAI,CAAC,kBAAkB,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;wBACrD,UAAU,CAAC,oBAAoB;4BAC7B,CAAC,UAAU,CAAC,oBAAoB,GAAG,CAAC,UAAU,CAAC,SAAS,GAAG,CAAC,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,aAAa,CAAC;gCAC1F,UAAU,CAAC,SAAS,CAAC;wBAEvB,wBAAwB;wBACxB,IAAI,GAAG,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;4BACzB,UAAU,CAAC,gBAAgB,GAAG,UAAU,CAAC;4BACzC,UAAU,CAAC,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC;wBACnC,CAAC;wBAED,OAAO,CAAC;4BACN,MAAM;4BACN,OAAO,EAAE,IAAI;4BACb,OAAO,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO;4BAC5B,aAAa,EAAE,GAAG,CAAC,OAAO,CAAC,aAAa;4BACxC,QAAQ,EAAE,UAAU,CAAC,QAAQ;4BAC7B,QAAQ,EAAE,GAAG,CAAC,OAAO,CAAC,QAAQ;yBAC/B,CAAC,CAAC;oBACL,CAAC;yBAAM,CAAC;wBACN,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,uBAAuB,CAAC,CAAC,CAAC;oBAClE,CAAC;gBACH,CAAC;YACH,CAAC,CAAC;YAEF,uBAAuB;YACvB,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;gBACpC,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBAChD,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBAC7C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEjC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;gBAC5B,UAAU,CAAC,aAAa,GAAG,SAAS,CAAC;gBAErC,MAAM,CAAC,IAAI,KAAK,CAAC,iBAAiB,KAAK,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;gBAEpD,wBAAwB;gBACxB,IAAI,CAAC,mBAAmB,CAAC,UAAU,CAAC,CAAC;YACvC,CAAC,CAAC;YAEF,iBAAiB;YACjB,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC5B,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;gBAChD,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBAC7C,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEjC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;gBAC5B,UAAU,CAAC,aAAa,GAAG,SAAS,CAAC;gBAErC,iEAAiE;gBACjE,IAAI,CAAC,iBAAiB,CAAC,UAAU,CAAC,CAAC;gBAEnC,MAAM,YAAY,GAAG,IAAI,KAAK,CAAC,sBAAsB,OAAO,IAAI,CAAC,CAAC;gBACjE,YAAoB,CAAC,IAAI,GAAG,SAAS,CAAC;gBACvC,MAAM,CAAC,YAAY,CAAC,CAAC;YACvB,CAAC,EAAE,OAAO,CAAC,CAAC;YAEZ,oBAAoB;YACpB,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,aAAa,CAAC,CAAC;YAC/C,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;YAC5C,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,EAAE;gBACvC,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,OAAO,CAAC,MAAM,CAAC,CAAC;YAClB,CAAC,CAAC,CAAC;YAEH,iCAAiC;YACjC,UAAU,CAAC,MAAM,CAAC,WAAW,CAAC;gBAC5B,IAAI,EAAE,SAAS;gBACf,OAAO,EAAE;oBACP,MAAM;oBACN,UAAU;oBACV,YAAY;oBACZ,OAAO;oBACP,aAAa;iBACd;aACF,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,YAAY,CACxB,WAAmB,EACnB,cAAsB;QAEtB,MAAM,QAAQ,GAAG,GAAG,WAAW,IAAI,cAAc,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,EAAE,CAAC;QAC7G,MAAM,UAAU,GAAG,GAAG,WAAW,IAAI,cAAc,EAAE,CAAC;QAEtD,2BAA2B;QAC3B,IAAI,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;YACrD,MAAM,IAAI,KAAK,CAAC,gCAAgC,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC,CAAC;QACjF,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,aAAa,CAAC,WAAW,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC;QAClF,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;QAExC,uBAAuB;QACvB,MAAM,gBAAgB,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC3D,MAAM,MAAM,GAAG,IAAI,MAAM,CAAC,gBAAgB,EAAE;YAC1C,UAAU,EAAE;gBACV,QAAQ;gBACR,WAAW;gBACX,cAAc;gBACd,WAAW;gBACX,aAAa,EAAE,OAAO,CAAC,MAAM,IAAI,SAAS;gBAC1C,YAAY,EAAE,IAAI,CAAC,YAAY;gBAC/B,MAAM,EAAE;oBACN,aAAa,EAAE,IAAI,CAAC,MAAM,CAAC,aAAa;oBACxC,WAAW,EAAE,IAAI,CAAC,MAAM,CAAC,WAAW;iBACrC;aACF;SACF,CAAC,CAAC;QAEH,qBAAqB;QACrB,MAAM,UAAU,GAAe;YAC7B,QAAQ;YACR,MAAM;YACN,WAAW;YACX,cAAc;YACd,MAAM,EAAE,cAAc;YACtB,SAAS,EAAE,CAAC;YACZ,oBAAoB,EAAE,CAAC;YACvB,aAAa,EAAE,IAAI,IAAI,EAAE;YACzB,SAAS,EAAE,IAAI,IAAI,EAAE;YACrB,YAAY,EAAE,CAAC;SAChB,CAAC;QAEF,kCAAkC;QAClC,MAAM,IAAI,OAAO,CAAO,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC1C,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,EAAE;gBAC9B,MAAM,CAAC,IAAI,KAAK,CAAC,UAAU,QAAQ,yBAAyB,CAAC,CAAC,CAAC;YACjE,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,cAAc;YAEzB,MAAM,cAAc,GAAG,CAAC,GAAQ,EAAE,EAAE;gBAClC,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBACzB,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;oBACtC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBAClC,UAAU,CAAC,MAAM,GAAG,OAAO,CAAC;oBAC5B,OAAO,EAAE,CAAC;gBACZ,CAAC;qBAAM,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;oBAChC,YAAY,CAAC,OAAO,CAAC,CAAC;oBACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;oBACtC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;oBAClC,MAAM,CAAC,IAAI,KAAK,CAAC,GAAG,CAAC,OAAO,CAAC,KAAK,IAAI,8BAA8B,CAAC,CAAC,CAAC;gBACzE,CAAC;YACH,CAAC,CAAC;YAEF,MAAM,YAAY,GAAG,CAAC,KAAY,EAAE,EAAE;gBACpC,YAAY,CAAC,OAAO,CAAC,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;gBACtC,MAAM,CAAC,GAAG,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;gBAClC,MAAM,CAAC,KAAK,CAAC,CAAC;YAChB,CAAC,CAAC;YAEF,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,cAAc,CAAC,CAAC;YACrC,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,YAAY,CAAC,CAAC;QACnC,CAAC,CAAC,CAAC;QAEH,kBAAkB;QAClB,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAEvC,IAAI,CAAC,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;YAC3C,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACnD,CAAC;QACD,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAErD,OAAO,CAAC,GAAG,CAAC,eAAe,QAAQ,WAAW,WAAW,IAAI,cAAc,GAAG,CAAC,CAAC;IAClF,CAAC;IAED;;;OAGG;IACK,iBAAiB,CAAC,UAAsB;QAC9C,MAAM,UAAU,GAAG,GAAG,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAE5E,mDAAmD;QACnD,MAAM,GAAG,GAAG,IAAI,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC;QACpF,IAAI,GAAG,KAAK,CAAC,CAAC,EAAE,CAAC;YACf,MAAM,QAAQ,GAAG,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;YAC7D,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC7B,QAAQ,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC/B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,mBAAmB,CAAC,UAAsB;QACtD,OAAO,CAAC,KAAK,CAAC,YAAY,UAAU,CAAC,QAAQ,SAAS,CAAC,CAAC;QAExD,sBAAsB;QACtB,IAAI,UAAU,CAAC,YAAY,IAAI,IAAI,CAAC,MAAM,CAAC,UAAU,EAAE,CAAC;YACtD,OAAO,CAAC,KAAK,CAAC,mCAAmC,UAAU,CAAC,QAAQ,EAAE,CAAC,CAAC;YACxE,UAAU,CAAC,MAAM,GAAG,YAAY,CAAC;YACjC,OAAO;QACT,CAAC;QAED,0BAA0B;QAC1B,IAAI,CAAC;YACH,MAAM,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QACtC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,4BAA4B;QAC9B,CAAC;QAED,mBAAmB;QACnB,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QACzC,MAAM,UAAU,GAAG,GAAG,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC;QAC5E,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAEnE,4BAA4B;QAC5B,IAAI,CAAC;YACH,OAAO,CAAC,GAAG,CAAC,+BAA+B,UAAU,CAAC,WAAW,IAAI,UAAU,CAAC,cAAc,EAAE,CAAC,CAAC;YAClG,MAAM,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,UAAU,CAAC,cAAc,CAAC,CAAC;QAC7E,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,CAAC,KAAK,CAAC,gCAAgC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1G,CAAC;IACH,CAAC;IAED;;;;;;;OAOG;IACK,mBAAmB;QACzB,MAAM,yBAAyB,GAAG,IAAI,CAAC;QAEvC,IAAI,CAAC,sBAAsB,GAAG,WAAW,CAAC,GAAG,EAAE;YAC7C,KAAK,MAAM,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,gBAAgB,EAAE,CAAC;gBAC5D,MAAM,cAAc,GAAG,SAAS,CAAC,IAAI,CAAC;gBACtC,IAAI,cAAc,KAAK,CAAC;oBAAE,SAAS;gBAEnC,yCAAyC;gBACzC,MAAM,iBAAiB,GAAG,IAAI,CAAC,oBAAoB;qBAChD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,KAAK,UAAU,CAAC,CAAC,MAAM,CAAC;gBAErD,sCAAsC;gBACtC,IAAI,SAAS,GAAG,CAAC,CAAC;gBAClB,IAAI,UAAU,GAAG,CAAC,CAAC;gBACnB,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;oBACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;oBAC1C,IAAI,MAAM,EAAE,MAAM,KAAK,MAAM;wBAAE,SAAS,EAAE,CAAC;oBAC3C,IAAI,MAAM,EAAE,MAAM,KAAK,OAAO;wBAAE,UAAU,EAAE,CAAC;gBAC/C,CAAC;gBAED,kEAAkE;gBAClE,IAAI,iBAAiB,IAAI,IAAI,CAAC,MAAM,CAAC,gBAAgB;uBAChD,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB;uBACjD,IAAI,CAAC,OAAO,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,eAAe,EAAE,CAAC;oBACrD,mCAAmC;oBACnC,MAAM,CAAC,WAAW,EAAE,cAAc,CAAC,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;oBAC5D,OAAO,CAAC,GAAG,CAAC,iBAAiB,UAAU,KAAK,cAAc,aAAa,iBAAiB,kBAAkB,CAAC,CAAC;oBAC5G,IAAI,CAAC,YAAY,CAAC,WAAW,EAAE,cAAc,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,EAAE;wBACzD,OAAO,CAAC,KAAK,CAAC,8BAA8B,UAAU,KAAK,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;oBACjH,CAAC,CAAC,CAAC;gBACL,CAAC;gBAED,0DAA0D;gBAC1D,IAAI,UAAU,KAAK,cAAc,IAAI,SAAS,KAAK,CAAC,IAAI,iBAAiB,KAAK,CAAC;uBAC1E,cAAc,GAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,EAAE,CAAC;oBACvD,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;gBAChC,CAAC;YACH,CAAC;QACH,CAAC,EAAE,yBAAyB,CAAC,CAAC;QAE9B,8CAA8C;QAC9C,IAAI,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;YACtC,IAAI,CAAC,sBAAsB,CAAC,KAAK,EAAE,CAAC;QACtC,CAAC;IACH,CAAC;IAED;;;OAGG;IACK,KAAK,CAAC,YAAY,CAAC,UAAkB;QAC3C,MAAM,SAAS,GAAG,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;QACxD,IAAI,CAAC,SAAS;YAAE,OAAO;QAEvB,uCAAuC;QACvC,IAAI,MAAM,GAAsB,IAAI,CAAC;QACrC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;YACjC,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;YAC1C,IAAI,MAAM,EAAE,MAAM,KAAK,OAAO,EAAE,CAAC;gBAC/B,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,SAAS,GAAG,MAAM,CAAC,SAAS,EAAE,CAAC;oBACnD,MAAM,GAAG,MAAM,CAAC;gBAClB,CAAC;YACH,CAAC;QACH,CAAC;QAED,IAAI,CAAC,MAAM;YAAE,OAAO;QAEpB,OAAO,CAAC,GAAG,CAAC,mBAAmB,UAAU,qBAAqB,MAAM,CAAC,QAAQ,KAAK,SAAS,CAAC,IAAI,MAAM,SAAS,CAAC,IAAI,GAAG,CAAC,GAAG,CAAC,CAAC;QAE7H,IAAI,CAAC;YACH,MAAM,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,4BAA4B;QAC9B,CAAC;QAED,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;QACrC,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,QAAQ;QACN,MAAM,KAAK,GAAc;YACvB,YAAY,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI;YAC/B,YAAY,EAAE,CAAC;YACf,WAAW,EAAE,CAAC;YACd,YAAY,EAAE,CAAC;YACf,gBAAgB,EAAE,IAAI,GAAG,EAAE;YAC3B,kBAAkB,EAAE,IAAI,CAAC,kBAAkB;YAC3C,oBAAoB,EAAE,IAAI,CAAC,kBAAkB,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC;YACzG,cAAc,EAAE,IAAI,CAAC,oBAAoB,CAAC,MAAM;SACjD,CAAC;QAEF,KAAK,MAAM,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC3C,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;gBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;YACpD,IAAI,MAAM,CAAC,MAAM,KAAK,MAAM;gBAAE,KAAK,CAAC,WAAW,EAAE,CAAC;YAClD,IAAI,MAAM,CAAC,MAAM,KAAK,OAAO;gBAAE,KAAK,CAAC,YAAY,EAAE,CAAC;YAEpD,MAAM,UAAU,GAAG,GAAG,MAAM,CAAC,WAAW,IAAI,MAAM,CAAC,cAAc,EAAE,CAAC;YACpE,KAAK,CAAC,gBAAgB,CAAC,GAAG,CACxB,UAAU,EACV,CAAC,KAAK,CAAC,gBAAgB,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAClD,CAAC;QACJ,CAAC;QAED,OAAO,KAAK,CAAC;IACf,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,QAAQ;QACZ,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;QAE/C,uBAAuB;QACvB,IAAI,IAAI,CAAC,sBAAsB,EAAE,CAAC;YAChC,aAAa,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;YAC3C,IAAI,CAAC,sBAAsB,GAAG,IAAI,CAAC;QACrC,CAAC;QAED,MAAM,gBAAgB,GAAoB,EAAE,CAAC;QAE7C,KAAK,MAAM,UAAU,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC;YAC/C,MAAM,gBAAgB,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,EAAE;iBACnD,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;iBACf,KAAK,CAAC,KAAK,CAAC,EAAE;gBACb,OAAO,CAAC,KAAK,CAAC,4BAA4B,UAAU,CAAC,QAAQ,GAAG,EAAE,KAAK,CAAC,CAAC;YAC3E,CAAC,CAAC,CAAC;YACL,gBAAgB,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QAC1C,CAAC;QAED,MAAM,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,CAAC;QAEpC,mEAAmE;QACnE,KAAK,MAAM,EAAE,IAAI,IAAI,CAAC,oBAAoB,EAAE,CAAC;YAC3C,YAAY,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC;YACvB,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;QACD,IAAI,CAAC,oBAAoB,GAAG,EAAE,CAAC;QAE/B,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,CAAC;QACrB,IAAI,CAAC,gBAAgB,CAAC,KAAK,EAAE,CAAC;QAC9B,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;QAC1B,IAAI,CAAC,WAAW,GAAG,KAAK,CAAC;QAEzB,OAAO,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACjD,CAAC;IAED;;OAEG;IACK,aAAa;QACnB,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,0BAA0B,CAAC,CAAC;QACxC,OAAO,CAAC,GAAG,CAAC,qBAAqB,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACvD,OAAO,CAAC,GAAG,CAAC,aAAa,KAAK,CAAC,YAAY,WAAW,KAAK,CAAC,WAAW,YAAY,KAAK,CAAC,YAAY,EAAE,CAAC,CAAC;QACzG,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;QAEtC,KAAK,MAAM,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,EAAE,CAAC;YAChE,OAAO,CAAC,GAAG,CAAC,SAAS,OAAO,KAAK,KAAK,EAAE,CAAC,CAAC;QAC5C,CAAC;QACD,OAAO,CAAC,GAAG,EAAE,CAAC;IAChB,CAAC;CACF"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"worker.d.ts","sourceRoot":"","sources":["../src/worker.ts"],"names":[],"mappings":""}
|