@shadowcoderr/context-graph 0.3.3 → 0.3.5
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/README.md +439 -88
- package/dist/analyzers/a11y-extractor.d.ts +19 -5
- package/dist/analyzers/a11y-extractor.d.ts.map +1 -1
- package/dist/analyzers/a11y-extractor.js +274 -104
- package/dist/analyzers/a11y-extractor.js.map +1 -1
- package/dist/analyzers/network-logger.d.ts +20 -2
- package/dist/analyzers/network-logger.d.ts.map +1 -1
- package/dist/analyzers/network-logger.js +122 -42
- package/dist/analyzers/network-logger.js.map +1 -1
- package/dist/analyzers/network-patterns.d.ts +73 -0
- package/dist/analyzers/network-patterns.d.ts.map +1 -0
- package/dist/analyzers/network-patterns.js +316 -0
- package/dist/analyzers/network-patterns.js.map +1 -0
- package/dist/analyzers/page-notifier.d.ts +40 -0
- package/dist/analyzers/page-notifier.d.ts.map +1 -0
- package/dist/analyzers/page-notifier.js +198 -0
- package/dist/analyzers/page-notifier.js.map +1 -0
- package/dist/analyzers/screenshot-capturer.d.ts +73 -0
- package/dist/analyzers/screenshot-capturer.d.ts.map +1 -0
- package/dist/analyzers/screenshot-capturer.js +190 -0
- package/dist/analyzers/screenshot-capturer.js.map +1 -0
- package/dist/cli/index.js +15 -6
- package/dist/cli/index.js.map +1 -1
- package/dist/config/defaults.d.ts.map +1 -1
- package/dist/config/defaults.js +3 -1
- package/dist/config/defaults.js.map +1 -1
- package/dist/config/schema.d.ts +8 -3
- package/dist/config/schema.d.ts.map +1 -1
- package/dist/config/schema.js +7 -2
- package/dist/config/schema.js.map +1 -1
- package/dist/core/browser-adapter.d.ts.map +1 -1
- package/dist/core/browser-adapter.js +0 -2
- package/dist/core/browser-adapter.js.map +1 -1
- package/dist/core/capture-engine.d.ts +30 -25
- package/dist/core/capture-engine.d.ts.map +1 -1
- package/dist/core/capture-engine.js +290 -276
- package/dist/core/capture-engine.js.map +1 -1
- package/dist/core/runtime.d.ts +1 -0
- package/dist/core/runtime.d.ts.map +1 -1
- package/dist/core/runtime.js +21 -0
- package/dist/core/runtime.js.map +1 -1
- package/dist/exporters/ai-context-bundler.d.ts +88 -0
- package/dist/exporters/ai-context-bundler.d.ts.map +1 -0
- package/dist/exporters/ai-context-bundler.js +380 -0
- package/dist/exporters/ai-context-bundler.js.map +1 -0
- package/dist/security/redactor.d.ts +16 -0
- package/dist/security/redactor.d.ts.map +1 -1
- package/dist/security/redactor.js +127 -57
- package/dist/security/redactor.js.map +1 -1
- package/dist/storage/engine.d.ts +24 -21
- package/dist/storage/engine.d.ts.map +1 -1
- package/dist/storage/engine.js +208 -175
- package/dist/storage/engine.js.map +1 -1
- package/dist/types/config.d.ts +4 -1
- package/dist/types/config.d.ts.map +1 -1
- package/dist/types/notifications.d.ts +37 -0
- package/dist/types/notifications.d.ts.map +1 -0
- package/dist/types/notifications.js +4 -0
- package/dist/types/notifications.js.map +1 -0
- package/package.json +71 -70
|
@@ -2,43 +2,95 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SecurityRedactor = void 0;
|
|
4
4
|
const patterns_1 = require("./patterns");
|
|
5
|
+
/**
|
|
6
|
+
* Sensitive URL query parameter names. Values for these parameters are
|
|
7
|
+
* replaced with [REDACTED] in all captured URLs so that tokens, API keys,
|
|
8
|
+
* and session identifiers never reach the filesystem.
|
|
9
|
+
*/
|
|
10
|
+
const SENSITIVE_QUERY_PARAMS = [
|
|
11
|
+
'token', 'access_token', 'refresh_token', 'id_token',
|
|
12
|
+
'api_key', 'apikey', 'api-key',
|
|
13
|
+
'auth', 'authorization',
|
|
14
|
+
'key', 'secret', 'password', 'pwd', 'pass',
|
|
15
|
+
'session', 'sessionid', 'session_id',
|
|
16
|
+
'sig', 'signature',
|
|
17
|
+
'code', // OAuth authorization code
|
|
18
|
+
'state', // OAuth state — may embed tokens
|
|
19
|
+
'client_secret',
|
|
20
|
+
'private_key',
|
|
21
|
+
'bearer',
|
|
22
|
+
];
|
|
5
23
|
class SecurityRedactor {
|
|
6
24
|
rules;
|
|
7
25
|
redactedHeaders;
|
|
8
|
-
sensitiveKeys = [
|
|
26
|
+
sensitiveKeys = [
|
|
27
|
+
'password', 'secret', 'token', 'apiKey', 'api_key',
|
|
28
|
+
'authorization', 'cookie', 'set-cookie', 'privateKey', 'private_key',
|
|
29
|
+
];
|
|
9
30
|
auditLog = [];
|
|
10
31
|
constructor(customRules = []) {
|
|
11
32
|
this.rules = [...patterns_1.BUILTIN_REDACTION_RULES, ...customRules];
|
|
12
33
|
this.redactedHeaders = patterns_1.REDACTED_HEADERS;
|
|
13
34
|
}
|
|
35
|
+
// ── URL sanitisation ────────────────────────────────────────────────────────
|
|
36
|
+
/**
|
|
37
|
+
* Sanitize a URL by replacing the values of sensitive query parameters with
|
|
38
|
+
* [REDACTED]. Returns the original URL string unchanged if parsing fails.
|
|
39
|
+
*
|
|
40
|
+
* Examples:
|
|
41
|
+
* https://api.example.com/users?api_key=sk_live_123 → …?api_key=[REDACTED]
|
|
42
|
+
* https://example.com/callback?code=abc&state=xyz → …?code=[REDACTED]&state=[REDACTED]
|
|
43
|
+
*/
|
|
44
|
+
sanitizeUrl(url) {
|
|
45
|
+
if (!url)
|
|
46
|
+
return url;
|
|
47
|
+
try {
|
|
48
|
+
const parsed = new URL(url);
|
|
49
|
+
let changed = false;
|
|
50
|
+
for (const param of SENSITIVE_QUERY_PARAMS) {
|
|
51
|
+
if (parsed.searchParams.has(param)) {
|
|
52
|
+
parsed.searchParams.set(param, '[REDACTED]');
|
|
53
|
+
changed = true;
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// Also redact any param whose name contains sensitive substrings
|
|
57
|
+
const extraSensitive = ['token', 'key', 'secret', 'password', 'auth'];
|
|
58
|
+
for (const [key] of Array.from(parsed.searchParams.entries())) {
|
|
59
|
+
const lower = key.toLowerCase();
|
|
60
|
+
if (extraSensitive.some(s => lower.includes(s))) {
|
|
61
|
+
parsed.searchParams.set(key, '[REDACTED]');
|
|
62
|
+
changed = true;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
return changed ? parsed.toString() : url;
|
|
66
|
+
}
|
|
67
|
+
catch {
|
|
68
|
+
return url;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
// ── Main redaction pipeline ─────────────────────────────────────────────────
|
|
14
72
|
async redact(data, context, url) {
|
|
15
73
|
const originalSize = JSON.stringify(data).length;
|
|
16
|
-
let redactedData = data; // Note: we mutate in place if it's an object
|
|
17
74
|
const redactions = [];
|
|
18
|
-
// Redact headers
|
|
19
|
-
if (
|
|
20
|
-
|
|
75
|
+
// 1. Redact sensitive headers (authorization, cookie, etc.)
|
|
76
|
+
if (data && typeof data === 'object' && data.headers) {
|
|
77
|
+
data.headers = this.redactHeaders(data.headers);
|
|
21
78
|
}
|
|
22
|
-
//
|
|
23
|
-
this.redactSensitiveKeys(
|
|
24
|
-
//
|
|
79
|
+
// 2. Key-based redaction (deep object traversal)
|
|
80
|
+
this.redactSensitiveKeys(data, redactions);
|
|
81
|
+
// 3. Pattern-based redaction (regex across all string values)
|
|
25
82
|
for (const rule of this.rules) {
|
|
26
|
-
const result = this.applyRule(
|
|
83
|
+
const result = this.applyRule(data, rule);
|
|
27
84
|
if (result.count > 0) {
|
|
28
|
-
redactions.push({
|
|
29
|
-
rule: rule.name,
|
|
30
|
-
count: result.count,
|
|
31
|
-
locations: result.locations,
|
|
32
|
-
});
|
|
85
|
+
redactions.push({ rule: rule.name, count: result.count, locations: result.locations });
|
|
33
86
|
}
|
|
34
87
|
}
|
|
35
|
-
const redactedSize = JSON.stringify(
|
|
36
|
-
// Log to audit
|
|
88
|
+
const redactedSize = JSON.stringify(data).length;
|
|
37
89
|
if (redactions.length > 0) {
|
|
38
90
|
this.auditLog.push({
|
|
39
91
|
timestamp: new Date().toISOString(),
|
|
40
92
|
context,
|
|
41
|
-
url: url
|
|
93
|
+
url: url ? this.sanitizeUrl(url) : '',
|
|
42
94
|
redactions: redactions.map(r => ({
|
|
43
95
|
rule: r.rule,
|
|
44
96
|
count: r.count,
|
|
@@ -46,36 +98,44 @@ class SecurityRedactor {
|
|
|
46
98
|
})),
|
|
47
99
|
});
|
|
48
100
|
}
|
|
49
|
-
return {
|
|
50
|
-
originalSize,
|
|
51
|
-
redactedSize,
|
|
52
|
-
redactions,
|
|
53
|
-
success: true,
|
|
54
|
-
};
|
|
101
|
+
return { originalSize, redactedSize, redactions, success: true };
|
|
55
102
|
}
|
|
103
|
+
/**
|
|
104
|
+
* Redact a plain string in-place and return the sanitised version.
|
|
105
|
+
* Useful for response bodies before they are stored.
|
|
106
|
+
*/
|
|
107
|
+
async redactString(value, _context, _url) {
|
|
108
|
+
if (!value)
|
|
109
|
+
return value;
|
|
110
|
+
let result = value;
|
|
111
|
+
for (const rule of this.rules) {
|
|
112
|
+
result = result.replace(rule.pattern, rule.replacement);
|
|
113
|
+
}
|
|
114
|
+
return result;
|
|
115
|
+
}
|
|
116
|
+
// ── Private helpers ─────────────────────────────────────────────────────────
|
|
56
117
|
redactSensitiveKeys(data, redactions) {
|
|
57
118
|
const traverse = (obj, path = '') => {
|
|
58
|
-
if (typeof obj
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
}
|
|
71
|
-
else {
|
|
72
|
-
redactions.push({ rule: ruleName, count: 1, locations: [currentPath] });
|
|
73
|
-
}
|
|
119
|
+
if (typeof obj !== 'object' || obj === null)
|
|
120
|
+
return;
|
|
121
|
+
for (const key in obj) {
|
|
122
|
+
const lowerKey = key.toLowerCase();
|
|
123
|
+
const currentPath = path ? `${path}.${key}` : key;
|
|
124
|
+
if (this.sensitiveKeys.some(sk => lowerKey.includes(sk))) {
|
|
125
|
+
const ruleName = `sensitive_key:${key}`;
|
|
126
|
+
obj[key] = '[REDACTED:SENSITIVE_KEY]';
|
|
127
|
+
const existing = redactions.find(r => r.rule === ruleName);
|
|
128
|
+
if (existing) {
|
|
129
|
+
existing.count++;
|
|
130
|
+
existing.locations.push(currentPath);
|
|
74
131
|
}
|
|
75
132
|
else {
|
|
76
|
-
|
|
133
|
+
redactions.push({ rule: ruleName, count: 1, locations: [currentPath] });
|
|
77
134
|
}
|
|
78
135
|
}
|
|
136
|
+
else {
|
|
137
|
+
traverse(obj[key], currentPath);
|
|
138
|
+
}
|
|
79
139
|
}
|
|
80
140
|
};
|
|
81
141
|
traverse(data);
|
|
@@ -83,9 +143,8 @@ class SecurityRedactor {
|
|
|
83
143
|
redactHeaders(headers) {
|
|
84
144
|
const redacted = { ...headers };
|
|
85
145
|
for (const header of this.redactedHeaders) {
|
|
86
|
-
const
|
|
87
|
-
|
|
88
|
-
const actualKey = Object.keys(redacted).find(k => k.toLowerCase() === lowerHeader);
|
|
146
|
+
const lower = header.toLowerCase();
|
|
147
|
+
const actualKey = Object.keys(redacted).find(k => k.toLowerCase() === lower);
|
|
89
148
|
if (actualKey) {
|
|
90
149
|
redacted[actualKey] = '[REDACTED]';
|
|
91
150
|
}
|
|
@@ -96,33 +155,44 @@ class SecurityRedactor {
|
|
|
96
155
|
let count = 0;
|
|
97
156
|
const locations = [];
|
|
98
157
|
const traverse = (obj, path = '') => {
|
|
99
|
-
if (typeof obj
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
158
|
+
if (typeof obj !== 'object' || obj === null)
|
|
159
|
+
return;
|
|
160
|
+
for (const key in obj) {
|
|
161
|
+
const val = obj[key];
|
|
162
|
+
if (typeof val === 'string') {
|
|
163
|
+
// Reset lastIndex for global regexes to avoid stateful match issues
|
|
164
|
+
rule.pattern.lastIndex = 0;
|
|
165
|
+
const matches = val.match(rule.pattern);
|
|
166
|
+
if (matches) {
|
|
167
|
+
count += matches.length;
|
|
168
|
+
locations.push(path ? `${path}.${key}` : key);
|
|
169
|
+
rule.pattern.lastIndex = 0;
|
|
170
|
+
obj[key] = val.replace(rule.pattern, rule.replacement);
|
|
171
|
+
// Reset again after replace
|
|
172
|
+
rule.pattern.lastIndex = 0;
|
|
113
173
|
}
|
|
114
174
|
}
|
|
175
|
+
else {
|
|
176
|
+
traverse(val, path ? `${path}.${key}` : key);
|
|
177
|
+
}
|
|
115
178
|
}
|
|
116
179
|
};
|
|
117
180
|
traverse(data);
|
|
118
181
|
return { count, locations };
|
|
119
182
|
}
|
|
183
|
+
// ── Audit log ───────────────────────────────────────────────────────────────
|
|
120
184
|
getAuditLog() {
|
|
121
185
|
return [...this.auditLog];
|
|
122
186
|
}
|
|
123
187
|
clearAuditLog() {
|
|
124
188
|
this.auditLog = [];
|
|
125
189
|
}
|
|
190
|
+
/** Returns the number of distinct redaction events across all contexts */
|
|
191
|
+
getTotalRedactionCount() {
|
|
192
|
+
return this.auditLog.reduce((sum, entry) => {
|
|
193
|
+
return sum + entry.redactions.reduce((s, r) => s + r.count, 0);
|
|
194
|
+
}, 0);
|
|
195
|
+
}
|
|
126
196
|
}
|
|
127
197
|
exports.SecurityRedactor = SecurityRedactor;
|
|
128
198
|
//# sourceMappingURL=redactor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../src/security/redactor.ts"],"names":[],"mappings":";;;AAGA,yCAAuE;AAavE,MAAa,gBAAgB;IACnB,KAAK,CAAkB;IACvB,eAAe,CAAW;IAC1B,aAAa,GAAa,
|
|
1
|
+
{"version":3,"file":"redactor.js","sourceRoot":"","sources":["../../src/security/redactor.ts"],"names":[],"mappings":"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"}
|
package/dist/storage/engine.d.ts
CHANGED
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { PageSnapshot } from '../types/capture';
|
|
1
|
+
import { PageSnapshot, PageMetadata } from '../types/capture';
|
|
2
2
|
import { ManifestEntry } from '../types/storage';
|
|
3
|
+
export interface UpdateManifestExtras {
|
|
4
|
+
networkRequests?: number;
|
|
5
|
+
screenshots?: number;
|
|
6
|
+
}
|
|
3
7
|
export declare class StorageEngine {
|
|
4
8
|
private outputDir;
|
|
5
9
|
private prettyJson;
|
|
@@ -7,39 +11,38 @@ export declare class StorageEngine {
|
|
|
7
11
|
private contentHashHistory;
|
|
8
12
|
private forceCapture;
|
|
9
13
|
constructor(outputDir: string, prettyJson?: boolean, forceCapture?: boolean);
|
|
10
|
-
/**
|
|
11
|
-
* Set force capture mode - always write artifacts even if content hash unchanged
|
|
12
|
-
*/
|
|
13
14
|
setForceCapture(force: boolean): void;
|
|
14
|
-
/**
|
|
15
|
-
* Check if content has changed since last capture
|
|
16
|
-
*/
|
|
17
15
|
hasContentChanged(pageName: string, contentHash: string): boolean;
|
|
18
|
-
/**
|
|
19
|
-
* Record content hash for a page
|
|
20
|
-
*/
|
|
21
16
|
recordContentHash(pageName: string, contentHash: string): void;
|
|
22
17
|
initialize(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Resolve the on-disk directory for a given page's metadata.
|
|
20
|
+
* Mirrors the same logic used inside savePageSnapshot so callers can
|
|
21
|
+
* compute the directory without needing to save first.
|
|
22
|
+
*/
|
|
23
|
+
resolvePageDir(metadata: Pick<PageMetadata, 'domain' | 'pageName'>): string;
|
|
23
24
|
getUniqueScriptPath(url: string): Promise<string>;
|
|
24
25
|
mergeRecordedScript(url: string, recordedScriptPath: string): Promise<string>;
|
|
25
26
|
private mergePlaywrightSpec;
|
|
26
27
|
savePageSnapshot(snapshot: PageSnapshot): Promise<void>;
|
|
27
|
-
|
|
28
|
-
* Save the components registry and update manifest reference
|
|
29
|
-
*/
|
|
28
|
+
private saveFrames;
|
|
30
29
|
saveComponentsRegistry(registry: any, domainName: string): Promise<void>;
|
|
31
|
-
/**
|
|
32
|
-
* Update manifest with components registry reference
|
|
33
|
-
*/
|
|
34
30
|
updateManifestWithComponents(domainName: string, totalComponents: number): Promise<void>;
|
|
35
|
-
updateGlobalManifest(entry: ManifestEntry): Promise<void>;
|
|
31
|
+
updateGlobalManifest(entry: ManifestEntry, extras?: UpdateManifestExtras): Promise<void>;
|
|
32
|
+
saveUserInteractions(url: string, interactions: any[]): Promise<void>;
|
|
33
|
+
private extractDomainName;
|
|
36
34
|
private writeJson;
|
|
37
35
|
/**
|
|
38
|
-
*
|
|
39
|
-
*
|
|
40
|
-
|
|
36
|
+
* Recursively walk a directory and sum all file sizes in bytes.
|
|
37
|
+
* Returns 0 if the directory does not exist.
|
|
38
|
+
*/
|
|
39
|
+
private computeDirectorySizeBytes;
|
|
40
|
+
private formatBytes;
|
|
41
|
+
/**
|
|
42
|
+
* Beautify HTML by adding proper indentation and line breaks.
|
|
43
|
+
* Self-closing / void elements are handled correctly so the indent
|
|
44
|
+
* level is never corrupted by unclosed tags.
|
|
41
45
|
*/
|
|
42
|
-
saveUserInteractions(url: string, interactions: any[]): Promise<void>;
|
|
43
46
|
private beautifyHTML;
|
|
44
47
|
}
|
|
45
48
|
//# sourceMappingURL=engine.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/storage/engine.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"engine.d.ts","sourceRoot":"","sources":["../../src/storage/engine.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AAC9D,OAAO,EAAkB,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAGjE,MAAM,WAAW,oBAAoB;IACnC,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,UAAU,CAAU;IAC5B,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,YAAY,CAAkB;gBAE1B,SAAS,EAAE,MAAM,EAAE,UAAU,GAAE,OAAc,EAAE,YAAY,GAAE,OAAe;IASxF,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,IAAI;IAMrC,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO;IAMjE,iBAAiB,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,IAAI;IASxD,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAOjC;;;;OAIG;IACH,cAAc,CAAC,QAAQ,EAAE,IAAI,CAAC,YAAY,EAAE,QAAQ,GAAG,UAAU,CAAC,GAAG,MAAM;IAQrE,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAkBjD,mBAAmB,CAAC,GAAG,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IA4BnF,OAAO,CAAC,mBAAmB;IAkErB,gBAAgB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC;YAkG/C,UAAU;IAgClB,sBAAsB,CAAC,QAAQ,EAAE,GAAG,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAOxE,4BAA4B,CAAC,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAiBxF,oBAAoB,CACxB,KAAK,EAAE,aAAa,EACpB,MAAM,GAAE,oBAAyB,GAChC,OAAO,CAAC,IAAI,CAAC;IA+DV,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA6B3E,OAAO,CAAC,iBAAiB;YAOX,SAAS;IAOvB;;;OAGG;YACW,yBAAyB;IAuBvC,OAAO,CAAC,WAAW;IAOnB;;;;OAIG;IACH,OAAO,CAAC,YAAY;CA6DrB"}
|