@specsafe/core 0.3.6 → 0.5.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/dist/agents/adapters/base.d.ts +44 -0
- package/dist/agents/adapters/base.d.ts.map +1 -0
- package/dist/agents/adapters/base.js +164 -0
- package/dist/agents/adapters/base.js.map +1 -0
- package/dist/agents/adapters/claude-code.d.ts +14 -0
- package/dist/agents/adapters/claude-code.d.ts.map +1 -0
- package/dist/agents/adapters/claude-code.js +120 -0
- package/dist/agents/adapters/claude-code.js.map +1 -0
- package/dist/agents/adapters/copilot.d.ts +13 -0
- package/dist/agents/adapters/copilot.d.ts.map +1 -0
- package/dist/agents/adapters/copilot.js +115 -0
- package/dist/agents/adapters/copilot.js.map +1 -0
- package/dist/agents/adapters/cursor.d.ts +13 -0
- package/dist/agents/adapters/cursor.d.ts.map +1 -0
- package/dist/agents/adapters/cursor.js +105 -0
- package/dist/agents/adapters/cursor.js.map +1 -0
- package/dist/agents/adapters/gemini-cli.d.ts +13 -0
- package/dist/agents/adapters/gemini-cli.d.ts.map +1 -0
- package/dist/agents/adapters/gemini-cli.js +79 -0
- package/dist/agents/adapters/gemini-cli.js.map +1 -0
- package/dist/agents/adapters/index.d.ts +16 -0
- package/dist/agents/adapters/index.d.ts.map +1 -0
- package/dist/agents/adapters/index.js +47 -0
- package/dist/agents/adapters/index.js.map +1 -0
- package/dist/agents/adapters/opencode.d.ts +13 -0
- package/dist/agents/adapters/opencode.d.ts.map +1 -0
- package/dist/agents/adapters/opencode.js +67 -0
- package/dist/agents/adapters/opencode.js.map +1 -0
- package/dist/agents/index.d.ts +8 -0
- package/dist/agents/index.d.ts.map +1 -0
- package/dist/agents/index.js +9 -0
- package/dist/agents/index.js.map +1 -0
- package/dist/agents/registry.d.ts +70 -0
- package/dist/agents/registry.d.ts.map +1 -0
- package/dist/agents/registry.js +194 -0
- package/dist/agents/registry.js.map +1 -0
- package/dist/agents/types.d.ts +71 -0
- package/dist/agents/types.d.ts.map +1 -0
- package/dist/agents/types.js +6 -0
- package/dist/agents/types.js.map +1 -0
- package/dist/delta/merger.d.ts +36 -0
- package/dist/delta/merger.d.ts.map +1 -0
- package/dist/delta/merger.js +264 -0
- package/dist/delta/merger.js.map +1 -0
- package/dist/delta/parser.d.ts +27 -0
- package/dist/delta/parser.d.ts.map +1 -0
- package/dist/delta/parser.js +196 -0
- package/dist/delta/parser.js.map +1 -0
- package/dist/delta/types.d.ts +39 -0
- package/dist/delta/types.d.ts.map +1 -0
- package/dist/delta/types.js +6 -0
- package/dist/delta/types.js.map +1 -0
- package/dist/ears/index.d.ts +11 -0
- package/dist/ears/index.d.ts.map +1 -0
- package/dist/ears/index.js +11 -0
- package/dist/ears/index.js.map +1 -0
- package/dist/ears/parser.d.ts +22 -0
- package/dist/ears/parser.d.ts.map +1 -0
- package/dist/ears/parser.js +273 -0
- package/dist/ears/parser.js.map +1 -0
- package/dist/ears/template.d.ts +20 -0
- package/dist/ears/template.d.ts.map +1 -0
- package/dist/ears/template.js +364 -0
- package/dist/ears/template.js.map +1 -0
- package/dist/ears/types.d.ts +58 -0
- package/dist/ears/types.d.ts.map +1 -0
- package/dist/ears/types.js +6 -0
- package/dist/ears/types.js.map +1 -0
- package/dist/ears/validator.d.ts +37 -0
- package/dist/ears/validator.d.ts.map +1 -0
- package/dist/ears/validator.js +234 -0
- package/dist/ears/validator.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -1
- package/dist/templates/delta-template.d.ts +18 -0
- package/dist/templates/delta-template.d.ts.map +1 -0
- package/dist/templates/delta-template.js +191 -0
- package/dist/templates/delta-template.js.map +1 -0
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EARS Parser
|
|
3
|
+
* Detects and parses Easy Approach to Requirements Syntax patterns
|
|
4
|
+
*/
|
|
5
|
+
import type { EARSRequirement } from './types.js';
|
|
6
|
+
/**
|
|
7
|
+
* Parse a requirement text and extract EARS structure
|
|
8
|
+
*/
|
|
9
|
+
export declare function parseEARSRequirement(text: string): EARSRequirement;
|
|
10
|
+
/**
|
|
11
|
+
* Check if a requirement text contains any EARS keywords
|
|
12
|
+
*
|
|
13
|
+
* Note: This is a permissive heuristic designed to detect potential EARS patterns.
|
|
14
|
+
* It may produce false positives and should be used as an initial filter rather than
|
|
15
|
+
* a strict validator.
|
|
16
|
+
*/
|
|
17
|
+
export declare function hasEARSKeywords(text: string): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Extract all "system shall" statements from a text block
|
|
20
|
+
*/
|
|
21
|
+
export declare function extractRequirements(text: string): string[];
|
|
22
|
+
//# sourceMappingURL=parser.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../../src/ears/parser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,eAAe,EAAY,MAAM,YAAY,CAAC;AAO5D;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,eAAe,CAgDlE;AAuND;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAGrD;AAED;;GAEG;AACH,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAgB1D"}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EARS Parser
|
|
3
|
+
* Detects and parses Easy Approach to Requirements Syntax patterns
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Common subject pattern for EARS requirements
|
|
7
|
+
*/
|
|
8
|
+
const SUBJECT_PATTERN = '(?:system|application|service|software|product)';
|
|
9
|
+
/**
|
|
10
|
+
* Parse a requirement text and extract EARS structure
|
|
11
|
+
*/
|
|
12
|
+
export function parseEARSRequirement(text) {
|
|
13
|
+
const normalized = text.trim();
|
|
14
|
+
// Try to match each EARS pattern in order of specificity
|
|
15
|
+
// 1. Complex (combination of patterns)
|
|
16
|
+
const complexMatch = matchComplex(normalized);
|
|
17
|
+
if (complexMatch) {
|
|
18
|
+
return complexMatch;
|
|
19
|
+
}
|
|
20
|
+
// 2. Unwanted behavior: "If [unwanted], then the system shall [action]"
|
|
21
|
+
const unwantedMatch = matchUnwanted(normalized);
|
|
22
|
+
if (unwantedMatch) {
|
|
23
|
+
return unwantedMatch;
|
|
24
|
+
}
|
|
25
|
+
// 3. Event-driven: "When [event], the system shall [action]"
|
|
26
|
+
const eventMatch = matchEvent(normalized);
|
|
27
|
+
if (eventMatch) {
|
|
28
|
+
return eventMatch;
|
|
29
|
+
}
|
|
30
|
+
// 4. State-driven: "While [state], the system shall [action]"
|
|
31
|
+
const stateMatch = matchState(normalized);
|
|
32
|
+
if (stateMatch) {
|
|
33
|
+
return stateMatch;
|
|
34
|
+
}
|
|
35
|
+
// 5. Optional: "Where [condition], the system shall [action]"
|
|
36
|
+
const optionalMatch = matchOptional(normalized);
|
|
37
|
+
if (optionalMatch) {
|
|
38
|
+
return optionalMatch;
|
|
39
|
+
}
|
|
40
|
+
// 6. Ubiquitous: "The system shall [action]"
|
|
41
|
+
const ubiquitousMatch = matchUbiquitous(normalized);
|
|
42
|
+
if (ubiquitousMatch) {
|
|
43
|
+
return ubiquitousMatch;
|
|
44
|
+
}
|
|
45
|
+
// Unknown pattern
|
|
46
|
+
return {
|
|
47
|
+
text: normalized,
|
|
48
|
+
type: 'unknown',
|
|
49
|
+
action: normalized,
|
|
50
|
+
confidence: 0
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Match ubiquitous pattern: "The system shall [action]"
|
|
55
|
+
*/
|
|
56
|
+
function matchUbiquitous(text) {
|
|
57
|
+
const patterns = [
|
|
58
|
+
new RegExp(`^(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
|
|
59
|
+
];
|
|
60
|
+
for (const pattern of patterns) {
|
|
61
|
+
const match = text.match(pattern);
|
|
62
|
+
if (match) {
|
|
63
|
+
return {
|
|
64
|
+
text,
|
|
65
|
+
type: 'ubiquitous',
|
|
66
|
+
action: match[1].trim(),
|
|
67
|
+
confidence: 0.9
|
|
68
|
+
};
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Match event-driven pattern: "When [event], the system shall [action]"
|
|
75
|
+
*/
|
|
76
|
+
function matchEvent(text) {
|
|
77
|
+
const patterns = [
|
|
78
|
+
new RegExp(`^when\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
|
|
79
|
+
new RegExp(`^(?:upon|on)\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
|
|
80
|
+
];
|
|
81
|
+
for (const pattern of patterns) {
|
|
82
|
+
const match = text.match(pattern);
|
|
83
|
+
if (match) {
|
|
84
|
+
return {
|
|
85
|
+
text,
|
|
86
|
+
type: 'event',
|
|
87
|
+
event: match[1].trim(),
|
|
88
|
+
action: match[2].trim(),
|
|
89
|
+
confidence: 0.95
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
/**
|
|
96
|
+
* Match state-driven pattern: "While [state], the system shall [action]"
|
|
97
|
+
*/
|
|
98
|
+
function matchState(text) {
|
|
99
|
+
const patterns = [
|
|
100
|
+
new RegExp(`^while\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
|
|
101
|
+
new RegExp(`^(?:during|throughout)\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
|
|
102
|
+
new RegExp(`^as long as\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
|
|
103
|
+
];
|
|
104
|
+
for (const pattern of patterns) {
|
|
105
|
+
const match = text.match(pattern);
|
|
106
|
+
if (match) {
|
|
107
|
+
return {
|
|
108
|
+
text,
|
|
109
|
+
type: 'state',
|
|
110
|
+
state: match[1].trim(),
|
|
111
|
+
action: match[2].trim(),
|
|
112
|
+
confidence: 0.95
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
/**
|
|
119
|
+
* Match optional pattern: "Where [condition], the system shall [action]"
|
|
120
|
+
*/
|
|
121
|
+
function matchOptional(text) {
|
|
122
|
+
const patterns = [
|
|
123
|
+
new RegExp(`^where\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
|
|
124
|
+
new RegExp(`^in case(?:s)?\\s+(?:where\\s+)?(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
|
|
125
|
+
];
|
|
126
|
+
for (const pattern of patterns) {
|
|
127
|
+
const match = text.match(pattern);
|
|
128
|
+
if (match) {
|
|
129
|
+
return {
|
|
130
|
+
text,
|
|
131
|
+
type: 'optional',
|
|
132
|
+
condition: match[1].trim(),
|
|
133
|
+
action: match[2].trim(),
|
|
134
|
+
confidence: 0.95
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Match unwanted behavior pattern: "If [unwanted], then the system shall [action]"
|
|
142
|
+
*/
|
|
143
|
+
function matchUnwanted(text) {
|
|
144
|
+
const patterns = [
|
|
145
|
+
new RegExp(`^if\\s+(.+?),\\s*then\\s+(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i'),
|
|
146
|
+
new RegExp(`^(?:in the event that|should)\\s+(.+?),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i')
|
|
147
|
+
];
|
|
148
|
+
for (const pattern of patterns) {
|
|
149
|
+
const match = text.match(pattern);
|
|
150
|
+
if (match) {
|
|
151
|
+
return {
|
|
152
|
+
text,
|
|
153
|
+
type: 'unwanted',
|
|
154
|
+
unwantedCondition: match[1].trim(),
|
|
155
|
+
action: match[2].trim(),
|
|
156
|
+
confidence: 0.95
|
|
157
|
+
};
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
return null;
|
|
161
|
+
}
|
|
162
|
+
/**
|
|
163
|
+
* Match complex pattern: combination of triggers
|
|
164
|
+
* Example: "When [event], while [state], the system shall [action]"
|
|
165
|
+
*/
|
|
166
|
+
function matchComplex(text) {
|
|
167
|
+
const complexPattern = new RegExp(`^((?:when|while|where|if).+?(?:,\\s*(?:and|while|where|when)\\s+.+?)*),\\s*(?:the\\s+)?${SUBJECT_PATTERN}\\s+(?:shall|must|will)\\s+(.+)$`, 'i');
|
|
168
|
+
const match = text.match(complexPattern);
|
|
169
|
+
if (!match) {
|
|
170
|
+
return null;
|
|
171
|
+
}
|
|
172
|
+
const triggersText = match[1].trim();
|
|
173
|
+
const action = match[2].trim();
|
|
174
|
+
// Parse individual triggers
|
|
175
|
+
const conditions = [];
|
|
176
|
+
// Split by "and", "while", "where", "when", "if" (keeping the keyword)
|
|
177
|
+
const triggerParts = triggersText.split(/,?\s+(and|while|where|when|if)\s+/i);
|
|
178
|
+
let currentKeyword = '';
|
|
179
|
+
let lastKeywordType = null;
|
|
180
|
+
for (let i = 0; i < triggerParts.length; i++) {
|
|
181
|
+
const part = triggerParts[i].trim();
|
|
182
|
+
if (/^(and|while|where|when|if)$/i.test(part)) {
|
|
183
|
+
const keyword = part.toLowerCase();
|
|
184
|
+
// 'and' continues with the previous keyword type
|
|
185
|
+
if (keyword !== 'and') {
|
|
186
|
+
currentKeyword = keyword;
|
|
187
|
+
}
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
// First part might not have a keyword if it starts with one
|
|
191
|
+
if (i === 0) {
|
|
192
|
+
if (/^if\s+/i.test(part)) {
|
|
193
|
+
conditions.push({ type: 'optional', value: part.replace(/^if\s+/i, '').trim() });
|
|
194
|
+
lastKeywordType = 'optional';
|
|
195
|
+
}
|
|
196
|
+
else if (/^when\s+/i.test(part)) {
|
|
197
|
+
conditions.push({ type: 'event', value: part.replace(/^when\s+/i, '').trim() });
|
|
198
|
+
lastKeywordType = 'event';
|
|
199
|
+
}
|
|
200
|
+
else if (/^while\s+/i.test(part)) {
|
|
201
|
+
conditions.push({ type: 'state', value: part.replace(/^while\s+/i, '').trim() });
|
|
202
|
+
lastKeywordType = 'state';
|
|
203
|
+
}
|
|
204
|
+
else if (/^where\s+/i.test(part)) {
|
|
205
|
+
conditions.push({ type: 'optional', value: part.replace(/^where\s+/i, '').trim() });
|
|
206
|
+
lastKeywordType = 'optional';
|
|
207
|
+
}
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
210
|
+
// Use the current keyword (or last type if 'and')
|
|
211
|
+
let conditionType = null;
|
|
212
|
+
if (currentKeyword === 'if') {
|
|
213
|
+
conditionType = 'optional';
|
|
214
|
+
}
|
|
215
|
+
else if (currentKeyword === 'when') {
|
|
216
|
+
conditionType = 'event';
|
|
217
|
+
}
|
|
218
|
+
else if (currentKeyword === 'while') {
|
|
219
|
+
conditionType = 'state';
|
|
220
|
+
}
|
|
221
|
+
else if (currentKeyword === 'where') {
|
|
222
|
+
conditionType = 'optional';
|
|
223
|
+
}
|
|
224
|
+
else if (currentKeyword === '' && lastKeywordType) {
|
|
225
|
+
// Handle 'and' by using last keyword type
|
|
226
|
+
conditionType = lastKeywordType;
|
|
227
|
+
}
|
|
228
|
+
if (conditionType) {
|
|
229
|
+
conditions.push({ type: conditionType, value: part });
|
|
230
|
+
lastKeywordType = conditionType;
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
// Only consider complex if we have more than one condition
|
|
235
|
+
if (conditions.length < 2) {
|
|
236
|
+
return null;
|
|
237
|
+
}
|
|
238
|
+
return {
|
|
239
|
+
text,
|
|
240
|
+
type: 'complex',
|
|
241
|
+
action,
|
|
242
|
+
conditions,
|
|
243
|
+
confidence: 0.85
|
|
244
|
+
};
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Check if a requirement text contains any EARS keywords
|
|
248
|
+
*
|
|
249
|
+
* Note: This is a permissive heuristic designed to detect potential EARS patterns.
|
|
250
|
+
* It may produce false positives and should be used as an initial filter rather than
|
|
251
|
+
* a strict validator.
|
|
252
|
+
*/
|
|
253
|
+
export function hasEARSKeywords(text) {
|
|
254
|
+
const keywords = /\b(when|while|where|if\s+.+\s+then|system\s+shall|shall|must|will)\b/i;
|
|
255
|
+
return keywords.test(text);
|
|
256
|
+
}
|
|
257
|
+
/**
|
|
258
|
+
* Extract all "system shall" statements from a text block
|
|
259
|
+
*/
|
|
260
|
+
export function extractRequirements(text) {
|
|
261
|
+
const lines = text.split('\n');
|
|
262
|
+
const requirements = [];
|
|
263
|
+
for (const line of lines) {
|
|
264
|
+
const trimmed = line.trim();
|
|
265
|
+
// Look for lines that look like requirements (must have EARS action clause)
|
|
266
|
+
if (trimmed && /(?:shall|must|will)/i.test(trimmed) && (/(?:system|application|service)/i.test(trimmed) ||
|
|
267
|
+
/(?:when|while|where|if)\s+/i.test(trimmed))) {
|
|
268
|
+
requirements.push(trimmed.replace(/^[-*•]\s*/, '')); // Remove bullet points
|
|
269
|
+
}
|
|
270
|
+
}
|
|
271
|
+
return requirements;
|
|
272
|
+
}
|
|
273
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../../src/ears/parser.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* EARS Template Generator
|
|
3
|
+
* Creates spec templates with EARS requirement format
|
|
4
|
+
*/
|
|
5
|
+
/**
|
|
6
|
+
* Generate an EARS-formatted spec template
|
|
7
|
+
*/
|
|
8
|
+
export declare function generateEARSTemplate(id: string, name: string, author: string, priority?: 'P0' | 'P1' | 'P2'): string;
|
|
9
|
+
/**
|
|
10
|
+
* Generate EARS examples for a specific domain
|
|
11
|
+
*/
|
|
12
|
+
export declare function generateEARSExamples(domain: 'web' | 'mobile' | 'api' | 'embedded'): {
|
|
13
|
+
ubiquitous: string[];
|
|
14
|
+
event: string[];
|
|
15
|
+
state: string[];
|
|
16
|
+
optional: string[];
|
|
17
|
+
unwanted: string[];
|
|
18
|
+
complex: string[];
|
|
19
|
+
};
|
|
20
|
+
//# sourceMappingURL=template.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"template.d.ts","sourceRoot":"","sources":["../../src/ears/template.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH;;GAEG;AACH,wBAAgB,oBAAoB,CAClC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,MAAM,EACZ,MAAM,EAAE,MAAM,EACd,QAAQ,GAAE,IAAI,GAAG,IAAI,GAAG,IAAW,GAClC,MAAM,CAgOR;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,KAAK,GAAG,QAAQ,GAAG,KAAK,GAAG,UAAU,GAAG;IACnF,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,KAAK,EAAE,MAAM,EAAE,CAAC;IAChB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAiIA"}
|