@pipobscure/vcard 0.0.1
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/LICENSE +190 -0
- package/README.md +1079 -0
- package/dist/escape.d.ts +59 -0
- package/dist/escape.d.ts.map +1 -0
- package/dist/escape.js +136 -0
- package/dist/escape.js.map +1 -0
- package/dist/generator.d.ts +49 -0
- package/dist/generator.d.ts.map +1 -0
- package/dist/generator.js +194 -0
- package/dist/generator.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +85 -0
- package/dist/index.js.map +1 -0
- package/dist/parser.d.ts +54 -0
- package/dist/parser.d.ts.map +1 -0
- package/dist/parser.js +381 -0
- package/dist/parser.js.map +1 -0
- package/dist/property.d.ts +347 -0
- package/dist/property.d.ts.map +1 -0
- package/dist/property.js +854 -0
- package/dist/property.js.map +1 -0
- package/dist/tests/edgecases.test.d.ts +10 -0
- package/dist/tests/edgecases.test.d.ts.map +1 -0
- package/dist/tests/edgecases.test.js +950 -0
- package/dist/tests/edgecases.test.js.map +1 -0
- package/dist/tests/vcard.test.d.ts +6 -0
- package/dist/tests/vcard.test.d.ts.map +1 -0
- package/dist/tests/vcard.test.js +496 -0
- package/dist/tests/vcard.test.js.map +1 -0
- package/dist/types.d.ts +94 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +5 -0
- package/dist/types.js.map +1 -0
- package/dist/vcard.d.ts +177 -0
- package/dist/vcard.d.ts.map +1 -0
- package/dist/vcard.js +424 -0
- package/dist/vcard.js.map +1 -0
- package/package.json +39 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAgB,WAAW,EAAE,MAAM,YAAY,CAAC;AAE5D,OAAO,EACL,QAAQ,EAsCT,MAAM,eAAe,CAAC;AAIvB,MAAM,WAAW,YAAY;IAC3B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAID;;;;GAIG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAQnD;AAoFD;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE,MAAM,EACZ,QAAQ,EAAE,YAAY,EAAE,GACvB,WAAW,GAAG,IAAI,CA6CpB;AA2CD;;;GAGG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,WAAW,EAChB,QAAQ,EAAE,YAAY,EAAE,GACvB,QAAQ,CA0IV;AAID,uDAAuD;AACvD,MAAM,WAAW,QAAQ;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,QAAQ,EAAE,CAAC;IACvB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAwCD,mCAAmC;AACnC,MAAM,WAAW,WAAW;IAC1B,SAAS,EAAE,QAAQ,EAAE,CAAC;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAC;CAC1B;AAED;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG,WAAW,CA8CzD"}
|
package/dist/parser.js
ADDED
|
@@ -0,0 +1,381 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* vCard v4 parser — RFC 6350
|
|
3
|
+
*
|
|
4
|
+
* Design goals:
|
|
5
|
+
* - Tolerant: accept malformed input, mixed line endings, v3 quirks
|
|
6
|
+
* - Non-throwing: collect parse warnings, never discard data
|
|
7
|
+
* - Preserve unknown properties verbatim for round-tripping
|
|
8
|
+
*/
|
|
9
|
+
import { unquoteParamValue } from './escape.js';
|
|
10
|
+
import { UnknownProperty, FNProperty, NProperty, NicknameProperty, PhotoProperty, BDayProperty, AnniversaryProperty, GenderProperty, AdrProperty, TelProperty, EmailProperty, IMPPProperty, LangProperty, TZProperty, GeoProperty, TitleProperty, RoleProperty, LogoProperty, OrgProperty, MemberProperty, RelatedProperty, CategoriesProperty, NoteProperty, ProdIDProperty, RevProperty, SoundProperty, UIDProperty, ClientPidMapProperty, URLProperty, KeyProperty, FBURLProperty, CALADRURIProperty, CALURIProperty, KindProperty, XMLProperty, SourceProperty, } from './property.js';
|
|
11
|
+
// ── Line unfolding ─────────────────────────────────────────────────────────
|
|
12
|
+
/**
|
|
13
|
+
* Unfold content lines per RFC 6350 §3.2.
|
|
14
|
+
* Any CRLF or LF immediately followed by a space or tab is removed.
|
|
15
|
+
* Tolerates LF-only line endings.
|
|
16
|
+
*/
|
|
17
|
+
export function unfoldLines(input) {
|
|
18
|
+
// Normalize line endings (CRLF → LF), then unfold
|
|
19
|
+
const unfolded = input
|
|
20
|
+
.replace(/\r\n/g, '\n')
|
|
21
|
+
.replace(/\r/g, '\n')
|
|
22
|
+
.replace(/\n[ \t]/g, ''); // unfold continuation lines
|
|
23
|
+
return unfolded.split('\n').filter(line => line.length > 0);
|
|
24
|
+
}
|
|
25
|
+
// ── Parameter parsing ──────────────────────────────────────────────────────
|
|
26
|
+
/**
|
|
27
|
+
* Parse parameter string into a ParameterMap.
|
|
28
|
+
* Handles:
|
|
29
|
+
* - NAME=VALUE
|
|
30
|
+
* - NAME="quoted value"
|
|
31
|
+
* - NAME=val1,val2 (multi-value)
|
|
32
|
+
* - TYPE=work;TYPE=home (duplicate → merged into array)
|
|
33
|
+
*
|
|
34
|
+
* Tolerant: silently ignores malformed params.
|
|
35
|
+
*/
|
|
36
|
+
function parseParameters(paramStr, warnings) {
|
|
37
|
+
const map = new Map();
|
|
38
|
+
if (!paramStr)
|
|
39
|
+
return map;
|
|
40
|
+
// Split on ; (not inside quotes)
|
|
41
|
+
const parts = splitParamString(paramStr);
|
|
42
|
+
for (const part of parts) {
|
|
43
|
+
if (!part.trim())
|
|
44
|
+
continue;
|
|
45
|
+
const eq = part.indexOf('=');
|
|
46
|
+
if (eq === -1) {
|
|
47
|
+
// Bare parameter name — tolerate (some v3 types like TYPE=WORK without =)
|
|
48
|
+
// Try treating as TYPE value for backwards compat
|
|
49
|
+
const upperPart = part.trim().toUpperCase();
|
|
50
|
+
if (/^[A-Z0-9-]+$/.test(upperPart)) {
|
|
51
|
+
const existing = map.get('TYPE');
|
|
52
|
+
if (existing === undefined) {
|
|
53
|
+
map.set('TYPE', upperPart.toLowerCase());
|
|
54
|
+
}
|
|
55
|
+
else if (Array.isArray(existing)) {
|
|
56
|
+
existing.push(upperPart.toLowerCase());
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
map.set('TYPE', [existing, upperPart.toLowerCase()]);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
else {
|
|
63
|
+
warnings.push({ message: `Ignoring malformed parameter: ${part}` });
|
|
64
|
+
}
|
|
65
|
+
continue;
|
|
66
|
+
}
|
|
67
|
+
const name = part.slice(0, eq).trim().toUpperCase();
|
|
68
|
+
const rawValue = part.slice(eq + 1).trim();
|
|
69
|
+
const value = unquoteParamValue(rawValue);
|
|
70
|
+
// Merge duplicate parameter names into an array
|
|
71
|
+
const existing = map.get(name);
|
|
72
|
+
if (existing === undefined) {
|
|
73
|
+
map.set(name, value);
|
|
74
|
+
}
|
|
75
|
+
else if (Array.isArray(existing)) {
|
|
76
|
+
existing.push(value);
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
map.set(name, [existing, value]);
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
return map;
|
|
83
|
+
}
|
|
84
|
+
/** Split a parameter string on `;`, skipping quoted sections */
|
|
85
|
+
function splitParamString(s) {
|
|
86
|
+
const parts = [];
|
|
87
|
+
let current = '';
|
|
88
|
+
let inQuotes = false;
|
|
89
|
+
for (let i = 0; i < s.length; i++) {
|
|
90
|
+
const ch = s[i];
|
|
91
|
+
if (ch === '"') {
|
|
92
|
+
inQuotes = !inQuotes;
|
|
93
|
+
current += ch;
|
|
94
|
+
}
|
|
95
|
+
else if (ch === ';' && !inQuotes) {
|
|
96
|
+
parts.push(current);
|
|
97
|
+
current = '';
|
|
98
|
+
}
|
|
99
|
+
else {
|
|
100
|
+
current += ch;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
if (current)
|
|
104
|
+
parts.push(current);
|
|
105
|
+
return parts;
|
|
106
|
+
}
|
|
107
|
+
// ── Content line parsing ───────────────────────────────────────────────────
|
|
108
|
+
/**
|
|
109
|
+
* Parse a single content line into a RawProperty.
|
|
110
|
+
* Returns null for BEGIN/END/VERSION lines (handled separately).
|
|
111
|
+
*
|
|
112
|
+
* Format: [group.]name[;param=value...]:value
|
|
113
|
+
*/
|
|
114
|
+
export function parseContentLine(line, warnings) {
|
|
115
|
+
// Find the first colon (not inside quotes) to split name+params from value
|
|
116
|
+
let colonIdx = -1;
|
|
117
|
+
let inQuotes = false;
|
|
118
|
+
for (let i = 0; i < line.length; i++) {
|
|
119
|
+
const ch = line[i];
|
|
120
|
+
if (ch === '"')
|
|
121
|
+
inQuotes = !inQuotes;
|
|
122
|
+
else if (ch === ':' && !inQuotes) {
|
|
123
|
+
colonIdx = i;
|
|
124
|
+
break;
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
if (colonIdx === -1) {
|
|
128
|
+
warnings.push({ message: `Skipping line with no colon: ${line.slice(0, 40)}` });
|
|
129
|
+
return null;
|
|
130
|
+
}
|
|
131
|
+
const namePart = line.slice(0, colonIdx);
|
|
132
|
+
const value = line.slice(colonIdx + 1);
|
|
133
|
+
// Split name from parameters on first `;`
|
|
134
|
+
const semiIdx = namePart.indexOf(';');
|
|
135
|
+
const nameAndGroup = semiIdx === -1 ? namePart : namePart.slice(0, semiIdx);
|
|
136
|
+
const paramStr = semiIdx === -1 ? '' : namePart.slice(semiIdx + 1);
|
|
137
|
+
// Split group from name
|
|
138
|
+
const dotIdx = nameAndGroup.indexOf('.');
|
|
139
|
+
let group;
|
|
140
|
+
let name;
|
|
141
|
+
if (dotIdx !== -1) {
|
|
142
|
+
group = nameAndGroup.slice(0, dotIdx).trim();
|
|
143
|
+
name = nameAndGroup.slice(dotIdx + 1).trim().toUpperCase();
|
|
144
|
+
}
|
|
145
|
+
else {
|
|
146
|
+
name = nameAndGroup.trim().toUpperCase();
|
|
147
|
+
}
|
|
148
|
+
if (!name) {
|
|
149
|
+
warnings.push({ message: `Skipping line with empty property name` });
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
const parameters = parseParameters(paramStr, warnings);
|
|
153
|
+
return { group, name, parameters, value };
|
|
154
|
+
}
|
|
155
|
+
// ── v3 Compatibility ──────────────────────────────────────────────────────
|
|
156
|
+
/**
|
|
157
|
+
* Handle v3/v2.1 QUOTED-PRINTABLE encoding (tolerant input).
|
|
158
|
+
* Correctly decodes multi-byte UTF-8 sequences encoded as QP hex pairs.
|
|
159
|
+
* Returns the decoded string, or the original if not encoded.
|
|
160
|
+
*/
|
|
161
|
+
function decodeQuotedPrintable(encoded) {
|
|
162
|
+
// Remove soft line breaks first (= followed by CRLF or LF)
|
|
163
|
+
const noSoftBreaks = encoded.replace(/=\r?\n/g, '');
|
|
164
|
+
// Collect raw bytes, then decode as UTF-8 via Buffer
|
|
165
|
+
const bytes = [];
|
|
166
|
+
let i = 0;
|
|
167
|
+
while (i < noSoftBreaks.length) {
|
|
168
|
+
const ch = noSoftBreaks[i];
|
|
169
|
+
if (ch === '=' && i + 2 < noSoftBreaks.length) {
|
|
170
|
+
const hex = noSoftBreaks.slice(i + 1, i + 3);
|
|
171
|
+
if (/^[0-9A-Fa-f]{2}$/.test(hex)) {
|
|
172
|
+
bytes.push(parseInt(hex, 16));
|
|
173
|
+
i += 3;
|
|
174
|
+
continue;
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
// Plain ASCII character
|
|
178
|
+
const code = ch.charCodeAt(0);
|
|
179
|
+
if (code < 128) {
|
|
180
|
+
bytes.push(code);
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
// Non-ASCII character in the encoded stream — encode as UTF-8 bytes
|
|
184
|
+
const buf = Buffer.from(ch, 'utf8');
|
|
185
|
+
for (const b of buf)
|
|
186
|
+
bytes.push(b);
|
|
187
|
+
}
|
|
188
|
+
i++;
|
|
189
|
+
}
|
|
190
|
+
return Buffer.from(bytes).toString('utf8');
|
|
191
|
+
}
|
|
192
|
+
// ── Property instantiation ─────────────────────────────────────────────────
|
|
193
|
+
/**
|
|
194
|
+
* Convert a RawProperty to a typed Property instance.
|
|
195
|
+
* Unknown properties become UnknownProperty instances.
|
|
196
|
+
*/
|
|
197
|
+
export function instantiateProperty(raw, warnings) {
|
|
198
|
+
const { name, value, parameters, group } = raw;
|
|
199
|
+
// Decode QUOTED-PRINTABLE for v3 tolerance
|
|
200
|
+
let v = value;
|
|
201
|
+
const encoding = parameters.get('ENCODING');
|
|
202
|
+
if (encoding === 'QUOTED-PRINTABLE' || encoding === 'quoted-printable') {
|
|
203
|
+
v = decodeQuotedPrintable(v);
|
|
204
|
+
parameters.delete('ENCODING');
|
|
205
|
+
}
|
|
206
|
+
// Map property name to typed class
|
|
207
|
+
switch (name) {
|
|
208
|
+
case 'FN':
|
|
209
|
+
return new FNProperty(unescapeTextValue(v), parameters, group);
|
|
210
|
+
case 'N':
|
|
211
|
+
return NProperty.fromText(v, parameters, group);
|
|
212
|
+
case 'NICKNAME':
|
|
213
|
+
return new NicknameProperty(parseTextList(v), parameters, group);
|
|
214
|
+
case 'PHOTO':
|
|
215
|
+
return new PhotoProperty(v, parameters, group);
|
|
216
|
+
case 'BDAY':
|
|
217
|
+
return BDayProperty.fromText(v, parameters, group);
|
|
218
|
+
case 'ANNIVERSARY':
|
|
219
|
+
return AnniversaryProperty.fromText(v, parameters, group);
|
|
220
|
+
case 'GENDER':
|
|
221
|
+
return GenderProperty.fromText(v, parameters, group);
|
|
222
|
+
case 'ADR':
|
|
223
|
+
return AdrProperty.fromText(v, parameters, group);
|
|
224
|
+
case 'TEL':
|
|
225
|
+
return new TelProperty(v, parameters, group);
|
|
226
|
+
case 'EMAIL':
|
|
227
|
+
return new EmailProperty(unescapeTextValue(v), parameters, group);
|
|
228
|
+
case 'IMPP':
|
|
229
|
+
return new IMPPProperty(v, parameters, group);
|
|
230
|
+
case 'LANG':
|
|
231
|
+
return new LangProperty(v.trim(), parameters, group);
|
|
232
|
+
case 'TZ':
|
|
233
|
+
return TZProperty.fromText(v, parameters, group);
|
|
234
|
+
case 'GEO':
|
|
235
|
+
return new GeoProperty(v, parameters, group);
|
|
236
|
+
case 'TITLE':
|
|
237
|
+
return new TitleProperty(unescapeTextValue(v), parameters, group);
|
|
238
|
+
case 'ROLE':
|
|
239
|
+
return new RoleProperty(unescapeTextValue(v), parameters, group);
|
|
240
|
+
case 'LOGO':
|
|
241
|
+
return new LogoProperty(v, parameters, group);
|
|
242
|
+
case 'ORG':
|
|
243
|
+
return OrgProperty.fromText(v, parameters, group);
|
|
244
|
+
case 'MEMBER':
|
|
245
|
+
return new MemberProperty(v, parameters, group);
|
|
246
|
+
case 'RELATED':
|
|
247
|
+
return RelatedProperty.fromText(v, parameters, group);
|
|
248
|
+
case 'CATEGORIES':
|
|
249
|
+
return new CategoriesProperty(parseTextList(v), parameters, group);
|
|
250
|
+
case 'NOTE':
|
|
251
|
+
return new NoteProperty(unescapeTextValue(v), parameters, group);
|
|
252
|
+
case 'PRODID':
|
|
253
|
+
return new ProdIDProperty(unescapeTextValue(v), parameters, group);
|
|
254
|
+
case 'REV':
|
|
255
|
+
return RevProperty.fromText(v, parameters, group);
|
|
256
|
+
case 'SOUND':
|
|
257
|
+
return new SoundProperty(v, parameters, group);
|
|
258
|
+
case 'UID':
|
|
259
|
+
return new UIDProperty(v, parameters, group);
|
|
260
|
+
case 'CLIENTPIDMAP':
|
|
261
|
+
return ClientPidMapProperty.fromText(v, parameters, group);
|
|
262
|
+
case 'URL':
|
|
263
|
+
return new URLProperty(v, parameters, group);
|
|
264
|
+
case 'KEY':
|
|
265
|
+
return KeyProperty.fromText(v, parameters, group);
|
|
266
|
+
case 'FBURL':
|
|
267
|
+
return new FBURLProperty(v, parameters, group);
|
|
268
|
+
case 'CALADRURI':
|
|
269
|
+
return new CALADRURIProperty(v, parameters, group);
|
|
270
|
+
case 'CALURI':
|
|
271
|
+
return new CALURIProperty(v, parameters, group);
|
|
272
|
+
case 'KIND':
|
|
273
|
+
return new KindProperty(unescapeTextValue(v), parameters, group);
|
|
274
|
+
case 'XML':
|
|
275
|
+
return new XMLProperty(unescapeTextValue(v), parameters, group);
|
|
276
|
+
case 'SOURCE':
|
|
277
|
+
return new SourceProperty(v, parameters, group);
|
|
278
|
+
// v3 compatibility: map to closest v4 equivalents
|
|
279
|
+
case 'LABEL':
|
|
280
|
+
// v3 ADR label — store as unknown for now
|
|
281
|
+
return new UnknownProperty('LABEL', v, parameters, group);
|
|
282
|
+
case 'MAILER':
|
|
283
|
+
case 'CLASS':
|
|
284
|
+
case 'PROFILE':
|
|
285
|
+
case 'NAME':
|
|
286
|
+
// v3 only properties — store verbatim
|
|
287
|
+
return new UnknownProperty(name, v, parameters, group);
|
|
288
|
+
default:
|
|
289
|
+
if (!name.startsWith('X-') && !name.startsWith('VND.')) {
|
|
290
|
+
warnings.push({
|
|
291
|
+
message: `Unknown property: ${name} — stored verbatim`,
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
return new UnknownProperty(name, v, parameters, group);
|
|
295
|
+
}
|
|
296
|
+
}
|
|
297
|
+
/**
|
|
298
|
+
* Parse a sequence of unfolded content lines forming a single vCard.
|
|
299
|
+
* Assumes BEGIN:VCARD and END:VCARD have already been identified.
|
|
300
|
+
*/
|
|
301
|
+
function parseVCardBlock(lines, warnings) {
|
|
302
|
+
let version = '4.0';
|
|
303
|
+
const properties = [];
|
|
304
|
+
for (let i = 0; i < lines.length; i++) {
|
|
305
|
+
const line = lines[i];
|
|
306
|
+
const upper = line.toUpperCase();
|
|
307
|
+
if (upper.startsWith('VERSION:')) {
|
|
308
|
+
version = line.slice(8).trim();
|
|
309
|
+
continue;
|
|
310
|
+
}
|
|
311
|
+
const raw = parseContentLine(line, warnings);
|
|
312
|
+
if (!raw)
|
|
313
|
+
continue;
|
|
314
|
+
// Skip VERSION again in case it has params
|
|
315
|
+
if (raw.name === 'VERSION') {
|
|
316
|
+
version = raw.value.trim();
|
|
317
|
+
continue;
|
|
318
|
+
}
|
|
319
|
+
const prop = instantiateProperty(raw, warnings);
|
|
320
|
+
properties.push(prop);
|
|
321
|
+
}
|
|
322
|
+
return { version, properties, warnings };
|
|
323
|
+
}
|
|
324
|
+
/**
|
|
325
|
+
* Parse vCard text into raw vCard blocks.
|
|
326
|
+
* Tolerates:
|
|
327
|
+
* - Multiple vCards in one string
|
|
328
|
+
* - CRLF or LF line endings
|
|
329
|
+
* - Missing VERSION
|
|
330
|
+
* - Unknown properties
|
|
331
|
+
* - v3 syntax
|
|
332
|
+
*/
|
|
333
|
+
export function parseVCardText(input) {
|
|
334
|
+
const warnings = [];
|
|
335
|
+
const rawVCards = [];
|
|
336
|
+
const lines = unfoldLines(input);
|
|
337
|
+
let inVCard = false;
|
|
338
|
+
let currentLines = [];
|
|
339
|
+
for (let i = 0; i < lines.length; i++) {
|
|
340
|
+
const line = lines[i];
|
|
341
|
+
const upper = line.toUpperCase().trim();
|
|
342
|
+
if (upper === 'BEGIN:VCARD') {
|
|
343
|
+
inVCard = true;
|
|
344
|
+
currentLines = [];
|
|
345
|
+
continue;
|
|
346
|
+
}
|
|
347
|
+
if (upper === 'END:VCARD') {
|
|
348
|
+
if (!inVCard) {
|
|
349
|
+
warnings.push({ line: i + 1, message: 'Unexpected END:VCARD without BEGIN:VCARD' });
|
|
350
|
+
continue;
|
|
351
|
+
}
|
|
352
|
+
inVCard = false;
|
|
353
|
+
const cardWarnings = [];
|
|
354
|
+
rawVCards.push(parseVCardBlock(currentLines, cardWarnings));
|
|
355
|
+
warnings.push(...cardWarnings);
|
|
356
|
+
currentLines = [];
|
|
357
|
+
continue;
|
|
358
|
+
}
|
|
359
|
+
if (inVCard) {
|
|
360
|
+
currentLines.push(line);
|
|
361
|
+
}
|
|
362
|
+
// Lines outside BEGIN/END are silently ignored (tolerant)
|
|
363
|
+
}
|
|
364
|
+
if (inVCard) {
|
|
365
|
+
// Unclosed vCard — parse what we have
|
|
366
|
+
const cardWarnings = [];
|
|
367
|
+
cardWarnings.push({ message: 'Unclosed vCard (missing END:VCARD) — parsing anyway' });
|
|
368
|
+
rawVCards.push(parseVCardBlock(currentLines, cardWarnings));
|
|
369
|
+
warnings.push(...cardWarnings);
|
|
370
|
+
}
|
|
371
|
+
return { rawVCards, warnings };
|
|
372
|
+
}
|
|
373
|
+
// ── Helpers ────────────────────────────────────────────────────────────────
|
|
374
|
+
import { parseList, unescapeText } from './escape.js';
|
|
375
|
+
function unescapeTextValue(v) {
|
|
376
|
+
return unescapeText(v);
|
|
377
|
+
}
|
|
378
|
+
function parseTextList(v) {
|
|
379
|
+
return parseList(v);
|
|
380
|
+
}
|
|
381
|
+
//# sourceMappingURL=parser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAGH,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAChD,OAAO,EAEL,eAAe,EACf,UAAU,EACV,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,cAAc,EACd,WAAW,EACX,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,UAAU,EACV,WAAW,EACX,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,cAAc,EACd,eAAe,EACf,kBAAkB,EAClB,YAAY,EACZ,cAAc,EACd,WAAW,EACX,aAAa,EACb,WAAW,EACX,oBAAoB,EACpB,WAAW,EACX,WAAW,EACX,aAAa,EACb,iBAAiB,EACjB,cAAc,EACd,YAAY,EACZ,WAAW,EACX,cAAc,GAEf,MAAM,eAAe,CAAC;AASvB,8EAA8E;AAE9E;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,KAAa;IACvC,kDAAkD;IAClD,MAAM,QAAQ,GAAG,KAAK;SACnB,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;SACtB,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC;SACpB,OAAO,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,CAAC,4BAA4B;IAExD,OAAO,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;AAC9D,CAAC;AAED,8EAA8E;AAE9E;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,QAAgB,EAAE,QAAwB;IACjE,MAAM,GAAG,GAAiB,IAAI,GAAG,EAAE,CAAC;IACpC,IAAI,CAAC,QAAQ;QAAE,OAAO,GAAG,CAAC;IAE1B,iCAAiC;IACjC,MAAM,KAAK,GAAG,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAEzC,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YAAE,SAAS;QAC3B,MAAM,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAC7B,IAAI,EAAE,KAAK,CAAC,CAAC,EAAE,CAAC;YACd,0EAA0E;YAC1E,kDAAkD;YAClD,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC5C,IAAI,cAAc,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,CAAC;gBACnC,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;gBACjC,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;oBAC3B,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBAC3C,CAAC;qBAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;oBACnC,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC;gBACzC,CAAC;qBAAM,CAAC;oBACN,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,SAAS,CAAC,WAAW,EAAE,CAAC,CAAC,CAAC;gBACvD,CAAC;YACH,CAAC;iBAAM,CAAC;gBACN,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,iCAAiC,IAAI,EAAE,EAAE,CAAC,CAAC;YACtE,CAAC;YACD,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;QACpD,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;QAE1C,gDAAgD;QAChD,MAAM,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QAC/B,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;YAC3B,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACnC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvB,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC,CAAC;QACnC,CAAC;IACH,CAAC;IAED,OAAO,GAAG,CAAC;AACb,CAAC;AAED,gEAAgE;AAChE,SAAS,gBAAgB,CAAC,CAAS;IACjC,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,OAAO,GAAG,EAAE,CAAC;IACjB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAClC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAE,CAAC;QACjB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YACf,QAAQ,GAAG,CAAC,QAAQ,CAAC;YACrB,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;aAAM,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACnC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YACpB,OAAO,GAAG,EAAE,CAAC;QACf,CAAC;aAAM,CAAC;YACN,OAAO,IAAI,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IACD,IAAI,OAAO;QAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACjC,OAAO,KAAK,CAAC;AACf,CAAC;AAED,8EAA8E;AAE9E;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAC9B,IAAY,EACZ,QAAwB;IAExB,2EAA2E;IAC3E,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;IAClB,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACrC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAE,CAAC;QACpB,IAAI,EAAE,KAAK,GAAG;YAAE,QAAQ,GAAG,CAAC,QAAQ,CAAC;aAChC,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;YACjC,QAAQ,GAAG,CAAC,CAAC;YACb,MAAM;QACR,CAAC;IACH,CAAC;IAED,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QACpB,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,gCAAgC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC;QAChF,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACzC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC;IAEvC,0CAA0C;IAC1C,MAAM,OAAO,GAAG,QAAQ,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,YAAY,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,CAAC;IAC5E,MAAM,QAAQ,GAAG,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC;IAEnE,wBAAwB;IACxB,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IACzC,IAAI,KAAyB,CAAC;IAC9B,IAAI,IAAY,CAAC;IACjB,IAAI,MAAM,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,KAAK,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;QAC7C,IAAI,GAAG,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC7D,CAAC;SAAM,CAAC;QACN,IAAI,GAAG,YAAY,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,wCAAwC,EAAE,CAAC,CAAC;QACrE,OAAO,IAAI,CAAC;IACd,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEvD,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC;AAC5C,CAAC;AAED,6EAA6E;AAE7E;;;;GAIG;AACH,SAAS,qBAAqB,CAAC,OAAe;IAC5C,2DAA2D;IAC3D,MAAM,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;IAEpD,qDAAqD;IACrD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,OAAO,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;QAC/B,MAAM,EAAE,GAAG,YAAY,CAAC,CAAC,CAAE,CAAC;QAC5B,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC,MAAM,EAAE,CAAC;YAC9C,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAC7C,IAAI,kBAAkB,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;gBACjC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;gBAC9B,CAAC,IAAI,CAAC,CAAC;gBACP,SAAS;YACX,CAAC;QACH,CAAC;QACD,wBAAwB;QACxB,MAAM,IAAI,GAAG,EAAE,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC;QAC9B,IAAI,IAAI,GAAG,GAAG,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,MAAM,CAAC,CAAC;YACpC,KAAK,MAAM,CAAC,IAAI,GAAG;gBAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC;QACD,CAAC,EAAE,CAAC;IACN,CAAC;IAED,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAC7C,CAAC;AAED,8EAA8E;AAE9E;;;GAGG;AACH,MAAM,UAAU,mBAAmB,CACjC,GAAgB,EAChB,QAAwB;IAExB,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,UAAU,EAAE,KAAK,EAAE,GAAG,GAAG,CAAC;IAE/C,2CAA2C;IAC3C,IAAI,CAAC,GAAG,KAAK,CAAC;IACd,MAAM,QAAQ,GAAG,UAAU,CAAC,GAAG,CAAC,UAAU,CAAC,CAAC;IAC5C,IAAI,QAAQ,KAAK,kBAAkB,IAAI,QAAQ,KAAK,kBAAkB,EAAE,CAAC;QACvE,CAAC,GAAG,qBAAqB,CAAC,CAAC,CAAC,CAAC;QAC7B,UAAU,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IAChC,CAAC;IAED,mCAAmC;IACnC,QAAQ,IAAI,EAAE,CAAC;QACb,KAAK,IAAI;YACP,OAAO,IAAI,UAAU,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEjE,KAAK,GAAG;YACN,OAAO,SAAS,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAElD,KAAK,UAAU;YACb,OAAO,IAAI,gBAAgB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEnE,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEjD,KAAK,MAAM;YACT,OAAO,YAAY,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAErD,KAAK,aAAa;YAChB,OAAO,mBAAmB,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE5D,KAAK,QAAQ;YACX,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEvD,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEpD,KAAK,KAAK;YACR,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/C,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEpE,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEhD,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEvD,KAAK,IAAI;YACP,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEnD,KAAK,KAAK;YACR,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/C,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEpE,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEnE,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEhD,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEpD,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAElD,KAAK,SAAS;YACZ,OAAO,eAAe,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAExD,KAAK,YAAY;YACf,OAAO,IAAI,kBAAkB,CAAC,aAAa,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAErE,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEnE,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAErE,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEpD,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEjD,KAAK,KAAK;YACR,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/C,KAAK,cAAc;YACjB,OAAO,oBAAoB,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE7D,KAAK,KAAK;YACR,OAAO,IAAI,WAAW,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE/C,KAAK,KAAK;YACR,OAAO,WAAW,CAAC,QAAQ,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEpD,KAAK,OAAO;YACV,OAAO,IAAI,aAAa,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEjD,KAAK,WAAW;YACd,OAAO,IAAI,iBAAiB,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAErD,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAElD,KAAK,MAAM;YACT,OAAO,IAAI,YAAY,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEnE,KAAK,KAAK;YACR,OAAO,IAAI,WAAW,CAAC,iBAAiB,CAAC,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAElE,KAAK,QAAQ;YACX,OAAO,IAAI,cAAc,CAAC,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAElD,kDAAkD;QAClD,KAAK,OAAO;YACV,0CAA0C;YAC1C,OAAO,IAAI,eAAe,CAAC,OAAO,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAE5D,KAAK,QAAQ,CAAC;QACd,KAAK,OAAO,CAAC;QACb,KAAK,SAAS,CAAC;QACf,KAAK,MAAM;YACT,sCAAsC;YACtC,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;QAEzD;YACE,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;gBACvD,QAAQ,CAAC,IAAI,CAAC;oBACZ,OAAO,EAAE,qBAAqB,IAAI,oBAAoB;iBACvD,CAAC,CAAC;YACL,CAAC;YACD,OAAO,IAAI,eAAe,CAAC,IAAI,EAAE,CAAC,EAAE,UAAU,EAAE,KAAK,CAAC,CAAC;IAC3D,CAAC;AACH,CAAC;AAWD;;;GAGG;AACH,SAAS,eAAe,CACtB,KAAe,EACf,QAAwB;IAExB,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,MAAM,UAAU,GAAe,EAAE,CAAC;IAElC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAEjC,IAAI,KAAK,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;YACjC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YAC/B,SAAS;QACX,CAAC;QAED,MAAM,GAAG,GAAG,gBAAgB,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QAC7C,IAAI,CAAC,GAAG;YAAE,SAAS;QAEnB,2CAA2C;QAC3C,IAAI,GAAG,CAAC,IAAI,KAAK,SAAS,EAAE,CAAC;YAC3B,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3B,SAAS;QACX,CAAC;QAED,MAAM,IAAI,GAAG,mBAAmB,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;QAChD,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACxB,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,CAAC;AAC3C,CAAC;AAUD;;;;;;;;GAQG;AACH,MAAM,UAAU,cAAc,CAAC,KAAa;IAC1C,MAAM,QAAQ,GAAmB,EAAE,CAAC;IACpC,MAAM,SAAS,GAAe,EAAE,CAAC;IAEjC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;IACjC,IAAI,OAAO,GAAG,KAAK,CAAC;IACpB,IAAI,YAAY,GAAa,EAAE,CAAC;IAEhC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,MAAM,IAAI,GAAG,KAAK,CAAC,CAAC,CAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,IAAI,EAAE,CAAC;QAExC,IAAI,KAAK,KAAK,aAAa,EAAE,CAAC;YAC5B,OAAO,GAAG,IAAI,CAAC;YACf,YAAY,GAAG,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,IAAI,KAAK,KAAK,WAAW,EAAE,CAAC;YAC1B,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAE,0CAA0C,EAAE,CAAC,CAAC;gBACpF,SAAS;YACX,CAAC;YACD,OAAO,GAAG,KAAK,CAAC;YAChB,MAAM,YAAY,GAAmB,EAAE,CAAC;YACxC,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;YAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;YAC/B,YAAY,GAAG,EAAE,CAAC;YAClB,SAAS;QACX,CAAC;QAED,IAAI,OAAO,EAAE,CAAC;YACZ,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC1B,CAAC;QACD,0DAA0D;IAC5D,CAAC;IAED,IAAI,OAAO,EAAE,CAAC;QACZ,sCAAsC;QACtC,MAAM,YAAY,GAAmB,EAAE,CAAC;QACxC,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,qDAAqD,EAAE,CAAC,CAAC;QACtF,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;QAC5D,QAAQ,CAAC,IAAI,CAAC,GAAG,YAAY,CAAC,CAAC;IACjC,CAAC;IAED,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,CAAC;AACjC,CAAC;AAED,8EAA8E;AAE9E,OAAO,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAEtD,SAAS,iBAAiB,CAAC,CAAS;IAClC,OAAO,YAAY,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,aAAa,CAAC,CAAS;IAC9B,OAAO,SAAS,CAAC,CAAC,CAAC,CAAC;AACtB,CAAC"}
|