@memberjunction/global 6.2.0-edge.5 → 6.2.0-edge.6
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/dist/KeyedSerialTaskQueue.d.ts +18 -1
- package/dist/KeyedSerialTaskQueue.d.ts.map +1 -1
- package/dist/KeyedSerialTaskQueue.js +24 -3
- package/dist/KeyedSerialTaskQueue.js.map +1 -1
- package/dist/SQLExpressionValidator.d.ts +34 -9
- package/dist/SQLExpressionValidator.d.ts.map +1 -1
- package/dist/SQLExpressionValidator.js +58 -17
- package/dist/SQLExpressionValidator.js.map +1 -1
- package/dist/SQLScreeningScanner.d.ts +28 -2
- package/dist/SQLScreeningScanner.d.ts.map +1 -1
- package/dist/SQLScreeningScanner.js +166 -23
- package/dist/SQLScreeningScanner.js.map +1 -1
- package/dist/__tests__/FieldSecurityEgressCompliance.test.d.ts +2 -0
- package/dist/__tests__/FieldSecurityEgressCompliance.test.d.ts.map +1 -0
- package/dist/__tests__/FieldSecurityEgressCompliance.test.js +228 -0
- package/dist/__tests__/FieldSecurityEgressCompliance.test.js.map +1 -0
- package/dist/__tests__/KeyedSerialTaskQueue.test.js +92 -0
- package/dist/__tests__/KeyedSerialTaskQueue.test.js.map +1 -1
- package/dist/__tests__/ProofOfPossession.test.d.ts +2 -0
- package/dist/__tests__/ProofOfPossession.test.d.ts.map +1 -0
- package/dist/__tests__/ProofOfPossession.test.js +123 -0
- package/dist/__tests__/ProofOfPossession.test.js.map +1 -0
- package/dist/__tests__/SQLExpressionValidator.dialect.test.d.ts +2 -0
- package/dist/__tests__/SQLExpressionValidator.dialect.test.d.ts.map +1 -0
- package/dist/__tests__/SQLExpressionValidator.dialect.test.js +183 -0
- package/dist/__tests__/SQLExpressionValidator.dialect.test.js.map +1 -0
- package/dist/__tests__/SQLScreeningScanner.tokens.test.d.ts +2 -0
- package/dist/__tests__/SQLScreeningScanner.tokens.test.d.ts.map +1 -0
- package/dist/__tests__/SQLScreeningScanner.tokens.test.js +82 -0
- package/dist/__tests__/SQLScreeningScanner.tokens.test.js.map +1 -0
- package/dist/__tests__/UUIDCompliance.test.js +1 -1
- package/dist/__tests__/UserScopedCacheKey.test.d.ts +2 -0
- package/dist/__tests__/UserScopedCacheKey.test.d.ts.map +1 -0
- package/dist/__tests__/UserScopedCacheKey.test.js +25 -0
- package/dist/__tests__/UserScopedCacheKey.test.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -1
- package/dist/util/ProofOfPossession.d.ts +68 -0
- package/dist/util/ProofOfPossession.d.ts.map +1 -0
- package/dist/util/ProofOfPossession.js +163 -0
- package/dist/util/ProofOfPossession.js.map +1 -0
- package/dist/util/UserScopedCacheKey.d.ts +42 -0
- package/dist/util/UserScopedCacheKey.d.ts.map +1 -0
- package/dist/util/UserScopedCacheKey.js +49 -0
- package/dist/util/UserScopedCacheKey.js.map +1 -0
- package/package.json +1 -1
|
@@ -20,6 +20,7 @@ const LEXICAL_RULES = {
|
|
|
20
20
|
sqlserver: {
|
|
21
21
|
BracketIdentifiers: true,
|
|
22
22
|
PostgresStrings: false,
|
|
23
|
+
UnicodeEscapeIdentifiers: false,
|
|
23
24
|
// Letters and digits of any script. Other non-ASCII characters are not part of a word: SQL
|
|
24
25
|
// Server reads a currency symbol such as ¥ as the start of a money literal, so in `¥1SELECT`
|
|
25
26
|
// the keyword is a separate token.
|
|
@@ -30,6 +31,7 @@ const LEXICAL_RULES = {
|
|
|
30
31
|
postgresql: {
|
|
31
32
|
BracketIdentifiers: false,
|
|
32
33
|
PostgresStrings: true,
|
|
34
|
+
UnicodeEscapeIdentifiers: true,
|
|
33
35
|
WordStart: /[A-Za-z_\u0080-]/,
|
|
34
36
|
WordPart: /[A-Za-z0-9_$\u0080-]/,
|
|
35
37
|
BareExponent: false,
|
|
@@ -47,6 +49,10 @@ const NON_ASCII = /[^\x00-\x7f]/;
|
|
|
47
49
|
const NUMBER = /0[xX][0-9A-Fa-f]*|(?:[0-9]+(?:\.[0-9]*)?|\.[0-9]+)(?:[eE][+-]?[0-9]+)?/y;
|
|
48
50
|
/** A PostgreSQL `$$` or `$tag$` delimiter at `lastIndex` (sticky). */
|
|
49
51
|
const DOLLAR_DELIMITER = /\$(?:[A-Za-z_\u0080-][A-Za-z0-9_\u0080-]*)?\$/y;
|
|
52
|
+
/** Characters PostgreSQL does not accept as a `UESCAPE` character. */
|
|
53
|
+
const INVALID_UESCAPE = /[0-9A-Fa-f+'"\s]/;
|
|
54
|
+
/** A `UESCAPE` keyword at `lastIndex` (sticky), any case, not followed by a word character. */
|
|
55
|
+
const UESCAPE_KEYWORD = /uescape(?![A-Za-z0-9_$\u0080-\uffff])/iy;
|
|
50
56
|
/** Line breaks other than `\n` and `\r\n`. Servers disagree on whether they end a `--` comment. */
|
|
51
57
|
const AMBIGUOUS_LINE_BREAKS = new Set(['\r', '\u000b', '\u000c', '\u0085', '
', '
']);
|
|
52
58
|
/**
|
|
@@ -56,8 +62,10 @@ const AMBIGUOUS_LINE_BREAKS = new Set(['\r', '\u000b', '\u000c', '\u0085', '
'
|
|
|
56
62
|
* Both dialects: `'…'` and `N'…'` strings, in which `''` is an escaped quote and a backslash is an
|
|
57
63
|
* ordinary character; `"…"` identifiers with `""` escapes; `--` comments to the end of the line; and
|
|
58
64
|
* nested block comments. SQL Server adds `[…]` identifiers with `]]` escapes. PostgreSQL adds `E'…'`
|
|
59
|
-
* strings, in which a backslash escapes the next character,
|
|
60
|
-
* `$tag$…$tag$`)
|
|
65
|
+
* strings, in which a backslash escapes the next character, dollar-quoted strings (`$$…$$`,
|
|
66
|
+
* `$tag$…$tag$`), and `U&"…"` identifiers, read as one identifier whose `\XXXX` and `\+XXXXXX`
|
|
67
|
+
* escapes (or those of the character a following `UESCAPE '<c>'` names) are decoded, so the name is
|
|
68
|
+
* the one PostgreSQL resolves; a `[` is code there.
|
|
61
69
|
*
|
|
62
70
|
* 🚨 Do not add backslash escapes to plain `'…'` strings. Neither server honors them (PostgreSQL is
|
|
63
71
|
* assumed to run with `standard_conforming_strings = on`, its default since 9.1), and a scanner that
|
|
@@ -69,6 +77,7 @@ const AMBIGUOUS_LINE_BREAKS = new Set(['\r', '\u000b', '\u000c', '\u0085', '
'
|
|
|
69
77
|
* - a `--` comment contains a line break other than `\n` or `\r\n`;
|
|
70
78
|
* - a PostgreSQL `E'…'` string is followed by another quoted segment, which PostgreSQL can join to
|
|
71
79
|
* it and read with backslash escapes;
|
|
80
|
+
* - a PostgreSQL `U&"…"` identifier has an escape or a `UESCAPE` clause PostgreSQL would reject;
|
|
72
81
|
* - on SQL Server, a number is followed by `e` and a word character (`1EXEC` splits two ways).
|
|
73
82
|
*
|
|
74
83
|
* @param sql The clause, expression or query to read
|
|
@@ -85,6 +94,7 @@ class SQLScreeningScanner {
|
|
|
85
94
|
this.spans = [];
|
|
86
95
|
this.code = [];
|
|
87
96
|
this.codeWithIdentifiers = [];
|
|
97
|
+
this.tokens = [];
|
|
88
98
|
this.commentCount = 0;
|
|
89
99
|
this.pos = 0;
|
|
90
100
|
/** Offset of the first token that is not whitespace or a comment, once one is reached. */
|
|
@@ -125,6 +135,9 @@ class SQLScreeningScanner {
|
|
|
125
135
|
if (delimiter !== null)
|
|
126
136
|
return this.readDollarString(delimiter);
|
|
127
137
|
}
|
|
138
|
+
if (this.rules.UnicodeEscapeIdentifiers && (c === 'U' || c === 'u') && next === '&' && this.sql[this.pos + 2] === '"') {
|
|
139
|
+
return this.readUnicodeEscapeIdentifier();
|
|
140
|
+
}
|
|
128
141
|
if (c === '"')
|
|
129
142
|
return this.readQuotedIdentifier('"');
|
|
130
143
|
if (this.rules.BracketIdentifiers && c === '[')
|
|
@@ -133,6 +146,8 @@ class SQLScreeningScanner {
|
|
|
133
146
|
return this.readNumber();
|
|
134
147
|
if (this.rules.WordStart.test(c))
|
|
135
148
|
return this.readWord();
|
|
149
|
+
if (!WHITESPACE.test(c))
|
|
150
|
+
this.pushToken('symbol', c, this.pos, this.pos + 1);
|
|
136
151
|
this.emitCode(this.pos + 1);
|
|
137
152
|
return null;
|
|
138
153
|
}
|
|
@@ -172,25 +187,67 @@ class SQLScreeningScanner {
|
|
|
172
187
|
this.emitSpan('identifier', end, name);
|
|
173
188
|
return null;
|
|
174
189
|
}
|
|
175
|
-
/**
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
190
|
+
/**
|
|
191
|
+
* Reads a PostgreSQL `U&"…"` identifier and any `UESCAPE '<c>'` clause after it as one
|
|
192
|
+
* identifier whose name is the decoded text.
|
|
193
|
+
*/
|
|
194
|
+
readUnicodeEscapeIdentifier() {
|
|
195
|
+
const end = this.findQuoteEnd(this.pos + 3, '"', false);
|
|
196
|
+
if (end === -1)
|
|
197
|
+
return 'a quoted identifier is not closed';
|
|
198
|
+
const clause = this.readUEscapeClause(end);
|
|
199
|
+
if (clause.Error !== null)
|
|
200
|
+
return clause.Error;
|
|
201
|
+
const body = this.sql.slice(this.pos + 3, end - 1).split('""').join('"');
|
|
202
|
+
const name = decodeUnicodeEscapes(body, clause.Escape);
|
|
203
|
+
if (name === null)
|
|
204
|
+
return 'a U&"…" identifier has an escape PostgreSQL would reject';
|
|
205
|
+
this.emitSpan('identifier', clause.End, name);
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* The escape character of a `U&"…"` identifier that ends at `from`: the one a following
|
|
210
|
+
* `UESCAPE '<c>'` clause names, or a backslash. `End` is the offset just past the clause, or
|
|
211
|
+
* `from` when there is none.
|
|
212
|
+
*/
|
|
213
|
+
readUEscapeClause(from) {
|
|
214
|
+
const keywordStart = this.triviaEnd(from);
|
|
215
|
+
UESCAPE_KEYWORD.lastIndex = keywordStart;
|
|
216
|
+
if (!UESCAPE_KEYWORD.test(this.sql))
|
|
217
|
+
return { Escape: '\\', End: from, Error: null };
|
|
218
|
+
const quote = this.triviaEnd(UESCAPE_KEYWORD.lastIndex);
|
|
219
|
+
const escape = this.sql[quote + 1] ?? '';
|
|
220
|
+
const valid = this.sql[quote] === "'" && this.sql[quote + 2] === "'" && this.sql[quote + 3] !== "'" && escape !== '' && !INVALID_UESCAPE.test(escape);
|
|
221
|
+
return valid
|
|
222
|
+
? { Escape: escape, End: quote + 3, Error: null }
|
|
223
|
+
: { Escape: '', End: from, Error: 'a UESCAPE clause does not name one valid escape character' };
|
|
224
|
+
}
|
|
225
|
+
/** Offset of the first character at or after `from` that is not whitespace or inside a comment. */
|
|
226
|
+
triviaEnd(from) {
|
|
227
|
+
let j = from;
|
|
228
|
+
while (j < this.sql.length) {
|
|
229
|
+
if (WHITESPACE.test(this.sql[j])) {
|
|
230
|
+
j++;
|
|
231
|
+
}
|
|
232
|
+
else if (this.sql[j] === '-' && this.sql[j + 1] === '-') {
|
|
233
|
+
j = this.lineEnd(j);
|
|
234
|
+
}
|
|
235
|
+
else if (this.sql[j] === '/' && this.sql[j + 1] === '*') {
|
|
236
|
+
const close = this.blockCommentEnd(j);
|
|
237
|
+
if (close === -1)
|
|
238
|
+
return j;
|
|
239
|
+
j = close;
|
|
240
|
+
}
|
|
241
|
+
else {
|
|
242
|
+
return j;
|
|
183
243
|
}
|
|
184
|
-
j++;
|
|
185
244
|
}
|
|
186
|
-
|
|
187
|
-
this.emitSpan('comment', j);
|
|
188
|
-
return null;
|
|
245
|
+
return j;
|
|
189
246
|
}
|
|
190
|
-
/**
|
|
191
|
-
|
|
247
|
+
/** Offset just past the nested block comment that opens at `from`, or -1 when it is not closed. */
|
|
248
|
+
blockCommentEnd(from) {
|
|
192
249
|
let depth = 0;
|
|
193
|
-
let j =
|
|
250
|
+
let j = from;
|
|
194
251
|
while (j < this.sql.length) {
|
|
195
252
|
if (this.sql[j] === '/' && this.sql[j + 1] === '*') {
|
|
196
253
|
depth++;
|
|
@@ -199,17 +256,38 @@ class SQLScreeningScanner {
|
|
|
199
256
|
else if (this.sql[j] === '*' && this.sql[j + 1] === '/') {
|
|
200
257
|
depth--;
|
|
201
258
|
j += 2;
|
|
202
|
-
if (depth === 0)
|
|
203
|
-
|
|
204
|
-
this.emitSpan('comment', j);
|
|
205
|
-
return null;
|
|
206
|
-
}
|
|
259
|
+
if (depth === 0)
|
|
260
|
+
return j;
|
|
207
261
|
}
|
|
208
262
|
else {
|
|
209
263
|
j++;
|
|
210
264
|
}
|
|
211
265
|
}
|
|
212
|
-
return
|
|
266
|
+
return -1;
|
|
267
|
+
}
|
|
268
|
+
/** Reads a `--` comment, which ends at the end of the line. */
|
|
269
|
+
readLineComment() {
|
|
270
|
+
let j = this.pos + 2;
|
|
271
|
+
while (j < this.sql.length && this.sql[j] !== '\n') {
|
|
272
|
+
if (this.sql[j] === '\r' && this.sql[j + 1] === '\n')
|
|
273
|
+
break;
|
|
274
|
+
if (AMBIGUOUS_LINE_BREAKS.has(this.sql[j])) {
|
|
275
|
+
return 'a -- comment contains a line break that database servers read differently';
|
|
276
|
+
}
|
|
277
|
+
j++;
|
|
278
|
+
}
|
|
279
|
+
this.commentCount++;
|
|
280
|
+
this.emitSpan('comment', j);
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
/** Reads a block comment. Block comments nest on both SQL Server and PostgreSQL. */
|
|
284
|
+
readBlockComment() {
|
|
285
|
+
const end = this.blockCommentEnd(this.pos);
|
|
286
|
+
if (end === -1)
|
|
287
|
+
return 'a block comment is not closed';
|
|
288
|
+
this.commentCount++;
|
|
289
|
+
this.emitSpan('comment', end);
|
|
290
|
+
return null;
|
|
213
291
|
}
|
|
214
292
|
/** Reads a number. A word written against it is a separate token, so a space is added between. */
|
|
215
293
|
readNumber() {
|
|
@@ -221,6 +299,7 @@ class SQLScreeningScanner {
|
|
|
221
299
|
if (this.rules.BareExponent && (following === 'e' || following === 'E') && this.rules.WordStart.test(afterThat)) {
|
|
222
300
|
return 'a number is followed by a word that starts with E, which the server can read as part of the number';
|
|
223
301
|
}
|
|
302
|
+
this.pushToken('number', this.sql.slice(this.pos, end), this.pos, end);
|
|
224
303
|
this.emitCode(end);
|
|
225
304
|
if (following !== '' && this.rules.WordStart.test(following))
|
|
226
305
|
this.emitBoundary();
|
|
@@ -234,6 +313,7 @@ class SQLScreeningScanner {
|
|
|
234
313
|
if (this.pos === this.leadingTokenStart && !NON_ASCII.test(this.sql[j] ?? '')) {
|
|
235
314
|
this.leadingWord = this.sql.slice(this.pos, j);
|
|
236
315
|
}
|
|
316
|
+
this.pushToken('word', this.sql.slice(this.pos, j), this.pos, j);
|
|
237
317
|
this.emitCode(j);
|
|
238
318
|
return null;
|
|
239
319
|
}
|
|
@@ -302,10 +382,18 @@ class SQLScreeningScanner {
|
|
|
302
382
|
/** Records a span up to `end` and writes a space for it, or an identifier's bare name. */
|
|
303
383
|
emitSpan(kind, end, identifierName) {
|
|
304
384
|
this.spans.push({ Kind: kind, Start: this.pos, End: end });
|
|
385
|
+
if (kind === 'string')
|
|
386
|
+
this.pushToken('string', this.sql.slice(this.pos, end), this.pos, end);
|
|
387
|
+
if (kind === 'identifier')
|
|
388
|
+
this.pushToken('identifier', identifierName ?? '', this.pos, end);
|
|
305
389
|
this.code.push(' ');
|
|
306
390
|
this.codeWithIdentifiers.push(identifierName === undefined ? ' ' : ` ${identifierName} `);
|
|
307
391
|
this.pos = end;
|
|
308
392
|
}
|
|
393
|
+
/** Records one token. */
|
|
394
|
+
pushToken(kind, text, start, end) {
|
|
395
|
+
this.tokens.push({ Kind: kind, Text: text, Start: start, End: end });
|
|
396
|
+
}
|
|
309
397
|
/** Writes a token boundary that the input leaves implicit. */
|
|
310
398
|
emitBoundary() {
|
|
311
399
|
this.code.push(' ');
|
|
@@ -326,7 +414,62 @@ class SQLScreeningScanner {
|
|
|
326
414
|
Code: this.code.join(''),
|
|
327
415
|
CodeWithIdentifiers: this.codeWithIdentifiers.join(''),
|
|
328
416
|
LeadingWord: this.leadingWord,
|
|
417
|
+
Tokens: this.tokens,
|
|
329
418
|
};
|
|
330
419
|
}
|
|
331
420
|
}
|
|
421
|
+
/**
|
|
422
|
+
* The text of a PostgreSQL `U&"…"` identifier (its doubled quotes already undone) with its Unicode
|
|
423
|
+
* escapes decoded: `<escape>XXXX` (four hex digits), `<escape>+XXXXXX` (six), and a doubled escape
|
|
424
|
+
* character for the character itself. A surrogate pair may be written as two escapes. Null when
|
|
425
|
+
* PostgreSQL would reject an escape: a malformed one, a lone surrogate, U+0000, or past U+10FFFF.
|
|
426
|
+
*
|
|
427
|
+
* @param body The text between the quotes
|
|
428
|
+
* @param escape The escape character: a backslash, or the one a `UESCAPE` clause names
|
|
429
|
+
*/
|
|
430
|
+
function decodeUnicodeEscapes(body, escape) {
|
|
431
|
+
let out = '';
|
|
432
|
+
let i = 0;
|
|
433
|
+
while (i < body.length) {
|
|
434
|
+
if (body[i] !== escape) {
|
|
435
|
+
out += body[i++];
|
|
436
|
+
}
|
|
437
|
+
else if (body[i + 1] === escape) {
|
|
438
|
+
out += escape;
|
|
439
|
+
i += 2;
|
|
440
|
+
}
|
|
441
|
+
else {
|
|
442
|
+
const decoded = decodeEscapedCodePoint(body, i, escape);
|
|
443
|
+
if (decoded === null)
|
|
444
|
+
return null;
|
|
445
|
+
out += String.fromCodePoint(decoded.CodePoint);
|
|
446
|
+
i = decoded.Next;
|
|
447
|
+
}
|
|
448
|
+
}
|
|
449
|
+
return out;
|
|
450
|
+
}
|
|
451
|
+
/** The code point the escape at `at` writes, joining a surrogate pair, and the offset after it. */
|
|
452
|
+
function decodeEscapedCodePoint(body, at, escape) {
|
|
453
|
+
const first = readEscape(body, at);
|
|
454
|
+
if (first === null)
|
|
455
|
+
return null;
|
|
456
|
+
if (first.CodePoint >= 0xdc00 && first.CodePoint <= 0xdfff)
|
|
457
|
+
return null;
|
|
458
|
+
if (first.CodePoint < 0xd800 || first.CodePoint > 0xdbff)
|
|
459
|
+
return first;
|
|
460
|
+
const second = body[first.Next] === escape ? readEscape(body, first.Next) : null;
|
|
461
|
+
if (second === null || second.CodePoint < 0xdc00 || second.CodePoint > 0xdfff)
|
|
462
|
+
return null;
|
|
463
|
+
return { CodePoint: 0x10000 + ((first.CodePoint - 0xd800) << 10) + (second.CodePoint - 0xdc00), Next: second.Next };
|
|
464
|
+
}
|
|
465
|
+
/** One `<escape>XXXX` or `<escape>+XXXXXX` escape at `at`, or null when it is malformed or out of range. */
|
|
466
|
+
function readEscape(body, at) {
|
|
467
|
+
const long = body[at + 1] === '+';
|
|
468
|
+
const start = at + (long ? 2 : 1);
|
|
469
|
+
const hex = body.slice(start, start + (long ? 6 : 4));
|
|
470
|
+
if (!/^[0-9A-Fa-f]+$/.test(hex) || hex.length !== (long ? 6 : 4))
|
|
471
|
+
return null;
|
|
472
|
+
const codePoint = parseInt(hex, 16);
|
|
473
|
+
return codePoint === 0 || codePoint > 0x10ffff ? null : { CodePoint: codePoint, Next: start + hex.length };
|
|
474
|
+
}
|
|
332
475
|
//# sourceMappingURL=SQLScreeningScanner.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"SQLScreeningScanner.js","sourceRoot":"","sources":["../src/SQLScreeningScanner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"SQLScreeningScanner.js","sourceRoot":"","sources":["../src/SQLScreeningScanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldSecurityEgressCompliance.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/FieldSecurityEgressCompliance.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,228 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Field-Security Egress Compliance (source guard)
|
|
3
|
+
*
|
|
4
|
+
* Scans the code that hands entity values to someone outside the server process (GraphQL
|
|
5
|
+
* resolvers and the rest of the API server, REST handlers, realtime and agent sessions, the MCP
|
|
6
|
+
* and A2A servers, agents, communications, templates, search, messaging adapters and actions)
|
|
7
|
+
* for the calls that turn an entity object or a view result into plain values:
|
|
8
|
+
* - `.GetAll(`, `.GetDataObject(`, `.GetDataObjectJSON(`, `.To(`
|
|
9
|
+
* - `<entity>.Fields.map(f => f.Value)`
|
|
10
|
+
* - `JSON.stringify(<entity>)` and `JSON.stringify(<rows>)` (heuristic, below)
|
|
11
|
+
* - `res.json(…Results…)` / `res.send(…Results…)`: a view's rows written straight to an HTTP response
|
|
12
|
+
*
|
|
13
|
+
* An entity object built for a restricted user never holds a value that user is denied, so most
|
|
14
|
+
* of these calls are safe. They are flagged anyway because the object's width depends on WHO it
|
|
15
|
+
* was built for: an object loaded as the system user, taken from an engine cache, or created
|
|
16
|
+
* with no user carries every column, and serializing it to a caller leaks what field-level
|
|
17
|
+
* security denies them. Each flagged line must therefore say why it is safe, or route its values
|
|
18
|
+
* through `ProjectEntityValuesForUser` / `ProjectEntityValueRowsForUser` from `@memberjunction/core`.
|
|
19
|
+
*
|
|
20
|
+
* See guides/FIELD_LEVEL_SECURITY_GUIDE.md, "Building on field-level security".
|
|
21
|
+
*
|
|
22
|
+
* ## Allow comments
|
|
23
|
+
*
|
|
24
|
+
* A flagged line passes when the `//` comment directly above it carries `// fls-guard: <reason>`
|
|
25
|
+
* on a line of its own (the comment may run over several `//` lines). A marker trailing code does
|
|
26
|
+
* not count. Keep the reason short and specific, for example:
|
|
27
|
+
* - `// fls-guard: projected by ProjectEntityValuesForUser below`
|
|
28
|
+
* - `// fls-guard: loaded as the caller; width follows its user`
|
|
29
|
+
* - `// fls-guard: system-user-only resolver`
|
|
30
|
+
* A marker with no reason does not count.
|
|
31
|
+
*
|
|
32
|
+
* ## The JSON.stringify heuristic
|
|
33
|
+
*
|
|
34
|
+
* Types are not available to a text scan, so `JSON.stringify(x)` is flagged only when its first
|
|
35
|
+
* argument is a plain identifier or member path (no call, index or literal) whose LAST segment is
|
|
36
|
+
* named like an entity object: `entity`, `record`, `entityObject`, `fooEntity`, `fooRecord`,
|
|
37
|
+
* `fooEntityObject` (any case), or like a set of rows: `rows`, `results`, `records` (so
|
|
38
|
+
* `result.Results` counts). `JSON.stringify(result.EntityUpdateDates)` is not flagged. This misses
|
|
39
|
+
* values held under other names; it is a reminder that runs on every PR, not a proof.
|
|
40
|
+
*
|
|
41
|
+
* ## Scope
|
|
42
|
+
*
|
|
43
|
+
* In `MJServer/src`: `resolvers`, `rest`, `generic`, `agentSessions`, `realtimeProxy`,
|
|
44
|
+
* `realtimeSessions`, `realtimeWidget`, `services`, `index.ts` and `realtimeConfigUnits.ts`. Also
|
|
45
|
+
* `AI/MCPServer/src`, `AI/A2AServer/src`, `AI/Agents/src`, and every `src/` folder under `Actions/`,
|
|
46
|
+
* `Communication/`, `Templates/`, `SearchEngine/` and `MessagingAdapters/`. Tests, generated code,
|
|
47
|
+
* `dist/` and `.d.ts` files are skipped, as are pure comment lines and imports.
|
|
48
|
+
*/
|
|
49
|
+
import { describe, it, expect } from 'vitest';
|
|
50
|
+
import * as fs from 'fs';
|
|
51
|
+
import * as path from 'path';
|
|
52
|
+
const PACKAGES_ROOT = path.resolve(__dirname, '..', '..', '..'); // packages/
|
|
53
|
+
/** Folders and files scanned, relative to packages/. A {@link SRC_ONLY_ROOTS} folder is walked for every nested `src/`. */
|
|
54
|
+
const SCAN_DIRS = [
|
|
55
|
+
'MJServer/src/resolvers',
|
|
56
|
+
'MJServer/src/rest',
|
|
57
|
+
'MJServer/src/generic',
|
|
58
|
+
'MJServer/src/agentSessions',
|
|
59
|
+
'MJServer/src/realtimeProxy',
|
|
60
|
+
'MJServer/src/realtimeSessions',
|
|
61
|
+
'MJServer/src/realtimeWidget',
|
|
62
|
+
'MJServer/src/services',
|
|
63
|
+
'MJServer/src/index.ts',
|
|
64
|
+
'MJServer/src/realtimeConfigUnits.ts',
|
|
65
|
+
'AI/MCPServer/src',
|
|
66
|
+
'AI/A2AServer/src',
|
|
67
|
+
'AI/Agents/src',
|
|
68
|
+
'Actions',
|
|
69
|
+
'Communication',
|
|
70
|
+
'Templates',
|
|
71
|
+
'SearchEngine',
|
|
72
|
+
'MessagingAdapters',
|
|
73
|
+
];
|
|
74
|
+
/** Roots holding several packages: only files under a package's `src/` count. */
|
|
75
|
+
const SRC_ONLY_ROOTS = ['Actions', 'Communication', 'Templates', 'SearchEngine', 'MessagingAdapters'];
|
|
76
|
+
/** Calls that produce an entity's field values as plain data. */
|
|
77
|
+
const ACCESSOR_PATTERN = /\.(GetAll|GetDataObject|GetDataObjectJSON|To)\s*[<(]/;
|
|
78
|
+
/** `JSON.stringify(<path>)` where the last path segment is named like an entity object or a set of rows. */
|
|
79
|
+
const STRINGIFY_ENTITY_PATTERN = /JSON\.stringify\(\s*(?:[A-Za-z_$][\w$]*\??\.)*(?:entity|record|entityObject|rows|results|records|[A-Za-z_$][\w$]*(?:Entity|Record|EntityObject))\s*(?:\?\?\s*[\w$.]+\s*)?[,)]/i;
|
|
80
|
+
/** An entity's field values read in bulk: `.Fields.map(f => f.Value)`. */
|
|
81
|
+
const FIELD_VALUES_PATTERN = /\.Fields\.map\(\s*\(?\s*([A-Za-z_$][\w$]*)(?:\s*:\s*[\w.]+)?\s*\)?\s*=>\s*\1\.Value\b/;
|
|
82
|
+
/** A view's rows written straight to an HTTP response. */
|
|
83
|
+
const RESULTS_RESPONSE_PATTERN = /\b(?:res|response|reply)(?:\.status\([^)]*\))?\.(?:json|send)\([^;]*\bResults\b/;
|
|
84
|
+
/** The allow marker, with a non-empty reason after it. */
|
|
85
|
+
const ALLOW_COMMENT = /\/\/\s*fls-guard:\s*\S/;
|
|
86
|
+
const EXCLUDE_PATH_PATTERNS = [
|
|
87
|
+
/node_modules/,
|
|
88
|
+
/\/dist\//,
|
|
89
|
+
/\/generated\//,
|
|
90
|
+
/\.test\.ts$/,
|
|
91
|
+
/\.spec\.ts$/,
|
|
92
|
+
/__tests__/,
|
|
93
|
+
/\.d\.ts$/,
|
|
94
|
+
];
|
|
95
|
+
function shouldScanFile(filePath) {
|
|
96
|
+
if (!filePath.endsWith('.ts'))
|
|
97
|
+
return false;
|
|
98
|
+
if (EXCLUDE_PATH_PATTERNS.some(p => p.test(filePath)))
|
|
99
|
+
return false;
|
|
100
|
+
// Under a multi-package root, only package source counts: skip scripts, fixtures and the like.
|
|
101
|
+
const relative = path.relative(PACKAGES_ROOT, filePath).split(path.sep).join('/');
|
|
102
|
+
const root = SRC_ONLY_ROOTS.find(r => relative.startsWith(`${r}/`));
|
|
103
|
+
return !root || relative.includes('/src/');
|
|
104
|
+
}
|
|
105
|
+
function findTsFiles(dir) {
|
|
106
|
+
const results = [];
|
|
107
|
+
if (!fs.existsSync(dir))
|
|
108
|
+
return results;
|
|
109
|
+
if (fs.statSync(dir).isFile())
|
|
110
|
+
return shouldScanFile(dir) ? [dir] : [];
|
|
111
|
+
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
112
|
+
const fullPath = path.join(dir, entry.name);
|
|
113
|
+
if (entry.isDirectory()) {
|
|
114
|
+
if (['node_modules', 'dist', '.git', 'generated', '__tests__'].includes(entry.name))
|
|
115
|
+
continue;
|
|
116
|
+
results.push(...findTsFiles(fullPath));
|
|
117
|
+
}
|
|
118
|
+
else if (shouldScanFile(fullPath)) {
|
|
119
|
+
results.push(fullPath);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
return results;
|
|
123
|
+
}
|
|
124
|
+
/** True when `line` serializes an entity in a way this guard flags. Exported shape for the self-test. */
|
|
125
|
+
function lineSerializesEntity(line) {
|
|
126
|
+
const trimmed = line.trim();
|
|
127
|
+
if (trimmed.startsWith('//') || trimmed.startsWith('*') || trimmed.startsWith('/*'))
|
|
128
|
+
return false;
|
|
129
|
+
if (trimmed.startsWith('import '))
|
|
130
|
+
return false;
|
|
131
|
+
return [ACCESSOR_PATTERN, STRINGIFY_ENTITY_PATTERN, FIELD_VALUES_PATTERN, RESULTS_RESPONSE_PATTERN].some(p => p.test(line));
|
|
132
|
+
}
|
|
133
|
+
/** True when `line` is a `//` comment and nothing else. */
|
|
134
|
+
function isCommentOnlyLine(line) {
|
|
135
|
+
return line.trim().startsWith('//');
|
|
136
|
+
}
|
|
137
|
+
/**
|
|
138
|
+
* True when the `//` comment lines directly above line `index` of `lines` carry the allow marker.
|
|
139
|
+
* A marker that trails code does not count, on the flagged line or above it: it would otherwise
|
|
140
|
+
* also shield the line after it.
|
|
141
|
+
*/
|
|
142
|
+
function isAllowed(lines, index) {
|
|
143
|
+
for (let i = index - 1; i >= 0 && isCommentOnlyLine(lines[i]); i--) {
|
|
144
|
+
if (ALLOW_COMMENT.test(lines[i])) {
|
|
145
|
+
return true;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
return false;
|
|
149
|
+
}
|
|
150
|
+
function scanLines(lines, file) {
|
|
151
|
+
const violations = [];
|
|
152
|
+
for (let i = 0; i < lines.length; i++) {
|
|
153
|
+
if (lineSerializesEntity(lines[i]) && !isAllowed(lines, i)) {
|
|
154
|
+
violations.push({ file, line: i + 1, content: lines[i].trim().substring(0, 160) });
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
return violations;
|
|
158
|
+
}
|
|
159
|
+
function scanFile(filePath) {
|
|
160
|
+
const lines = fs.readFileSync(filePath, 'utf-8').split('\n');
|
|
161
|
+
return scanLines(lines, path.relative(PACKAGES_ROOT, filePath));
|
|
162
|
+
}
|
|
163
|
+
describe('Field-Security Egress Compliance', () => {
|
|
164
|
+
describe('the heuristic', () => {
|
|
165
|
+
it('flags the entity accessors', () => {
|
|
166
|
+
expect(lineSerializesEntity('return entity.GetAll();')).toBe(true);
|
|
167
|
+
expect(lineSerializesEntity('const v = await record.GetDataObject({')).toBe(true);
|
|
168
|
+
expect(lineSerializesEntity('res.json(await e.GetDataObjectJSON())')).toBe(true);
|
|
169
|
+
});
|
|
170
|
+
it('flags JSON.stringify of something named like an entity', () => {
|
|
171
|
+
expect(lineSerializesEntity('JSON.stringify(entity)')).toBe(true);
|
|
172
|
+
expect(lineSerializesEntity('JSON.stringify(this.entityObject, null, 2)')).toBe(true);
|
|
173
|
+
expect(lineSerializesEntity('JSON.stringify(userRecord)')).toBe(true);
|
|
174
|
+
expect(lineSerializesEntity('JSON.stringify(params.fileEntity)')).toBe(true);
|
|
175
|
+
});
|
|
176
|
+
it('flags rows serialized or sent as a response, entity.To(), and Fields.map(f => f.Value)', () => {
|
|
177
|
+
expect(lineSerializesEntity('JSON.stringify(rows)')).toBe(true);
|
|
178
|
+
expect(lineSerializesEntity('JSON.stringify(result.Results, null, 2)')).toBe(true);
|
|
179
|
+
expect(lineSerializesEntity('Results: JSON.stringify(result.Results ?? null),')).toBe(true);
|
|
180
|
+
expect(lineSerializesEntity('res.json(result.Results);')).toBe(true);
|
|
181
|
+
expect(lineSerializesEntity('res.status(200).json({ rows: result.Results })')).toBe(true);
|
|
182
|
+
expect(lineSerializesEntity('return entity.To(schema);')).toBe(true);
|
|
183
|
+
expect(lineSerializesEntity('const v = record.To<typeof S>(S);')).toBe(true);
|
|
184
|
+
expect(lineSerializesEntity('const values = entity.Fields.map(f => f.Value);')).toBe(true);
|
|
185
|
+
expect(lineSerializesEntity('const values = entity.Fields.map((field) => field.Value);')).toBe(true);
|
|
186
|
+
});
|
|
187
|
+
it('does not flag plain data, comments or imports', () => {
|
|
188
|
+
expect(lineSerializesEntity('JSON.stringify(result.EntityUpdateDates)')).toBe(false);
|
|
189
|
+
expect(lineSerializesEntity('JSON.stringify(entities[i])')).toBe(false);
|
|
190
|
+
expect(lineSerializesEntity('x.ToString()')).toBe(false);
|
|
191
|
+
expect(lineSerializesEntity('entity.Fields.map(f => f.Name)')).toBe(false);
|
|
192
|
+
expect(lineSerializesEntity('res.json({ Success: true })')).toBe(false);
|
|
193
|
+
expect(lineSerializesEntity(' * Uses entity.GetAll() for scalar fields')).toBe(false);
|
|
194
|
+
expect(lineSerializesEntity('// entity.GetAll() is projected below')).toBe(false);
|
|
195
|
+
});
|
|
196
|
+
it('accepts an allow comment with a reason on a comment line directly above', () => {
|
|
197
|
+
expect(scanLines(['// fls-guard: projected below', 'x = e.GetAll();'], 'f')).toHaveLength(0);
|
|
198
|
+
expect(scanLines([' // fls-guard: indented', ' x = e.GetAll();'], 'f')).toHaveLength(0);
|
|
199
|
+
expect(scanLines(['// fls-guard: a reason that', '// runs over two lines', 'x = e.GetAll();'], 'f')).toHaveLength(0);
|
|
200
|
+
expect(scanLines(['// fls-guard:', 'x = e.GetAll();'], 'f')).toHaveLength(1);
|
|
201
|
+
expect(scanLines(['// fls-guard: two lines up', '', 'x = e.GetAll();'], 'f')).toHaveLength(1);
|
|
202
|
+
});
|
|
203
|
+
it('REGRESSION: does not accept a marker that trails code, on the line or the line above', () => {
|
|
204
|
+
expect(scanLines(['x = e.GetAll(); // fls-guard: system user only'], 'f')).toHaveLength(1);
|
|
205
|
+
expect(scanLines(['a = b.GetAll(); // fls-guard: system user only', 'x = e.GetAll();'], 'f')).toHaveLength(2);
|
|
206
|
+
expect(scanLines(['a = 1; // fls-guard: not a comment line', 'x = e.GetAll();'], 'f')).toHaveLength(1);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
it('every entity serialization in a transport or action is projected or explains why it is safe', () => {
|
|
210
|
+
const files = SCAN_DIRS.flatMap(dir => findTsFiles(path.join(PACKAGES_ROOT, dir)));
|
|
211
|
+
expect(files.length).toBeGreaterThan(0);
|
|
212
|
+
const violations = files.flatMap(scanFile);
|
|
213
|
+
if (violations.length === 0)
|
|
214
|
+
return;
|
|
215
|
+
const report = violations.map(v => ` ${v.file}:${v.line}: ${v.content}`).join('\n');
|
|
216
|
+
expect.fail(`Found ${violations.length} entity serialization(s) with no field-security note:\n${report}\n\n` +
|
|
217
|
+
`An entity object loaded as the system user, taken from an engine cache, or created with no\n` +
|
|
218
|
+
`user holds every column, and serializing it to a caller leaks the fields they are denied.\n\n` +
|
|
219
|
+
`How to fix:\n` +
|
|
220
|
+
` 1. Route the values through ProjectEntityValuesForUser / ProjectEntityValueRowsForUser\n` +
|
|
221
|
+
` (@memberjunction/core) for the principal who receives them, then mark the line.\n` +
|
|
222
|
+
` 2. If the object was built for that same principal (its width follows its user), or the path\n` +
|
|
223
|
+
` is system-user-only, say so: \`// fls-guard: <reason>\` on a comment-only line in the\n` +
|
|
224
|
+
` comment block directly above the flagged line. A marker trailing code does not count.\n\n` +
|
|
225
|
+
`See guides/FIELD_LEVEL_SECURITY_GUIDE.md, "Building on field-level security".`);
|
|
226
|
+
});
|
|
227
|
+
});
|
|
228
|
+
//# sourceMappingURL=FieldSecurityEgressCompliance.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FieldSecurityEgressCompliance.test.js","sourceRoot":"","sources":["../../src/__tests__/FieldSecurityEgressCompliance.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+CG;AACH,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,aAAa,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC,YAAY;AAE7E,2HAA2H;AAC3H,MAAM,SAAS,GAAG;IACd,wBAAwB;IACxB,mBAAmB;IACnB,sBAAsB;IACtB,4BAA4B;IAC5B,4BAA4B;IAC5B,+BAA+B;IAC/B,6BAA6B;IAC7B,uBAAuB;IACvB,uBAAuB;IACvB,qCAAqC;IACrC,kBAAkB;IAClB,kBAAkB;IAClB,eAAe;IACf,SAAS;IACT,eAAe;IACf,WAAW;IACX,cAAc;IACd,mBAAmB;CACtB,CAAC;AAEF,iFAAiF;AACjF,MAAM,cAAc,GAAG,CAAC,SAAS,EAAE,eAAe,EAAE,WAAW,EAAE,cAAc,EAAE,mBAAmB,CAAC,CAAC;AAEtG,iEAAiE;AACjE,MAAM,gBAAgB,GAAG,sDAAsD,CAAC;AAEhF,4GAA4G;AAC5G,MAAM,wBAAwB,GAC1B,gLAAgL,CAAC;AAErL,0EAA0E;AAC1E,MAAM,oBAAoB,GAAG,uFAAuF,CAAC;AAErH,0DAA0D;AAC1D,MAAM,wBAAwB,GAAG,iFAAiF,CAAC;AAEnH,0DAA0D;AAC1D,MAAM,aAAa,GAAG,wBAAwB,CAAC;AAE/C,MAAM,qBAAqB,GAAG;IAC1B,cAAc;IACd,UAAU;IACV,eAAe;IACf,aAAa;IACb,aAAa;IACb,WAAW;IACX,UAAU;CACb,CAAC;AAQF,SAAS,cAAc,CAAC,QAAgB;IACpC,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IAC5C,IAAI,qBAAqB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAAE,OAAO,KAAK,CAAC;IACpE,+FAA+F;IAC/F,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAClF,MAAM,IAAI,GAAG,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,QAAQ,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IACpE,OAAO,CAAC,IAAI,IAAI,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,WAAW,CAAC,GAAW;IAC5B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,OAAO,CAAC;IACxC,IAAI,EAAE,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE;QAAE,OAAO,cAAc,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvE,KAAK,MAAM,KAAK,IAAI,EAAE,CAAC,WAAW,CAAC,GAAG,EAAE,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC;QAC/D,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QAC5C,IAAI,KAAK,CAAC,WAAW,EAAE,EAAE,CAAC;YACtB,IAAI,CAAC,cAAc,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;gBAAE,SAAS;YAC9F,OAAO,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC3C,CAAC;aAAM,IAAI,cAAc,CAAC,QAAQ,CAAC,EAAE,CAAC;YAClC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAC3B,CAAC;IACL,CAAC;IACD,OAAO,OAAO,CAAC;AACnB,CAAC;AAED,yGAAyG;AACzG,SAAS,oBAAoB,CAAC,IAAY;IACtC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAC5B,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IAClG,IAAI,OAAO,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO,KAAK,CAAC;IAChD,OAAO,CAAC,gBAAgB,EAAE,wBAAwB,EAAE,oBAAoB,EAAE,wBAAwB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAChI,CAAC;AAED,2DAA2D;AAC3D,SAAS,iBAAiB,CAAC,IAAY;IACnC,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;AACxC,CAAC;AAED;;;;GAIG;AACH,SAAS,SAAS,CAAC,KAAe,EAAE,KAAa;IAC7C,KAAK,IAAI,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,iBAAiB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC;QACjE,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;YAC/B,OAAO,IAAI,CAAC;QAChB,CAAC;IACL,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AAED,SAAS,SAAS,CAAC,KAAe,EAAE,IAAY;IAC5C,MAAM,UAAU,GAAgB,EAAE,CAAC;IACnC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACpC,IAAI,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,CAAC,EAAE,CAAC;YACzD,UAAU,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC,CAAC;QACvF,CAAC;IACL,CAAC;IACD,OAAO,UAAU,CAAC;AACtB,CAAC;AAED,SAAS,QAAQ,CAAC,QAAgB;IAC9B,MAAM,KAAK,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC7D,OAAO,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpE,CAAC;AAED,QAAQ,CAAC,kCAAkC,EAAE,GAAG,EAAE;IAC9C,QAAQ,CAAC,eAAe,EAAE,GAAG,EAAE;QAC3B,EAAE,CAAC,4BAA4B,EAAE,GAAG,EAAE;YAClC,MAAM,CAAC,oBAAoB,CAAC,yBAAyB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnE,MAAM,CAAC,oBAAoB,CAAC,wCAAwC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClF,MAAM,CAAC,oBAAoB,CAAC,uCAAuC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wDAAwD,EAAE,GAAG,EAAE;YAC9D,MAAM,CAAC,oBAAoB,CAAC,wBAAwB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAClE,MAAM,CAAC,oBAAoB,CAAC,4CAA4C,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtF,MAAM,CAAC,oBAAoB,CAAC,4BAA4B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACtE,MAAM,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACjF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,wFAAwF,EAAE,GAAG,EAAE;YAC9F,MAAM,CAAC,oBAAoB,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAChE,MAAM,CAAC,oBAAoB,CAAC,yCAAyC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnF,MAAM,CAAC,oBAAoB,CAAC,kDAAkD,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5F,MAAM,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,oBAAoB,CAAC,gDAAgD,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC1F,MAAM,CAAC,oBAAoB,CAAC,2BAA2B,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACrE,MAAM,CAAC,oBAAoB,CAAC,mCAAmC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC7E,MAAM,CAAC,oBAAoB,CAAC,iDAAiD,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC3F,MAAM,CAAC,oBAAoB,CAAC,2DAA2D,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,+CAA+C,EAAE,GAAG,EAAE;YACrD,MAAM,CAAC,oBAAoB,CAAC,0CAA0C,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACrF,MAAM,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,oBAAoB,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzD,MAAM,CAAC,oBAAoB,CAAC,gCAAgC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC3E,MAAM,CAAC,oBAAoB,CAAC,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACxE,MAAM,CAAC,oBAAoB,CAAC,2CAA2C,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACtF,MAAM,CAAC,oBAAoB,CAAC,uCAAuC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACtF,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;YAC/E,MAAM,CAAC,SAAS,CAAC,CAAC,+BAA+B,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7F,MAAM,CAAC,SAAS,CAAC,CAAC,4BAA4B,EAAE,qBAAqB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9F,MAAM,CAAC,SAAS,CAAC,CAAC,6BAA6B,EAAE,wBAAwB,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YACrH,MAAM,CAAC,SAAS,CAAC,CAAC,eAAe,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC7E,MAAM,CAAC,SAAS,CAAC,CAAC,4BAA4B,EAAE,EAAE,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAClG,CAAC,CAAC,CAAC;QAEH,EAAE,CAAC,sFAAsF,EAAE,GAAG,EAAE;YAC5F,MAAM,CAAC,SAAS,CAAC,CAAC,gDAAgD,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC3F,MAAM,CAAC,SAAS,CAAC,CAAC,gDAAgD,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;YAC9G,MAAM,CAAC,SAAS,CAAC,CAAC,yCAAyC,EAAE,iBAAiB,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QAC3G,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,6FAA6F,EAAE,GAAG,EAAE;QACnG,MAAM,KAAK,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,aAAa,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC;QACnF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC;QACxC,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC3C,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO;QAEpC,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrF,MAAM,CAAC,IAAI,CACP,SAAS,UAAU,CAAC,MAAM,0DAA0D,MAAM,MAAM;YAChG,8FAA8F;YAC9F,+FAA+F;YAC/F,eAAe;YACf,4FAA4F;YAC5F,wFAAwF;YACxF,kGAAkG;YAClG,8FAA8F;YAC9F,gGAAgG;YAChG,+EAA+E,CAClF,CAAC;IACN,CAAC,CAAC,CAAC;AACP,CAAC,CAAC,CAAC"}
|