@pan-sec/notebooklm-mcp 1.4.0 → 1.6.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 (123) hide show
  1. package/README.md +61 -7
  2. package/SECURITY.md +40 -6
  3. package/dist/auth/mcp-auth.d.ts.map +1 -1
  4. package/dist/auth/mcp-auth.js +3 -6
  5. package/dist/auth/mcp-auth.js.map +1 -1
  6. package/dist/compliance/alert-manager.d.ts +120 -0
  7. package/dist/compliance/alert-manager.d.ts.map +1 -0
  8. package/dist/compliance/alert-manager.js +420 -0
  9. package/dist/compliance/alert-manager.js.map +1 -0
  10. package/dist/compliance/breach-detection.d.ts +134 -0
  11. package/dist/compliance/breach-detection.d.ts.map +1 -0
  12. package/dist/compliance/breach-detection.js +456 -0
  13. package/dist/compliance/breach-detection.js.map +1 -0
  14. package/dist/compliance/change-log.d.ts +113 -0
  15. package/dist/compliance/change-log.d.ts.map +1 -0
  16. package/dist/compliance/change-log.js +275 -0
  17. package/dist/compliance/change-log.js.map +1 -0
  18. package/dist/compliance/compliance-logger.d.ts +136 -0
  19. package/dist/compliance/compliance-logger.d.ts.map +1 -0
  20. package/dist/compliance/compliance-logger.js +425 -0
  21. package/dist/compliance/compliance-logger.js.map +1 -0
  22. package/dist/compliance/compliance-tools.d.ts +18 -0
  23. package/dist/compliance/compliance-tools.d.ts.map +1 -0
  24. package/dist/compliance/compliance-tools.js +673 -0
  25. package/dist/compliance/compliance-tools.js.map +1 -0
  26. package/dist/compliance/consent-manager.d.ts +130 -0
  27. package/dist/compliance/consent-manager.d.ts.map +1 -0
  28. package/dist/compliance/consent-manager.js +386 -0
  29. package/dist/compliance/consent-manager.js.map +1 -0
  30. package/dist/compliance/dashboard.d.ts +243 -0
  31. package/dist/compliance/dashboard.d.ts.map +1 -0
  32. package/dist/compliance/dashboard.js +519 -0
  33. package/dist/compliance/dashboard.js.map +1 -0
  34. package/dist/compliance/data-classification.d.ts +117 -0
  35. package/dist/compliance/data-classification.d.ts.map +1 -0
  36. package/dist/compliance/data-classification.js +469 -0
  37. package/dist/compliance/data-classification.js.map +1 -0
  38. package/dist/compliance/data-erasure.d.ts +110 -0
  39. package/dist/compliance/data-erasure.d.ts.map +1 -0
  40. package/dist/compliance/data-erasure.js +501 -0
  41. package/dist/compliance/data-erasure.js.map +1 -0
  42. package/dist/compliance/data-export.d.ts +85 -0
  43. package/dist/compliance/data-export.d.ts.map +1 -0
  44. package/dist/compliance/data-export.js +394 -0
  45. package/dist/compliance/data-export.js.map +1 -0
  46. package/dist/compliance/data-inventory.d.ts +136 -0
  47. package/dist/compliance/data-inventory.d.ts.map +1 -0
  48. package/dist/compliance/data-inventory.js +335 -0
  49. package/dist/compliance/data-inventory.js.map +1 -0
  50. package/dist/compliance/dsar-handler.d.ts +123 -0
  51. package/dist/compliance/dsar-handler.d.ts.map +1 -0
  52. package/dist/compliance/dsar-handler.js +371 -0
  53. package/dist/compliance/dsar-handler.js.map +1 -0
  54. package/dist/compliance/evidence-collector.d.ts +187 -0
  55. package/dist/compliance/evidence-collector.d.ts.map +1 -0
  56. package/dist/compliance/evidence-collector.js +656 -0
  57. package/dist/compliance/evidence-collector.js.map +1 -0
  58. package/dist/compliance/health-monitor.d.ts +111 -0
  59. package/dist/compliance/health-monitor.d.ts.map +1 -0
  60. package/dist/compliance/health-monitor.js +509 -0
  61. package/dist/compliance/health-monitor.js.map +1 -0
  62. package/dist/compliance/incident-manager.d.ts +131 -0
  63. package/dist/compliance/incident-manager.d.ts.map +1 -0
  64. package/dist/compliance/incident-manager.js +418 -0
  65. package/dist/compliance/incident-manager.js.map +1 -0
  66. package/dist/compliance/index.d.ts +32 -0
  67. package/dist/compliance/index.d.ts.map +1 -0
  68. package/dist/compliance/index.js +35 -0
  69. package/dist/compliance/index.js.map +1 -0
  70. package/dist/compliance/policy-docs.d.ts +108 -0
  71. package/dist/compliance/policy-docs.d.ts.map +1 -0
  72. package/dist/compliance/policy-docs.js +464 -0
  73. package/dist/compliance/policy-docs.js.map +1 -0
  74. package/dist/compliance/privacy-notice-text.d.ts +58 -0
  75. package/dist/compliance/privacy-notice-text.d.ts.map +1 -0
  76. package/dist/compliance/privacy-notice-text.js +161 -0
  77. package/dist/compliance/privacy-notice-text.js.map +1 -0
  78. package/dist/compliance/privacy-notice.d.ts +128 -0
  79. package/dist/compliance/privacy-notice.d.ts.map +1 -0
  80. package/dist/compliance/privacy-notice.js +250 -0
  81. package/dist/compliance/privacy-notice.js.map +1 -0
  82. package/dist/compliance/report-generator.d.ts +168 -0
  83. package/dist/compliance/report-generator.d.ts.map +1 -0
  84. package/dist/compliance/report-generator.js +830 -0
  85. package/dist/compliance/report-generator.js.map +1 -0
  86. package/dist/compliance/retention-engine.d.ts +130 -0
  87. package/dist/compliance/retention-engine.d.ts.map +1 -0
  88. package/dist/compliance/retention-engine.js +510 -0
  89. package/dist/compliance/retention-engine.js.map +1 -0
  90. package/dist/compliance/siem-exporter.d.ts +150 -0
  91. package/dist/compliance/siem-exporter.d.ts.map +1 -0
  92. package/dist/compliance/siem-exporter.js +509 -0
  93. package/dist/compliance/siem-exporter.js.map +1 -0
  94. package/dist/compliance/types.d.ts +601 -0
  95. package/dist/compliance/types.d.ts.map +1 -0
  96. package/dist/compliance/types.js +22 -0
  97. package/dist/compliance/types.js.map +1 -0
  98. package/dist/config.d.ts +4 -0
  99. package/dist/config.d.ts.map +1 -1
  100. package/dist/config.js +8 -1
  101. package/dist/config.js.map +1 -1
  102. package/dist/library/notebook-library.d.ts.map +1 -1
  103. package/dist/library/notebook-library.js +2 -1
  104. package/dist/library/notebook-library.js.map +1 -1
  105. package/dist/session/shared-context-manager.d.ts.map +1 -1
  106. package/dist/session/shared-context-manager.js +2 -1
  107. package/dist/session/shared-context-manager.js.map +1 -1
  108. package/dist/utils/audit-logger.d.ts +21 -1
  109. package/dist/utils/audit-logger.d.ts.map +1 -1
  110. package/dist/utils/audit-logger.js +53 -4
  111. package/dist/utils/audit-logger.js.map +1 -1
  112. package/dist/utils/crypto.d.ts.map +1 -1
  113. package/dist/utils/crypto.js +8 -15
  114. package/dist/utils/crypto.js.map +1 -1
  115. package/dist/utils/file-permissions.d.ts +85 -0
  116. package/dist/utils/file-permissions.d.ts.map +1 -0
  117. package/dist/utils/file-permissions.js +180 -0
  118. package/dist/utils/file-permissions.js.map +1 -0
  119. package/dist/utils/settings-manager.d.ts.map +1 -1
  120. package/dist/utils/settings-manager.js +6 -11
  121. package/dist/utils/settings-manager.js.map +1 -1
  122. package/docs/COMPLIANCE-SPEC.md +1452 -0
  123. package/package.json +30 -4
