@infra-blocks/aws-dynamodb 0.18.0 → 0.18.1-alpha.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.
- package/lib/cjs/commands/attributes/names.d.ts +1 -1
- package/lib/cjs/commands/attributes/names.js +18 -10
- package/lib/cjs/commands/attributes/names.js.map +1 -1
- package/lib/cjs/commands/attributes/values.d.ts +1 -2
- package/lib/cjs/commands/attributes/values.js +4 -13
- package/lib/cjs/commands/attributes/values.js.map +1 -1
- package/lib/esm/commands/attributes/names.d.ts +1 -1
- package/lib/esm/commands/attributes/names.js +18 -10
- package/lib/esm/commands/attributes/names.js.map +1 -1
- package/lib/esm/commands/attributes/values.d.ts +1 -2
- package/lib/esm/commands/attributes/values.js +4 -13
- package/lib/esm/commands/attributes/values.js.map +1 -1
- package/package.json +1 -1
|
@@ -44,6 +44,6 @@ export declare class AttributeNames {
|
|
|
44
44
|
* @returns A mapping of substitutions generated by this object, undefined if none were.
|
|
45
45
|
*/
|
|
46
46
|
getSubstitutions(): Record<Substitution, AttributePath> | undefined;
|
|
47
|
-
private
|
|
47
|
+
private getAndSetNextSubstituteFor;
|
|
48
48
|
static create(): AttributeNames;
|
|
49
49
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.AttributeNames = void 0;
|
|
4
|
+
// TODO: handle the ambiguous case where an attribute name contains a `.` character (and isn't a path). This might require adding vocabulary to operands.
|
|
5
|
+
// For example, it might be fixed by adding a `literal()` operand.
|
|
4
6
|
/**
|
|
5
7
|
* Represents a set of attribute names used in a condition expression.
|
|
6
8
|
*
|
|
@@ -37,15 +39,19 @@ class AttributeNames {
|
|
|
37
39
|
* @returns The substitution associated with the attribute path.
|
|
38
40
|
*/
|
|
39
41
|
substitute(attribute) {
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
// If the attribute is already known, we return its current substitution.
|
|
43
|
-
return current;
|
|
42
|
+
if (attribute.length === 0) {
|
|
43
|
+
throw new Error("error substituting attribute: empty attribute path not allowed");
|
|
44
44
|
}
|
|
45
|
-
|
|
46
|
-
const
|
|
47
|
-
|
|
48
|
-
|
|
45
|
+
const pathTokens = attribute.split(".");
|
|
46
|
+
const result = [];
|
|
47
|
+
for (const token of pathTokens) {
|
|
48
|
+
if (token.length === 0) {
|
|
49
|
+
throw new Error(`error substituting attribute ${attribute}: empty path token not allowed`);
|
|
50
|
+
}
|
|
51
|
+
const substitute = this.names.get(token) ?? this.getAndSetNextSubstituteFor(token);
|
|
52
|
+
result.push(substitute);
|
|
53
|
+
}
|
|
54
|
+
return result.join(".");
|
|
49
55
|
}
|
|
50
56
|
/**
|
|
51
57
|
* Returns a record where the keys are the substitutions generated by this object
|
|
@@ -63,8 +69,10 @@ class AttributeNames {
|
|
|
63
69
|
}
|
|
64
70
|
return result;
|
|
65
71
|
}
|
|
66
|
-
|
|
67
|
-
|
|
72
|
+
getAndSetNextSubstituteFor(path) {
|
|
73
|
+
const nextSubstitute = `#attr${this.names.size + 1}`;
|
|
74
|
+
this.names.set(path, nextSubstitute);
|
|
75
|
+
return nextSubstitute;
|
|
68
76
|
}
|
|
69
77
|
static create() {
|
|
70
78
|
return new AttributeNames();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../../src/commands/attributes/names.ts"],"names":[],"mappings":";;;AAOA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,cAAc;IACR,KAAK,CAAmC;IAEzD;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,SAAwB;QACjC,MAAM,
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../../src/commands/attributes/names.ts"],"names":[],"mappings":";;;AAOA,yJAAyJ;AACzJ,kEAAkE;AAClE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAa,cAAc;IACR,KAAK,CAAmC;IAEzD;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,SAAwB;QACjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,gCAAgC,CAC1E,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAiB,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAwC,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,0BAA0B,CAAC,IAAmB;QACpD,MAAM,cAAc,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAkB,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACrC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,cAAc,EAAE,CAAC;IAC9B,CAAC;CACF;AApED,wCAoEC"}
|
|
@@ -15,7 +15,6 @@ export type ValueReference = `:${string}`;
|
|
|
15
15
|
*/
|
|
16
16
|
export declare class AttributeValues {
|
|
17
17
|
private readonly values;
|
|
18
|
-
private counter;
|
|
19
18
|
private constructor();
|
|
20
19
|
/**
|
|
21
20
|
* Substitutes a value with a reference and returns the result.
|
|
@@ -37,6 +36,6 @@ export declare class AttributeValues {
|
|
|
37
36
|
* @returns A mapping of value references generated by this object, undefined if none were.
|
|
38
37
|
*/
|
|
39
38
|
getSubstitutions(): Record<ValueReference, AttributeValue> | undefined;
|
|
40
|
-
private
|
|
39
|
+
private getAndSetNextSubstitutionFor;
|
|
41
40
|
static create(): AttributeValues;
|
|
42
41
|
}
|
|
@@ -16,10 +16,8 @@ exports.AttributeValues = void 0;
|
|
|
16
16
|
*/
|
|
17
17
|
class AttributeValues {
|
|
18
18
|
values;
|
|
19
|
-
counter;
|
|
20
19
|
constructor() {
|
|
21
20
|
this.values = new Map();
|
|
22
|
-
this.counter = 0;
|
|
23
21
|
}
|
|
24
22
|
/**
|
|
25
23
|
* Substitutes a value with a reference and returns the result.
|
|
@@ -34,14 +32,7 @@ class AttributeValues {
|
|
|
34
32
|
* @returns The reference associated with the attribute value.
|
|
35
33
|
*/
|
|
36
34
|
substitute(value) {
|
|
37
|
-
|
|
38
|
-
if (existing != null) {
|
|
39
|
-
// If the value is already known, we do not need to generate a new reference.
|
|
40
|
-
return existing;
|
|
41
|
-
}
|
|
42
|
-
const reference = this.nextReference();
|
|
43
|
-
this.values.set(value, reference);
|
|
44
|
-
return reference;
|
|
35
|
+
return this.values.get(value) ?? this.getAndSetNextSubstitutionFor(value);
|
|
45
36
|
}
|
|
46
37
|
/**
|
|
47
38
|
* Returns record of all substitutions made by this object where the keys are
|
|
@@ -59,9 +50,9 @@ class AttributeValues {
|
|
|
59
50
|
}
|
|
60
51
|
return result;
|
|
61
52
|
}
|
|
62
|
-
|
|
63
|
-
const reference =
|
|
64
|
-
this.
|
|
53
|
+
getAndSetNextSubstitutionFor(value) {
|
|
54
|
+
const reference = `:value${this.values.size + 1}`;
|
|
55
|
+
this.values.set(value, reference);
|
|
65
56
|
return reference;
|
|
66
57
|
}
|
|
67
58
|
static create() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../src/commands/attributes/values.ts"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;GAYG;AACH,MAAa,eAAe;IACT,MAAM,CAAsC;
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../src/commands/attributes/values.ts"],"names":[],"mappings":";;;AAIA;;;;;;;;;;;;GAYG;AACH,MAAa,eAAe;IACT,MAAM,CAAsC;IAE7D;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,KAAqB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAA2C,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,4BAA4B,CAAC,KAAqB;QACxD,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAoB,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,eAAe,EAAE,CAAC;IAC/B,CAAC;CACF;AAlDD,0CAkDC"}
|
|
@@ -44,6 +44,6 @@ export declare class AttributeNames {
|
|
|
44
44
|
* @returns A mapping of substitutions generated by this object, undefined if none were.
|
|
45
45
|
*/
|
|
46
46
|
getSubstitutions(): Record<Substitution, AttributePath> | undefined;
|
|
47
|
-
private
|
|
47
|
+
private getAndSetNextSubstituteFor;
|
|
48
48
|
static create(): AttributeNames;
|
|
49
49
|
}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
// TODO: handle the ambiguous case where an attribute name contains a `.` character (and isn't a path). This might require adding vocabulary to operands.
|
|
2
|
+
// For example, it might be fixed by adding a `literal()` operand.
|
|
1
3
|
/**
|
|
2
4
|
* Represents a set of attribute names used in a condition expression.
|
|
3
5
|
*
|
|
@@ -34,15 +36,19 @@ export class AttributeNames {
|
|
|
34
36
|
* @returns The substitution associated with the attribute path.
|
|
35
37
|
*/
|
|
36
38
|
substitute(attribute) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
// If the attribute is already known, we return its current substitution.
|
|
40
|
-
return current;
|
|
39
|
+
if (attribute.length === 0) {
|
|
40
|
+
throw new Error("error substituting attribute: empty attribute path not allowed");
|
|
41
41
|
}
|
|
42
|
-
|
|
43
|
-
const
|
|
44
|
-
|
|
45
|
-
|
|
42
|
+
const pathTokens = attribute.split(".");
|
|
43
|
+
const result = [];
|
|
44
|
+
for (const token of pathTokens) {
|
|
45
|
+
if (token.length === 0) {
|
|
46
|
+
throw new Error(`error substituting attribute ${attribute}: empty path token not allowed`);
|
|
47
|
+
}
|
|
48
|
+
const substitute = this.names.get(token) ?? this.getAndSetNextSubstituteFor(token);
|
|
49
|
+
result.push(substitute);
|
|
50
|
+
}
|
|
51
|
+
return result.join(".");
|
|
46
52
|
}
|
|
47
53
|
/**
|
|
48
54
|
* Returns a record where the keys are the substitutions generated by this object
|
|
@@ -60,8 +66,10 @@ export class AttributeNames {
|
|
|
60
66
|
}
|
|
61
67
|
return result;
|
|
62
68
|
}
|
|
63
|
-
|
|
64
|
-
|
|
69
|
+
getAndSetNextSubstituteFor(path) {
|
|
70
|
+
const nextSubstitute = `#attr${this.names.size + 1}`;
|
|
71
|
+
this.names.set(path, nextSubstitute);
|
|
72
|
+
return nextSubstitute;
|
|
65
73
|
}
|
|
66
74
|
static create() {
|
|
67
75
|
return new AttributeNames();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../../src/commands/attributes/names.ts"],"names":[],"mappings":"AAOA;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IACR,KAAK,CAAmC;IAEzD;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,SAAwB;QACjC,MAAM,
|
|
1
|
+
{"version":3,"file":"names.js","sourceRoot":"","sources":["../../../../src/commands/attributes/names.ts"],"names":[],"mappings":"AAOA,yJAAyJ;AACzJ,kEAAkE;AAClE;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,OAAO,cAAc;IACR,KAAK,CAAmC;IAEzD;QACE,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAA+B,CAAC;IACtD,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,SAAwB;QACjC,IAAI,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC3B,MAAM,IAAI,KAAK,CACb,gEAAgE,CACjE,CAAC;QACJ,CAAC;QAED,MAAM,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QACxC,MAAM,MAAM,GAAG,EAAE,CAAC;QAClB,KAAK,MAAM,KAAK,IAAI,UAAU,EAAE,CAAC;YAC/B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;gBACvB,MAAM,IAAI,KAAK,CACb,gCAAgC,SAAS,gCAAgC,CAC1E,CAAC;YACJ,CAAC;YACD,MAAM,UAAU,GACd,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,0BAA0B,CAAC,KAAK,CAAC,CAAC;YAClE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAC1B,CAAC;QACD,OAAO,MAAM,CAAC,IAAI,CAAC,GAAG,CAAiB,CAAC;IAC1C,CAAC;IAED;;;;;OAKG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC1B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAAwC,EAAE,CAAC;QACvD,KAAK,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,EAAE,EAAE,CAAC;YAC3D,MAAM,CAAC,UAAU,CAAC,GAAG,SAAS,CAAC;QACjC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,0BAA0B,CAAC,IAAmB;QACpD,MAAM,cAAc,GAAG,QAAQ,IAAI,CAAC,KAAK,CAAC,IAAI,GAAG,CAAC,EAAkB,CAAC;QACrE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,EAAE,cAAc,CAAC,CAAC;QACrC,OAAO,cAAc,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,cAAc,EAAE,CAAC;IAC9B,CAAC;CACF"}
|
|
@@ -15,7 +15,6 @@ export type ValueReference = `:${string}`;
|
|
|
15
15
|
*/
|
|
16
16
|
export declare class AttributeValues {
|
|
17
17
|
private readonly values;
|
|
18
|
-
private counter;
|
|
19
18
|
private constructor();
|
|
20
19
|
/**
|
|
21
20
|
* Substitutes a value with a reference and returns the result.
|
|
@@ -37,6 +36,6 @@ export declare class AttributeValues {
|
|
|
37
36
|
* @returns A mapping of value references generated by this object, undefined if none were.
|
|
38
37
|
*/
|
|
39
38
|
getSubstitutions(): Record<ValueReference, AttributeValue> | undefined;
|
|
40
|
-
private
|
|
39
|
+
private getAndSetNextSubstitutionFor;
|
|
41
40
|
static create(): AttributeValues;
|
|
42
41
|
}
|
|
@@ -13,10 +13,8 @@
|
|
|
13
13
|
*/
|
|
14
14
|
export class AttributeValues {
|
|
15
15
|
values;
|
|
16
|
-
counter;
|
|
17
16
|
constructor() {
|
|
18
17
|
this.values = new Map();
|
|
19
|
-
this.counter = 0;
|
|
20
18
|
}
|
|
21
19
|
/**
|
|
22
20
|
* Substitutes a value with a reference and returns the result.
|
|
@@ -31,14 +29,7 @@ export class AttributeValues {
|
|
|
31
29
|
* @returns The reference associated with the attribute value.
|
|
32
30
|
*/
|
|
33
31
|
substitute(value) {
|
|
34
|
-
|
|
35
|
-
if (existing != null) {
|
|
36
|
-
// If the value is already known, we do not need to generate a new reference.
|
|
37
|
-
return existing;
|
|
38
|
-
}
|
|
39
|
-
const reference = this.nextReference();
|
|
40
|
-
this.values.set(value, reference);
|
|
41
|
-
return reference;
|
|
32
|
+
return this.values.get(value) ?? this.getAndSetNextSubstitutionFor(value);
|
|
42
33
|
}
|
|
43
34
|
/**
|
|
44
35
|
* Returns record of all substitutions made by this object where the keys are
|
|
@@ -56,9 +47,9 @@ export class AttributeValues {
|
|
|
56
47
|
}
|
|
57
48
|
return result;
|
|
58
49
|
}
|
|
59
|
-
|
|
60
|
-
const reference =
|
|
61
|
-
this.
|
|
50
|
+
getAndSetNextSubstitutionFor(value) {
|
|
51
|
+
const reference = `:value${this.values.size + 1}`;
|
|
52
|
+
this.values.set(value, reference);
|
|
62
53
|
return reference;
|
|
63
54
|
}
|
|
64
55
|
static create() {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../src/commands/attributes/values.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,eAAe;IACT,MAAM,CAAsC;
|
|
1
|
+
{"version":3,"file":"values.js","sourceRoot":"","sources":["../../../../src/commands/attributes/values.ts"],"names":[],"mappings":"AAIA;;;;;;;;;;;;GAYG;AACH,MAAM,OAAO,eAAe;IACT,MAAM,CAAsC;IAE7D;QACE,IAAI,CAAC,MAAM,GAAG,IAAI,GAAG,EAAkC,CAAC;IAC1D,CAAC;IAED;;;;;;;;;;;OAWG;IACH,UAAU,CAAC,KAAqB;QAC9B,OAAO,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,IAAI,CAAC,4BAA4B,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC;IAED;;;;;OAKG;IACH,gBAAgB;QACd,IAAI,IAAI,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,EAAE,CAAC;YAC3B,OAAO,SAAS,CAAC;QACnB,CAAC;QAED,MAAM,MAAM,GAA2C,EAAE,CAAC;QAC1D,KAAK,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,EAAE,CAAC;YACvD,MAAM,CAAC,SAAS,CAAC,GAAG,KAAK,CAAC;QAC5B,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,4BAA4B,CAAC,KAAqB;QACxD,MAAM,SAAS,GAAG,SAAS,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,EAAoB,CAAC;QACpE,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;QAClC,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,MAAM,CAAC,MAAM;QACX,OAAO,IAAI,eAAe,EAAE,CAAC;IAC/B,CAAC;CACF"}
|