@zincapp/znvault-cli 2.1.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 (122) hide show
  1. package/README.md +310 -0
  2. package/dist/commands/agent.d.ts +3 -0
  3. package/dist/commands/agent.d.ts.map +1 -0
  4. package/dist/commands/agent.js +660 -0
  5. package/dist/commands/agent.js.map +1 -0
  6. package/dist/commands/apikey.d.ts +3 -0
  7. package/dist/commands/apikey.d.ts.map +1 -0
  8. package/dist/commands/apikey.js +767 -0
  9. package/dist/commands/apikey.js.map +1 -0
  10. package/dist/commands/audit.d.ts +3 -0
  11. package/dist/commands/audit.d.ts.map +1 -0
  12. package/dist/commands/audit.js +147 -0
  13. package/dist/commands/audit.js.map +1 -0
  14. package/dist/commands/auth.d.ts +3 -0
  15. package/dist/commands/auth.d.ts.map +1 -0
  16. package/dist/commands/auth.js +426 -0
  17. package/dist/commands/auth.js.map +1 -0
  18. package/dist/commands/cert.d.ts +3 -0
  19. package/dist/commands/cert.d.ts.map +1 -0
  20. package/dist/commands/cert.js +398 -0
  21. package/dist/commands/cert.js.map +1 -0
  22. package/dist/commands/cluster.d.ts +3 -0
  23. package/dist/commands/cluster.d.ts.map +1 -0
  24. package/dist/commands/cluster.js +228 -0
  25. package/dist/commands/cluster.js.map +1 -0
  26. package/dist/commands/emergency.d.ts +3 -0
  27. package/dist/commands/emergency.d.ts.map +1 -0
  28. package/dist/commands/emergency.js +223 -0
  29. package/dist/commands/emergency.js.map +1 -0
  30. package/dist/commands/health.d.ts +3 -0
  31. package/dist/commands/health.d.ts.map +1 -0
  32. package/dist/commands/health.js +188 -0
  33. package/dist/commands/health.js.map +1 -0
  34. package/dist/commands/lockdown.d.ts +3 -0
  35. package/dist/commands/lockdown.d.ts.map +1 -0
  36. package/dist/commands/lockdown.js +232 -0
  37. package/dist/commands/lockdown.js.map +1 -0
  38. package/dist/commands/permissions.d.ts +3 -0
  39. package/dist/commands/permissions.d.ts.map +1 -0
  40. package/dist/commands/permissions.js +168 -0
  41. package/dist/commands/permissions.js.map +1 -0
  42. package/dist/commands/policy.d.ts +3 -0
  43. package/dist/commands/policy.d.ts.map +1 -0
  44. package/dist/commands/policy.js +660 -0
  45. package/dist/commands/policy.js.map +1 -0
  46. package/dist/commands/superadmin.d.ts +3 -0
  47. package/dist/commands/superadmin.d.ts.map +1 -0
  48. package/dist/commands/superadmin.js +203 -0
  49. package/dist/commands/superadmin.js.map +1 -0
  50. package/dist/commands/tenant.d.ts +3 -0
  51. package/dist/commands/tenant.d.ts.map +1 -0
  52. package/dist/commands/tenant.js +277 -0
  53. package/dist/commands/tenant.js.map +1 -0
  54. package/dist/commands/update.d.ts +9 -0
  55. package/dist/commands/update.d.ts.map +1 -0
  56. package/dist/commands/update.js +359 -0
  57. package/dist/commands/update.js.map +1 -0
  58. package/dist/commands/user.d.ts +3 -0
  59. package/dist/commands/user.d.ts.map +1 -0
  60. package/dist/commands/user.js +363 -0
  61. package/dist/commands/user.js.map +1 -0
  62. package/dist/index.d.ts +3 -0
  63. package/dist/index.d.ts.map +1 -0
  64. package/dist/index.js +82 -0
  65. package/dist/index.js.map +1 -0
  66. package/dist/lib/client.d.ts +246 -0
  67. package/dist/lib/client.d.ts.map +1 -0
  68. package/dist/lib/client.js +734 -0
  69. package/dist/lib/client.js.map +1 -0
  70. package/dist/lib/config.d.ts +130 -0
  71. package/dist/lib/config.d.ts.map +1 -0
  72. package/dist/lib/config.js +342 -0
  73. package/dist/lib/config.js.map +1 -0
  74. package/dist/lib/db.d.ts +111 -0
  75. package/dist/lib/db.d.ts.map +1 -0
  76. package/dist/lib/db.js +698 -0
  77. package/dist/lib/db.js.map +1 -0
  78. package/dist/lib/local.d.ts +41 -0
  79. package/dist/lib/local.d.ts.map +1 -0
  80. package/dist/lib/local.js +236 -0
  81. package/dist/lib/local.js.map +1 -0
  82. package/dist/lib/mode.d.ts +210 -0
  83. package/dist/lib/mode.d.ts.map +1 -0
  84. package/dist/lib/mode.js +389 -0
  85. package/dist/lib/mode.js.map +1 -0
  86. package/dist/lib/output.d.ts +61 -0
  87. package/dist/lib/output.d.ts.map +1 -0
  88. package/dist/lib/output.js +190 -0
  89. package/dist/lib/output.js.map +1 -0
  90. package/dist/lib/prompts.d.ts +32 -0
  91. package/dist/lib/prompts.d.ts.map +1 -0
  92. package/dist/lib/prompts.js +96 -0
  93. package/dist/lib/prompts.js.map +1 -0
  94. package/dist/services/auto-update-daemon.d.ts +48 -0
  95. package/dist/services/auto-update-daemon.d.ts.map +1 -0
  96. package/dist/services/auto-update-daemon.js +296 -0
  97. package/dist/services/auto-update-daemon.js.map +1 -0
  98. package/dist/services/signature-verifier.d.ts +38 -0
  99. package/dist/services/signature-verifier.d.ts.map +1 -0
  100. package/dist/services/signature-verifier.js +209 -0
  101. package/dist/services/signature-verifier.js.map +1 -0
  102. package/dist/services/update-checker.d.ts +39 -0
  103. package/dist/services/update-checker.d.ts.map +1 -0
  104. package/dist/services/update-checker.js +198 -0
  105. package/dist/services/update-checker.js.map +1 -0
  106. package/dist/services/update-installer.d.ts +54 -0
  107. package/dist/services/update-installer.d.ts.map +1 -0
  108. package/dist/services/update-installer.js +360 -0
  109. package/dist/services/update-installer.js.map +1 -0
  110. package/dist/types/index.d.ts +411 -0
  111. package/dist/types/index.d.ts.map +1 -0
  112. package/dist/types/index.js +2 -0
  113. package/dist/types/index.js.map +1 -0
  114. package/dist/types/update.d.ts +137 -0
  115. package/dist/types/update.d.ts.map +1 -0
  116. package/dist/types/update.js +27 -0
  117. package/dist/types/update.js.map +1 -0
  118. package/dist/utils/platform.d.ts +35 -0
  119. package/dist/utils/platform.d.ts.map +1 -0
  120. package/dist/utils/platform.js +115 -0
  121. package/dist/utils/platform.js.map +1 -0
  122. package/package.json +59 -0