@@ -0,0 +1,275 @@
1
+ /**
2
+ * Change Log
3
+ *
4
+ * Tracks all configuration changes for SOC2 compliance.
5
+ * Provides audit trail for system modifications.
6
+ *
7
+ * Added by Pantheon Security for enterprise compliance support.
8
+ */
9
+ import crypto from "crypto";
10
+ import path from "path";
11
+ import fs from "fs";
12
+ import { getConfig } from "../config.js";
13
+ import { mkdirSecure, appendFileSecure } from "../utils/file-permissions.js";
14
+ import { getComplianceLogger } from "./compliance-logger.js";
15
+ /**
16
+ * Generate a UUID v4
17
+ */
18
+ function generateUUID() {
19
+ return crypto.randomUUID();
20
+ }
21
+ /**
22
+ * Change Log class
23
+ */
24
+ export class ChangeLog {
25
+ static instance;
26
+ logDir;
27
+ currentLogFile = "";
28
+ constructor() {
29
+ const config = getConfig();
30
+ this.logDir = path.join(config.dataDir, "compliance", "changes");
31
+ mkdirSecure(this.logDir);
32
+ this.initializeLogFile();
33
+ }
34
+ /**
35
+ * Get singleton instance
36
+ */
37
+ static getInstance() {
38
+ if (!ChangeLog.instance) {
39
+ ChangeLog.instance = new ChangeLog();
40
+ }
41
+ return ChangeLog.instance;
42
+ }
43
+ /**
44
+ * Initialize log file for current month
45
+ */
46
+ initializeLogFile() {
47
+ const now = new Date();
48
+ const year = now.getFullYear();
49
+ const month = String(now.getMonth() + 1).padStart(2, "0");
50
+ this.currentLogFile = path.join(this.logDir, `changes-${year}-${month}.jsonl`);
51
+ }
52
+ /**
53
+ * Record a configuration change
54
+ */
55
+ async recordChange(component, setting, oldValue, newValue, options = {}) {
56
+ // Ensure log file is current
57
+ this.initializeLogFile();
58
+ const record = {
59
+ id: generateUUID(),
60
+ timestamp: new Date().toISOString(),
61
+ component,
62
+ setting,
63
+ old_value: this.sanitizeValue(oldValue),
64
+ new_value: this.sanitizeValue(newValue),
65
+ changed_by: options.changedBy || "system",
66
+ method: options.method || "api",
67
+ requires_approval: options.requiresApproval || false,
68
+ approved_by: options.approvedBy,
69
+ approved_at: options.approvedBy ? new Date().toISOString() : undefined,
70
+ impact: options.impact || "low",
71
+ affected_compliance: options.affectedCompliance || [],
72
+ };
73
+ // Write to log file
74
+ const line = JSON.stringify(record) + "\n";
75
+ appendFileSecure(this.currentLogFile, line);
76
+ // Also log to compliance logger
77
+ const logger = getComplianceLogger();
78
+ await logger.logPolicyChange(setting, oldValue, newValue, record.changed_by);
79
+ return record;
80
+ }
81
+ /**
82
+ * Sanitize value for logging (remove sensitive data)
83
+ */
84
+ sanitizeValue(value) {
85
+ if (value === null || value === undefined) {
86
+ return value;
87
+ }
88
+ if (typeof value === "string") {
89
+ // Check for sensitive patterns
90
+ if (/password|secret|token|key|credential|auth/i.test(value) ||
91
+ value.length > 100) {
92
+ return "[REDACTED]";
93
+ }
94
+ return value;
95
+ }
96
+ if (typeof value === "object") {
97
+ return "[object]";
98
+ }
99
+ return value;
100
+ }
101
+ /**
102
+ * Get changes by component
103
+ */
104
+ async getChangesByComponent(component, limit = 100) {
105
+ const changes = await this.getAllChanges(limit * 10);
106
+ return changes
107
+ .filter(c => c.component === component)
108
+ .slice(0, limit);
109
+ }
110
+ /**
111
+ * Get changes by setting
112
+ */
113
+ async getChangesBySetting(setting, limit = 100) {
114
+ const changes = await this.getAllChanges(limit * 10);
115
+ return changes
116
+ .filter(c => c.setting === setting)
117
+ .slice(0, limit);
118
+ }
119
+ /**
120
+ * Get changes within date range
121
+ */
122
+ async getChangesInRange(from, to, limit = 1000) {
123
+ const changes = await this.getAllChanges(limit * 2);
124
+ return changes
125
+ .filter(c => {
126
+ const date = new Date(c.timestamp);
127
+ return date >= from && date <= to;
128
+ })
129
+ .slice(0, limit);
130
+ }
131
+ /**
132
+ * Get all changes (most recent first)
133
+ */
134
+ async getAllChanges(limit = 100) {
135
+ const changes = [];
136
+ try {
137
+ if (!fs.existsSync(this.logDir)) {
138
+ return changes;
139
+ }
140
+ const files = fs.readdirSync(this.logDir)
141
+ .filter(f => f.startsWith("changes-") && f.endsWith(".jsonl"))
142
+ .sort()
143
+ .reverse();
144
+ for (const file of files) {
145
+ const filePath = path.join(this.logDir, file);
146
+ const content = fs.readFileSync(filePath, "utf-8");
147
+ const lines = content.trim().split("\n").filter(l => l);
148
+ for (const line of lines.reverse()) {
149
+ try {
150
+ const record = JSON.parse(line);
151
+ changes.push(record);
152
+ if (changes.length >= limit)
153
+ break;
154
+ }
155
+ catch {
156
+ // Skip malformed lines
157
+ }
158
+ }
159
+ if (changes.length >= limit)
160
+ break;
161
+ }
162
+ }
163
+ catch {
164
+ // Return what we have
165
+ }
166
+ return changes;
167
+ }
168
+ /**
169
+ * Get high-impact changes
170
+ */
171
+ async getHighImpactChanges(limit = 100) {
172
+ const changes = await this.getAllChanges(limit * 5);
173
+ return changes
174
+ .filter(c => c.impact === "high")
175
+ .slice(0, limit);
176
+ }
177
+ /**
178
+ * Get changes affecting compliance
179
+ */
180
+ async getComplianceAffectingChanges(regulation, limit = 100) {
181
+ const changes = await this.getAllChanges(limit * 5);
182
+ return changes
183
+ .filter(c => {
184
+ if (c.affected_compliance.length === 0)
185
+ return false;
186
+ if (regulation) {
187
+ return c.affected_compliance.includes(regulation);
188
+ }
189
+ return true;
190
+ })
191
+ .slice(0, limit);
192
+ }
193
+ /**
194
+ * Get change statistics
195
+ */
196
+ async getStatistics(from, to) {
197
+ const allChanges = await this.getAllChanges(10000);
198
+ let changes = allChanges;
199
+ if (from) {
200
+ changes = changes.filter(c => new Date(c.timestamp) >= from);
201
+ }
202
+ if (to) {
203
+ changes = changes.filter(c => new Date(c.timestamp) <= to);
204
+ }
205
+ const byComponent = {};
206
+ const byImpact = {};
207
+ const byMethod = {};
208
+ let requiringApproval = 0;
209
+ let complianceAffecting = 0;
210
+ for (const change of changes) {
211
+ byComponent[change.component] = (byComponent[change.component] || 0) + 1;
212
+ byImpact[change.impact] = (byImpact[change.impact] || 0) + 1;
213
+ byMethod[change.method] = (byMethod[change.method] || 0) + 1;
214
+ if (change.requires_approval)
215
+ requiringApproval++;
216
+ if (change.affected_compliance.length > 0)
217
+ complianceAffecting++;
218
+ }
219
+ return {
220
+ total_changes: changes.length,
221
+ by_component: byComponent,
222
+ by_impact: byImpact,
223
+ by_method: byMethod,
224
+ requiring_approval: requiringApproval,
225
+ compliance_affecting: complianceAffecting,
226
+ };
227
+ }
228
+ /**
229
+ * Export changes for audit
230
+ */
231
+ async exportForAudit(from, to) {
232
+ const changes = await this.getChangesInRange(from, to, 10000);
233
+ return {
234
+ period: {
235
+ from: from.toISOString(),
236
+ to: to.toISOString(),
237
+ },
238
+ total_changes: changes.length,
239
+ high_impact_changes: changes.filter(c => c.impact === "high").length,
240
+ compliance_affecting_changes: changes.filter(c => c.affected_compliance.length > 0).length,
241
+ changes,
242
+ };
243
+ }
244
+ }
245
+ // ============================================
246
+ // SINGLETON ACCESS
247
+ // ============================================
248
+ /**
249
+ * Get the change log instance
250
+ */
251
+ export function getChangeLog() {
252
+ return ChangeLog.getInstance();
253
+ }
254
+ // ============================================
255
+ // CONVENIENCE EXPORTS
256
+ // ============================================
257
+ /**
258
+ * Record a configuration change
259
+ */
260
+ export async function recordConfigChange(component, setting, oldValue, newValue, options) {
261
+ return getChangeLog().recordChange(component, setting, oldValue, newValue, options);
262
+ }
263
+ /**
264
+ * Get recent configuration changes
265
+ */
266
+ export async function getRecentChanges(limit = 100) {
267
+ return getChangeLog().getAllChanges(limit);
268
+ }
269
+ /**
270
+ * Get change statistics
271
+ */
272
+ export async function getChangeStatistics(from, to) {
273
+ return getChangeLog().getStatistics(from, to);
274
+ }
275
+ //# sourceMappingURL=change-log.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"change-log.js","sourceRoot":"","sources":["../../src/compliance/change-log.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Compliance Logger
3
+ *
4
+ * Structured logging for compliance events, separate from operational audit logs.
5
+ * Implements hash-chaining for tamper detection and supports 7-year retention (CSSF).
6
+ *
7
+ * Added by Pantheon Security for enterprise compliance support.
8
+ */
9
+ import type { ComplianceEvent, ComplianceEventCategory, ComplianceActor, ComplianceResource, LegalBasis, DataCategory } from "./types.js";
10
+ /**
11
+ * Compliance Logger class
12
+ */
13
+ export declare class ComplianceLogger {
14
+ private static instance;
15
+ private complianceDir;
16
+ private enabled;
17
+ private retentionYears;
18
+ private lastHash;
19
+ private constructor();
20
+ /**
21
+ * Get singleton instance
22
+ */
23
+ static getInstance(): ComplianceLogger;
24
+ /**
25
+ * Ensure compliance directory exists
26
+ */
27
+ private ensureComplianceDir;
28
+ /**
29
+ * Get the current log file path (monthly rotation)
30
+ */
31
+ private getLogFilePath;
32
+ /**
33
+ * Load the last hash from the current log file
34
+ */
35
+ private loadLastHash;
36
+ /**
37
+ * Create a compliance event
38
+ */
39
+ private createEvent;
40
+ /**
41
+ * Write event to log file
42
+ */
43
+ private writeEvent;
44
+ /**
45
+ * Log a compliance event
46
+ */
47
+ log(category: ComplianceEventCategory, eventType: string, actor: Partial<ComplianceActor>, outcome: "success" | "failure" | "pending", options?: {
48
+ resource?: ComplianceResource;
49
+ details?: Record<string, unknown>;
50
+ legalBasis?: LegalBasis;
51
+ dataCategories?: DataCategory[];
52
+ retentionDays?: number;
53
+ failureReason?: string;
54
+ }): Promise<ComplianceEvent>;
55
+ /**
56
+ * Log consent event
57
+ */
58
+ logConsent(action: "granted" | "revoked" | "updated", actor: Partial<ComplianceActor>, purposes: string[], success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
59
+ /**
60
+ * Log data access event
61
+ */
62
+ logDataAccess(action: "view" | "export" | "delete" | "request", actor: Partial<ComplianceActor>, dataType: string, success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
63
+ /**
64
+ * Log data export event (GDPR Article 20)
65
+ */
66
+ logDataExport(actor: Partial<ComplianceActor>, dataTypes: string[], success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
67
+ /**
68
+ * Log data deletion event (GDPR Article 17)
69
+ */
70
+ logDataDeletion(actor: Partial<ComplianceActor>, dataType: string, itemCount: number, success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
71
+ /**
72
+ * Log security incident
73
+ */
74
+ logSecurityIncident(incidentType: string, severity: "low" | "medium" | "high" | "critical", details: Record<string, unknown>): Promise<ComplianceEvent>;
75
+ /**
76
+ * Log policy change
77
+ */
78
+ logPolicyChange(setting: string, oldValue: unknown, newValue: unknown, changedBy: "user" | "system" | "admin"): Promise<ComplianceEvent>;
79
+ /**
80
+ * Log access control event
81
+ */
82
+ logAccessControl(action: "login" | "logout" | "auth_failed" | "locked_out", actor: Partial<ComplianceActor>, success: boolean, details?: Record<string, unknown>): Promise<ComplianceEvent>;
83
+ /**
84
+ * Log retention event
85
+ */
86
+ logRetention(action: "cleanup" | "archive" | "delete", dataType: string, itemCount: number, details?: Record<string, unknown>): Promise<ComplianceEvent>;
87
+ /**
88
+ * Log breach notification
89
+ */
90
+ logBreach(breachType: string, severity: "low" | "medium" | "high" | "critical", notificationSent: boolean, details: Record<string, unknown>): Promise<ComplianceEvent>;
91
+ /**
92
+ * Get events by category
93
+ */
94
+ getEvents(category?: ComplianceEventCategory, from?: Date, to?: Date, limit?: number): Promise<ComplianceEvent[]>;
95
+ /**
96
+ * Get log files sorted by date (newest first)
97
+ */
98
+ private getLogFiles;
99
+ /**
100
+ * Verify hash chain integrity
101
+ */
102
+ verifyIntegrity(): Promise<{
103
+ valid: boolean;
104
+ lastValidEvent?: string;
105
+ firstInvalidEvent?: string;
106
+ totalEvents: number;
107
+ validEvents: number;
108
+ }>;
109
+ /**
110
+ * Get compliance log statistics
111
+ */
112
+ getStats(): Promise<{
113
+ enabled: boolean;
114
+ retentionYears: number;
115
+ complianceDir: string;
116
+ logFileCount: number;
117
+ totalEvents: number;
118
+ eventsByCategory: Record<ComplianceEventCategory, number>;
119
+ }>;
120
+ }
121
+ /**
122
+ * Get the compliance logger instance
123
+ */
124
+ export declare function getComplianceLogger(): ComplianceLogger;
125
+ /**
126
+ * Log a compliance event (convenience function)
127
+ */
128
+ export declare function logComplianceEvent(category: ComplianceEventCategory, eventType: string, actor: Partial<ComplianceActor>, outcome: "success" | "failure" | "pending", options?: {
129
+ resource?: ComplianceResource;
130
+ details?: Record<string, unknown>;
131
+ legalBasis?: LegalBasis;
132
+ dataCategories?: DataCategory[];
133
+ retentionDays?: number;
134
+ failureReason?: string;
135
+ }): Promise<ComplianceEvent>;
136
+ //# sourceMappingURL=compliance-logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compliance-logger.d.ts","sourceRoot":"","sources":["../../src/compliance/compliance-logger.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EACV,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,kBAAkB,EAClB,UAAU,EACV,YAAY,EACb,MAAM,YAAY,CAAC;AA2CpB;;GAEG;AACH,qBAAa,gBAAgB;IAC3B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAmB;IAC1C,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,OAAO,CAAU;IACzB,OAAO,CAAC,cAAc,CAAS;IAC/B,OAAO,CAAC,QAAQ,CAA0B;IAE1C,OAAO;IAsBP;;OAEG;WACW,WAAW,IAAI,gBAAgB;IAO7C;;OAEG;IACH,OAAO,CAAC,mBAAmB;IAI3B;;OAEG;IACH,OAAO,CAAC,cAAc;IAOtB;;OAEG;IACH,OAAO,CAAC,YAAY;IAkBpB;;OAEG;IACH,OAAO,CAAC,WAAW;IAgDnB;;OAEG;YACW,UAAU;IAQxB;;OAEG;IACU,GAAG,CACd,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAC1C,OAAO,GAAE;QACP,QAAQ,CAAC,EAAE,kBAAkB,CAAC;QAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAClC,UAAU,CAAC,EAAE,UAAU,CAAC;QACxB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;QAChC,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,aAAa,CAAC,EAAE,MAAM,CAAC;KACnB,GACL,OAAO,CAAC,eAAe,CAAC;IAU3B;;OAEG;IACU,UAAU,CACrB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EACzC,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,aAAa,CACxB,MAAM,EAAE,MAAM,GAAG,QAAQ,GAAG,QAAQ,GAAG,SAAS,EAChD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,aAAa,CACxB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,SAAS,EAAE,MAAM,EAAE,EACnB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,eAAe,CAC1B,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,mBAAmB,CAC9B,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAChD,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,CAAC;IAY3B;;OAEG;IACU,eAAe,CAC1B,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,OAAO,EACjB,QAAQ,EAAE,OAAO,EACjB,SAAS,EAAE,MAAM,GAAG,QAAQ,GAAG,OAAO,GACrC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,gBAAgB,CAC3B,MAAM,EAAE,OAAO,GAAG,QAAQ,GAAG,aAAa,GAAG,YAAY,EACzD,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,OAAO,EAAE,OAAO,EAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAU3B;;OAEG;IACU,YAAY,CACvB,MAAM,EAAE,SAAS,GAAG,SAAS,GAAG,QAAQ,EACxC,QAAQ,EAAE,MAAM,EAChB,SAAS,EAAE,MAAM,EACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAChC,OAAO,CAAC,eAAe,CAAC;IAa3B;;OAEG;IACU,SAAS,CACpB,UAAU,EAAE,MAAM,EAClB,QAAQ,EAAE,KAAK,GAAG,QAAQ,GAAG,MAAM,GAAG,UAAU,EAChD,gBAAgB,EAAE,OAAO,EACzB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAC/B,OAAO,CAAC,eAAe,CAAC;IAoB3B;;OAEG;IACU,SAAS,CACpB,QAAQ,CAAC,EAAE,uBAAuB,EAClC,IAAI,CAAC,EAAE,IAAI,EACX,EAAE,CAAC,EAAE,IAAI,EACT,KAAK,GAAE,MAAY,GAClB,OAAO,CAAC,eAAe,EAAE,CAAC;IAoC7B;;OAEG;IACH,OAAO,CAAC,WAAW;IAYnB;;OAEG;IACU,eAAe,IAAI,OAAO,CAAC;QACtC,KAAK,EAAE,OAAO,CAAC;QACf,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,WAAW,EAAE,MAAM,CAAC;QACpB,WAAW,EAAE,MAAM,CAAC;KACrB,CAAC;IA8DF;;OAEG;IACU,QAAQ,IAAI,OAAO,CAAC;QAC/B,OAAO,EAAE,OAAO,CAAC;QACjB,cAAc,EAAE,MAAM,CAAC;QACvB,aAAa,EAAE,MAAM,CAAC;QACtB,YAAY,EAAE,MAAM,CAAC;QACrB,WAAW,EAAE,MAAM,CAAC;QACpB,gBAAgB,EAAE,MAAM,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;KAC3D,CAAC;CAoDH;AAMD;;GAEG;AACH,wBAAgB,mBAAmB,IAAI,gBAAgB,CAEtD;AAMD;;GAEG;AACH,wBAAsB,kBAAkB,CACtC,QAAQ,EAAE,uBAAuB,EACjC,SAAS,EAAE,MAAM,EACjB,KAAK,EAAE,OAAO,CAAC,eAAe,CAAC,EAC/B,OAAO,EAAE,SAAS,GAAG,SAAS,GAAG,SAAS,EAC1C,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,kBAAkB,CAAC;IAC9B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAClC,UAAU,CAAC,EAAE,UAAU,CAAC;IACxB,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC;CACxB,GACA,OAAO,CAAC,eAAe,CAAC,CAE1B"}