@@ -0,0 +1,360 @@
1
+ // Path: znvault-cli/src/services/update-installer.ts
2
+ /**
3
+ * Update Installer Service
4
+ *
5
+ * Downloads, verifies, and installs agent updates with atomic replacement
6
+ * and automatic rollback on failure.
7
+ */
8
+ import * as fs from 'fs';
9
+ import * as path from 'path';
10
+ import * as os from 'os';
11
+ import * as https from 'https';
12
+ import { exec } from 'child_process';
13
+ import { promisify } from 'util';
14
+ import { getSignatureVerifier } from './signature-verifier.js';
15
+ import { getInstallPath } from '../utils/platform.js';
16
+ const execAsync = promisify(exec);
17
+ export class UpdateInstaller {
18
+ installPath;
19
+ onProgress;
20
+ constructor(installPath, onProgress) {
21
+ this.installPath = installPath || getInstallPath();
22
+ this.onProgress = onProgress;
23
+ }
24
+ /**
25
+ * Report progress to callback
26
+ */
27
+ report(progress) {
28
+ if (this.onProgress) {
29
+ this.onProgress(progress);
30
+ }
31
+ }
32
+ /**
33
+ * Download file with progress reporting
34
+ */
35
+ async download(url, destPath, onProgress) {
36
+ return new Promise((resolve, reject) => {
37
+ const file = fs.createWriteStream(destPath);
38
+ https.get(url, { rejectUnauthorized: true }, (res) => {
39
+ if (res.statusCode === 301 || res.statusCode === 302) {
40
+ // Handle redirect
41
+ const redirectUrl = res.headers.location;
42
+ if (redirectUrl) {
43
+ file.close();
44
+ fs.unlinkSync(destPath);
45
+ this.download(redirectUrl, destPath, onProgress).then(resolve).catch(reject);
46
+ return;
47
+ }
48
+ }
49
+ if (res.statusCode !== 200) {
50
+ file.close();
51
+ fs.unlinkSync(destPath);
52
+ reject(new Error(`Download failed: HTTP ${res.statusCode}`));
53
+ return;
54
+ }
55
+ const totalSize = parseInt(res.headers['content-length'] || '0', 10);
56
+ let downloadedSize = 0;
57
+ res.on('data', (chunk) => {
58
+ downloadedSize += chunk.length;
59
+ if (totalSize > 0 && onProgress) {
60
+ const percent = Math.round((downloadedSize / totalSize) * 100);
61
+ onProgress(percent);
62
+ }
63
+ });
64
+ res.pipe(file);
65
+ file.on('finish', () => {
66
+ file.close();
67
+ resolve();
68
+ });
69
+ file.on('error', (err) => {
70
+ file.close();
71
+ fs.unlinkSync(destPath);
72
+ reject(err);
73
+ });
74
+ }).on('error', (err) => {
75
+ file.close();
76
+ if (fs.existsSync(destPath)) {
77
+ fs.unlinkSync(destPath);
78
+ }
79
+ reject(err);
80
+ });
81
+ });
82
+ }
83
+ /**
84
+ * Extract tarball to directory
85
+ */
86
+ async extractTarball(tarballPath, extractDir) {
87
+ await execAsync(`tar -xzf "${tarballPath}" -C "${extractDir}"`);
88
+ }
89
+ /**
90
+ * Find the binary in extracted directory
91
+ */
92
+ findBinary(extractDir) {
93
+ // Check common locations
94
+ const candidates = [
95
+ path.join(extractDir, 'znvault'),
96
+ path.join(extractDir, 'bin', 'znvault'),
97
+ path.join(extractDir, 'vault-agent'),
98
+ path.join(extractDir, 'bin', 'vault-agent'),
99
+ ];
100
+ for (const candidate of candidates) {
101
+ if (fs.existsSync(candidate)) {
102
+ return candidate;
103
+ }
104
+ }
105
+ // Search recursively
106
+ const files = fs.readdirSync(extractDir);
107
+ for (const file of files) {
108
+ const filePath = path.join(extractDir, file);
109
+ const stat = fs.statSync(filePath);
110
+ if (stat.isDirectory()) {
111
+ const found = this.findBinary(filePath);
112
+ if (found)
113
+ return found;
114
+ }
115
+ else if (file === 'znvault' || file === 'vault-agent') {
116
+ return filePath;
117
+ }
118
+ }
119
+ return null;
120
+ }
121
+ /**
122
+ * Install the update
123
+ *
124
+ * @param artifact - Artifact info with URL, checksum, and signature
125
+ * @param version - Version being installed
126
+ */
127
+ async install(artifact, version) {
128
+ const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), 'znvault-update-'));
129
+ const tarballPath = path.join(tmpDir, `vault-agent_${version}.tar.gz`);
130
+ const extractDir = path.join(tmpDir, 'extracted');
131
+ try {
132
+ // 1. Download
133
+ this.report({
134
+ stage: 'downloading',
135
+ progress: 0,
136
+ message: 'Downloading update...',
137
+ });
138
+ await this.download(artifact.url, tarballPath, (progress) => {
139
+ this.report({
140
+ stage: 'downloading',
141
+ progress,
142
+ message: `Downloading: ${progress}%`,
143
+ });
144
+ });
145
+ // 2. Verify checksum
146
+ this.report({
147
+ stage: 'verifying',
148
+ message: 'Verifying checksum...',
149
+ });
150
+ const verifier = getSignatureVerifier();
151
+ if (!verifier.verifyChecksum(tarballPath, artifact.sha256)) {
152
+ throw new Error('Checksum verification failed - file may be corrupted');
153
+ }
154
+ // 3. Verify signature
155
+ this.report({
156
+ stage: 'verifying',
157
+ message: 'Verifying GPG signature...',
158
+ });
159
+ const signatureValid = await verifier.verifySignature(tarballPath, artifact.signature);
160
+ if (!signatureValid) {
161
+ throw new Error('Signature verification failed - update may be tampered');
162
+ }
163
+ // 4. Extract
164
+ this.report({
165
+ stage: 'installing',
166
+ message: 'Extracting update...',
167
+ });
168
+ fs.mkdirSync(extractDir, { recursive: true });
169
+ await this.extractTarball(tarballPath, extractDir);
170
+ // 5. Find binary
171
+ const newBinaryPath = this.findBinary(extractDir);
172
+ if (!newBinaryPath) {
173
+ throw new Error('Could not find binary in extracted archive');
174
+ }
175
+ // 6. Install (directory-based for node packages, binary for standalone)
176
+ this.report({
177
+ stage: 'installing',
178
+ message: 'Installing update...',
179
+ });
180
+ // Check if this is a node package (has dist/) or standalone binary
181
+ const hasDistDir = fs.existsSync(path.join(extractDir, 'dist'));
182
+ if (hasDistDir) {
183
+ // Node package: install entire directory
184
+ await this.installDirectory(extractDir);
185
+ }
186
+ else {
187
+ // Standalone binary: atomic replacement
188
+ await this.atomicReplace(newBinaryPath);
189
+ }
190
+ // 7. Complete
191
+ this.report({
192
+ stage: 'complete',
193
+ message: `Successfully updated to version ${version}`,
194
+ });
195
+ }
196
+ catch (err) {
197
+ this.report({
198
+ stage: 'error',
199
+ message: 'Update failed',
200
+ error: err instanceof Error ? err.message : String(err),
201
+ });
202
+ throw err;
203
+ }
204
+ finally {
205
+ // Cleanup temp directory
206
+ try {
207
+ fs.rmSync(tmpDir, { recursive: true, force: true });
208
+ }
209
+ catch {
210
+ // Ignore cleanup errors
211
+ }
212
+ }
213
+ }
214
+ /**
215
+ * Install a directory-based package (Node.js with dist/)
216
+ */
217
+ async installDirectory(extractDir) {
218
+ const installDir = path.dirname(this.installPath);
219
+ const backupDir = `${installDir}.backup`;
220
+ // Ensure parent directory exists
221
+ const parentDir = path.dirname(installDir);
222
+ if (!fs.existsSync(parentDir)) {
223
+ fs.mkdirSync(parentDir, { recursive: true });
224
+ }
225
+ // Backup current installation if it exists
226
+ const hasExisting = fs.existsSync(installDir);
227
+ if (hasExisting) {
228
+ // Remove old backup if exists
229
+ if (fs.existsSync(backupDir)) {
230
+ fs.rmSync(backupDir, { recursive: true, force: true });
231
+ }
232
+ fs.renameSync(installDir, backupDir);
233
+ }
234
+ try {
235
+ // Copy extracted contents to install directory
236
+ fs.mkdirSync(installDir, { recursive: true });
237
+ await this.copyDirectory(extractDir, installDir);
238
+ // Make wrapper script executable
239
+ if (fs.existsSync(this.installPath)) {
240
+ fs.chmodSync(this.installPath, 0o755);
241
+ }
242
+ // Remove backup on success
243
+ if (hasExisting && fs.existsSync(backupDir)) {
244
+ fs.rmSync(backupDir, { recursive: true, force: true });
245
+ }
246
+ }
247
+ catch (err) {
248
+ // Rollback on failure
249
+ if (hasExisting && fs.existsSync(backupDir)) {
250
+ try {
251
+ if (fs.existsSync(installDir)) {
252
+ fs.rmSync(installDir, { recursive: true, force: true });
253
+ }
254
+ fs.renameSync(backupDir, installDir);
255
+ }
256
+ catch (rollbackErr) {
257
+ console.error('Rollback failed:', rollbackErr);
258
+ }
259
+ }
260
+ throw err;
261
+ }
262
+ }
263
+ /**
264
+ * Recursively copy a directory
265
+ */
266
+ async copyDirectory(src, dest) {
267
+ const entries = fs.readdirSync(src, { withFileTypes: true });
268
+ for (const entry of entries) {
269
+ const srcPath = path.join(src, entry.name);
270
+ const destPath = path.join(dest, entry.name);
271
+ if (entry.isDirectory()) {
272
+ fs.mkdirSync(destPath, { recursive: true });
273
+ await this.copyDirectory(srcPath, destPath);
274
+ }
275
+ else {
276
+ fs.copyFileSync(srcPath, destPath);
277
+ }
278
+ }
279
+ }
280
+ /**
281
+ * Atomically replace the binary with rollback on failure
282
+ */
283
+ async atomicReplace(newBinaryPath) {
284
+ const backupPath = `${this.installPath}.backup`;
285
+ const installDir = path.dirname(this.installPath);
286
+ // Ensure install directory exists
287
+ if (!fs.existsSync(installDir)) {
288
+ fs.mkdirSync(installDir, { recursive: true });
289
+ }
290
+ // Backup current binary if it exists
291
+ const hasExisting = fs.existsSync(this.installPath);
292
+ if (hasExisting) {
293
+ fs.copyFileSync(this.installPath, backupPath);
294
+ }
295
+ try {
296
+ // Copy new binary to temp location in target directory
297
+ const tempPath = `${this.installPath}.new`;
298
+ fs.copyFileSync(newBinaryPath, tempPath);
299
+ fs.chmodSync(tempPath, 0o755);
300
+ // Atomic rename
301
+ fs.renameSync(tempPath, this.installPath);
302
+ // Remove backup on success
303
+ if (hasExisting && fs.existsSync(backupPath)) {
304
+ fs.unlinkSync(backupPath);
305
+ }
306
+ }
307
+ catch (err) {
308
+ // Rollback on failure
309
+ if (hasExisting && fs.existsSync(backupPath)) {
310
+ try {
311
+ fs.copyFileSync(backupPath, this.installPath);
312
+ fs.unlinkSync(backupPath);
313
+ }
314
+ catch (rollbackErr) {
315
+ console.error('Rollback failed:', rollbackErr);
316
+ }
317
+ }
318
+ throw err;
319
+ }
320
+ }
321
+ /**
322
+ * Check if we have permission to install
323
+ */
324
+ canInstall() {
325
+ const installDir = path.dirname(this.installPath);
326
+ // Check if directory exists and is writable
327
+ try {
328
+ if (!fs.existsSync(installDir)) {
329
+ // Check if we can create it
330
+ const parentDir = path.dirname(installDir);
331
+ fs.accessSync(parentDir, fs.constants.W_OK);
332
+ }
333
+ else {
334
+ fs.accessSync(installDir, fs.constants.W_OK);
335
+ }
336
+ // If binary exists, check if we can write to it
337
+ if (fs.existsSync(this.installPath)) {
338
+ fs.accessSync(this.installPath, fs.constants.W_OK);
339
+ }
340
+ return { canInstall: true };
341
+ }
342
+ catch {
343
+ return {
344
+ canInstall: false,
345
+ reason: `No write permission to ${this.installPath}. Run with sudo or change install path.`,
346
+ };
347
+ }
348
+ }
349
+ /**
350
+ * Get the install path
351
+ */
352
+ getInstallPath() {
353
+ return this.installPath;
354
+ }
355
+ }
356
+ // Factory function
357
+ export function createUpdateInstaller(installPath, onProgress) {
358
+ return new UpdateInstaller(installPath, onProgress);
359
+ }
360
+ //# sourceMappingURL=update-installer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"update-installer.js","sourceRoot":"","sources":["../../src/services/update-installer.ts"],"names":[],"mappings":"AAAA,qDAAqD;AAErD;;;;;GAKG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAAE,MAAM,yBAAyB,CAAC;AAE/D,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAEtD,MAAM,SAAS,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC;AAElC,MAAM,OAAO,eAAe;IAClB,WAAW,CAAS;IACpB,UAAU,CAAoB;IAEtC,YAAY,WAAoB,EAAE,UAA6B;QAC7D,IAAI,CAAC,WAAW,GAAG,WAAW,IAAI,cAAc,EAAE,CAAC;QACnD,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED;;OAEG;IACK,MAAM,CAAC,QAAwB;QACrC,IAAI,IAAI,CAAC,UAAU,EAAE,CAAC;YACpB,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;QAC5B,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,QAAQ,CACpB,GAAW,EACX,QAAgB,EAChB,UAAsC;QAEtC,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,MAAM,IAAI,GAAG,EAAE,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAE5C,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,EAAE,kBAAkB,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE;gBACnD,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBACrD,kBAAkB;oBAClB,MAAM,WAAW,GAAG,GAAG,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACzC,IAAI,WAAW,EAAE,CAAC;wBAChB,IAAI,CAAC,KAAK,EAAE,CAAC;wBACb,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;wBACxB,IAAI,CAAC,QAAQ,CAAC,WAAW,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;wBAC7E,OAAO;oBACT,CAAC;gBACH,CAAC;gBAED,IAAI,GAAG,CAAC,UAAU,KAAK,GAAG,EAAE,CAAC;oBAC3B,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACxB,MAAM,CAAC,IAAI,KAAK,CAAC,yBAAyB,GAAG,CAAC,UAAU,EAAE,CAAC,CAAC,CAAC;oBAC7D,OAAO;gBACT,CAAC;gBAED,MAAM,SAAS,GAAG,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,gBAAgB,CAAC,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;gBACrE,IAAI,cAAc,GAAG,CAAC,CAAC;gBAEvB,GAAG,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;oBAC/B,cAAc,IAAI,KAAK,CAAC,MAAM,CAAC;oBAC/B,IAAI,SAAS,GAAG,CAAC,IAAI,UAAU,EAAE,CAAC;wBAChC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,cAAc,GAAG,SAAS,CAAC,GAAG,GAAG,CAAC,CAAC;wBAC/D,UAAU,CAAC,OAAO,CAAC,CAAC;oBACtB,CAAC;gBACH,CAAC,CAAC,CAAC;gBAEH,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;gBAEf,IAAI,CAAC,EAAE,CAAC,QAAQ,EAAE,GAAG,EAAE;oBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,OAAO,EAAE,CAAC;gBACZ,CAAC,CAAC,CAAC;gBAEH,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACvB,IAAI,CAAC,KAAK,EAAE,CAAC;oBACb,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;oBACxB,MAAM,CAAC,GAAG,CAAC,CAAC;gBACd,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;gBACrB,IAAI,CAAC,KAAK,EAAE,CAAC;gBACb,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;oBAC5B,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBAC1B,CAAC;gBACD,MAAM,CAAC,GAAG,CAAC,CAAC;YACd,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,cAAc,CAAC,WAAmB,EAAE,UAAkB;QAClE,MAAM,SAAS,CAAC,aAAa,WAAW,SAAS,UAAU,GAAG,CAAC,CAAC;IAClE,CAAC;IAED;;OAEG;IACK,UAAU,CAAC,UAAkB;QACnC,yBAAyB;QACzB,MAAM,UAAU,GAAG;YACjB,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,SAAS,CAAC;YAChC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,SAAS,CAAC;YACvC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,aAAa,CAAC;SAC5C,CAAC;QAEF,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;YACnC,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,OAAO,SAAS,CAAC;YACnB,CAAC;QACH,CAAC;QAED,qBAAqB;QACrB,MAAM,KAAK,GAAG,EAAE,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QACzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC;YAC7C,MAAM,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;YACnC,IAAI,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC;gBACvB,MAAM,KAAK,GAAG,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;gBACxC,IAAI,KAAK;oBAAE,OAAO,KAAK,CAAC;YAC1B,CAAC;iBAAM,IAAI,IAAI,KAAK,SAAS,IAAI,IAAI,KAAK,aAAa,EAAE,CAAC;gBACxD,OAAO,QAAQ,CAAC;YAClB,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,QAAsB,EAAE,OAAe;QACnD,MAAM,MAAM,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,iBAAiB,CAAC,CAAC,CAAC;QACzE,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,OAAO,SAAS,CAAC,CAAC;QACvE,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;QAElD,IAAI,CAAC;YACH,cAAc;YACd,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,aAAa;gBACpB,QAAQ,EAAE,CAAC;gBACX,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;YAEH,MAAM,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,GAAG,EAAE,WAAW,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC1D,IAAI,CAAC,MAAM,CAAC;oBACV,KAAK,EAAE,aAAa;oBACpB,QAAQ;oBACR,OAAO,EAAE,gBAAgB,QAAQ,GAAG;iBACrC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;YAEH,qBAAqB;YACrB,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,uBAAuB;aACjC,CAAC,CAAC;YAEH,MAAM,QAAQ,GAAG,oBAAoB,EAAE,CAAC;YAExC,IAAI,CAAC,QAAQ,CAAC,cAAc,CAAC,WAAW,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;gBAC3D,MAAM,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC;YAC1E,CAAC;YAED,sBAAsB;YACtB,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,WAAW;gBAClB,OAAO,EAAE,4BAA4B;aACtC,CAAC,CAAC;YAEH,MAAM,cAAc,GAAG,MAAM,QAAQ,CAAC,eAAe,CAAC,WAAW,EAAE,QAAQ,CAAC,SAAS,CAAC,CAAC;YACvF,IAAI,CAAC,cAAc,EAAE,CAAC;gBACpB,MAAM,IAAI,KAAK,CAAC,wDAAwD,CAAC,CAAC;YAC5E,CAAC;YAED,aAAa;YACb,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;YAEH,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,cAAc,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;YAEnD,iBAAiB;YACjB,MAAM,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAClD,IAAI,CAAC,aAAa,EAAE,CAAC;gBACnB,MAAM,IAAI,KAAK,CAAC,4CAA4C,CAAC,CAAC;YAChE,CAAC;YAED,wEAAwE;YACxE,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,YAAY;gBACnB,OAAO,EAAE,sBAAsB;aAChC,CAAC,CAAC;YAEH,mEAAmE;YACnE,MAAM,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;YAChE,IAAI,UAAU,EAAE,CAAC;gBACf,yCAAyC;gBACzC,MAAM,IAAI,CAAC,gBAAgB,CAAC,UAAU,CAAC,CAAC;YAC1C,CAAC;iBAAM,CAAC;gBACN,wCAAwC;gBACxC,MAAM,IAAI,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;YAC1C,CAAC;YAED,cAAc;YACd,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,UAAU;gBACjB,OAAO,EAAE,mCAAmC,OAAO,EAAE;aACtD,CAAC,CAAC;QACL,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,MAAM,CAAC;gBACV,KAAK,EAAE,OAAO;gBACd,OAAO,EAAE,eAAe;gBACxB,KAAK,EAAE,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC;aACxD,CAAC,CAAC;YACH,MAAM,GAAG,CAAC;QACZ,CAAC;gBAAS,CAAC;YACT,yBAAyB;YACzB,IAAI,CAAC;gBACH,EAAE,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACtD,CAAC;YAAC,MAAM,CAAC;gBACP,wBAAwB;YAC1B,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,gBAAgB,CAAC,UAAkB;QAC/C,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAClD,MAAM,SAAS,GAAG,GAAG,UAAU,SAAS,CAAC;QAEzC,iCAAiC;QACjC,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QAC3C,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;YAC9B,EAAE,CAAC,SAAS,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,CAAC;QAED,2CAA2C;QAC3C,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9C,IAAI,WAAW,EAAE,CAAC;YAChB,8BAA8B;YAC9B,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC7B,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;YACD,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,SAAS,CAAC,CAAC;QACvC,CAAC;QAED,IAAI,CAAC;YACH,+CAA+C;YAC/C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;YAC9C,MAAM,IAAI,CAAC,aAAa,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;YAEjD,iCAAiC;YACjC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,CAAC,CAAC;YACxC,CAAC;YAED,2BAA2B;YAC3B,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sBAAsB;YACtB,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC5C,IAAI,CAAC;oBACH,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;wBAC9B,EAAE,CAAC,MAAM,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;oBAC1D,CAAC;oBACD,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;gBACvC,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,GAAW,EAAE,IAAY;QACnD,MAAM,OAAO,GAAG,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,CAAC;QAE7D,KAAK,MAAM,KAAK,IAAI,OAAO,EAAE,CAAC;YAC5B,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;YAE7C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;gBACxB,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;gBAC5C,MAAM,IAAI,CAAC,aAAa,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,YAAY,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC;YACrC,CAAC;QACH,CAAC;IACH,CAAC;IAED;;OAEG;IACK,KAAK,CAAC,aAAa,CAAC,aAAqB;QAC/C,MAAM,UAAU,GAAG,GAAG,IAAI,CAAC,WAAW,SAAS,CAAC;QAChD,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElD,kCAAkC;QAClC,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/B,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAChD,CAAC;QAED,qCAAqC;QACrC,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpD,IAAI,WAAW,EAAE,CAAC;YAChB,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;QAChD,CAAC;QAED,IAAI,CAAC;YACH,uDAAuD;YACvD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,WAAW,MAAM,CAAC;YAC3C,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACzC,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;YAE9B,gBAAgB;YAChB,EAAE,CAAC,UAAU,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;YAE1C,2BAA2B;YAC3B,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,sBAAsB;YACtB,IAAI,WAAW,IAAI,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC7C,IAAI,CAAC;oBACH,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC;oBAC9C,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;gBAC5B,CAAC;gBAAC,OAAO,WAAW,EAAE,CAAC;oBACrB,OAAO,CAAC,KAAK,CAAC,kBAAkB,EAAE,WAAW,CAAC,CAAC;gBACjD,CAAC;YACH,CAAC;YACD,MAAM,GAAG,CAAC;QACZ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,UAAU;QACR,MAAM,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QAElD,4CAA4C;QAC5C,IAAI,CAAC;YACH,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;gBAC/B,4BAA4B;gBAC5B,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;gBAC3C,EAAE,CAAC,UAAU,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC9C,CAAC;iBAAM,CAAC;gBACN,EAAE,CAAC,UAAU,CAAC,UAAU,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YAC/C,CAAC;YAED,gDAAgD;YAChD,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;gBACpC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;YACrD,CAAC;YAED,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACP,OAAO;gBACL,UAAU,EAAE,KAAK;gBACjB,MAAM,EAAE,0BAA0B,IAAI,CAAC,WAAW,yCAAyC;aAC5F,CAAC;QACJ,CAAC;IACH,CAAC;IAED;;OAEG;IACH,cAAc;QACZ,OAAO,IAAI,CAAC,WAAW,CAAC;IAC1B,CAAC;CACF;AAED,mBAAmB;AACnB,MAAM,UAAU,qBAAqB,CACnC,WAAoB,EACpB,UAA6B;IAE7B,OAAO,IAAI,eAAe,CAAC,WAAW,EAAE,UAAU,CAAC,CAAC;AACtD,CAAC"}