md2cv 1.0.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/CHANGELOG.md +19 -0
- package/LICENSE +674 -0
- package/README.md +219 -0
- package/dist/bin.d.ts +6 -0
- package/dist/bin.d.ts.map +1 -0
- package/dist/bin.js +10 -0
- package/dist/bin.js.map +1 -0
- package/dist/cli/index.d.ts +50 -0
- package/dist/cli/index.d.ts.map +1 -0
- package/dist/cli/index.js +278 -0
- package/dist/cli/index.js.map +1 -0
- package/dist/generator/index.d.ts +36 -0
- package/dist/generator/index.d.ts.map +1 -0
- package/dist/generator/index.js +302 -0
- package/dist/generator/index.js.map +1 -0
- package/dist/generator/resume_en.d.ts +22 -0
- package/dist/generator/resume_en.d.ts.map +1 -0
- package/dist/generator/resume_en.js +524 -0
- package/dist/generator/resume_en.js.map +1 -0
- package/dist/generator/resume_ja.d.ts +22 -0
- package/dist/generator/resume_ja.d.ts.map +1 -0
- package/dist/generator/resume_ja.js +440 -0
- package/dist/generator/resume_ja.js.map +1 -0
- package/dist/generator/rirekisho/components.d.ts +83 -0
- package/dist/generator/rirekisho/components.d.ts.map +1 -0
- package/dist/generator/rirekisho/components.js +405 -0
- package/dist/generator/rirekisho/components.js.map +1 -0
- package/dist/generator/rirekisho/data.d.ts +18 -0
- package/dist/generator/rirekisho/data.d.ts.map +1 -0
- package/dist/generator/rirekisho/data.js +274 -0
- package/dist/generator/rirekisho/data.js.map +1 -0
- package/dist/generator/rirekisho/index.d.ts +20 -0
- package/dist/generator/rirekisho/index.d.ts.map +1 -0
- package/dist/generator/rirekisho/index.js +67 -0
- package/dist/generator/rirekisho/index.js.map +1 -0
- package/dist/generator/rirekisho/layout.d.ts +20 -0
- package/dist/generator/rirekisho/layout.d.ts.map +1 -0
- package/dist/generator/rirekisho/layout.js +354 -0
- package/dist/generator/rirekisho/layout.js.map +1 -0
- package/dist/generator/rirekisho/styles.d.ts +9 -0
- package/dist/generator/rirekisho/styles.d.ts.map +1 -0
- package/dist/generator/rirekisho/styles.js +362 -0
- package/dist/generator/rirekisho/styles.js.map +1 -0
- package/dist/generator/rirekisho/types.d.ts +163 -0
- package/dist/generator/rirekisho/types.d.ts.map +1 -0
- package/dist/generator/rirekisho/types.js +80 -0
- package/dist/generator/rirekisho/types.js.map +1 -0
- package/dist/index.d.ts +10 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/parser/index.d.ts +21 -0
- package/dist/parser/index.d.ts.map +1 -0
- package/dist/parser/index.js +639 -0
- package/dist/parser/index.js.map +1 -0
- package/dist/types/config.d.ts +64 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +5 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/errors.d.ts +78 -0
- package/dist/types/errors.d.ts.map +1 -0
- package/dist/types/errors.js +146 -0
- package/dist/types/errors.js.map +1 -0
- package/dist/types/index.d.ts +9 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +9 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/metadata.d.ts +55 -0
- package/dist/types/metadata.d.ts.map +1 -0
- package/dist/types/metadata.js +136 -0
- package/dist/types/metadata.js.map +1 -0
- package/dist/types/result.d.ts +50 -0
- package/dist/types/result.d.ts.map +1 -0
- package/dist/types/result.js +74 -0
- package/dist/types/result.js.map +1 -0
- package/dist/types/sections.d.ts +168 -0
- package/dist/types/sections.d.ts.map +1 -0
- package/dist/types/sections.js +122 -0
- package/dist/types/sections.js.map +1 -0
- package/dist/validator/index.d.ts +20 -0
- package/dist/validator/index.d.ts.map +1 -0
- package/dist/validator/index.js +67 -0
- package/dist/validator/index.js.map +1 -0
- package/examples/example-cv-en.md +77 -0
- package/examples/example-cv-ja.md +116 -0
- package/examples/sample-photo.png +0 -0
- package/package.json +93 -0
|
@@ -0,0 +1,302 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Output Generator module
|
|
3
|
+
* Generates PDF and HTML outputs
|
|
4
|
+
*/
|
|
5
|
+
import * as fs from 'fs';
|
|
6
|
+
import * as path from 'path';
|
|
7
|
+
import puppeteer from 'puppeteer';
|
|
8
|
+
import { findSectionByTag, isSectionValidForFormat } from '../types/sections.js';
|
|
9
|
+
import { generateCVEnHTML } from './resume_en.js';
|
|
10
|
+
import { generateCVJaHTML } from './resume_ja.js';
|
|
11
|
+
import { generateRirekishoHTML } from './rirekisho/index.js';
|
|
12
|
+
// Re-export generators
|
|
13
|
+
export { generateCVEnHTML, generateCVJaHTML, generateRirekishoHTML };
|
|
14
|
+
/**
|
|
15
|
+
* Page size dimensions in mm
|
|
16
|
+
*/
|
|
17
|
+
export const PAGE_SIZES = {
|
|
18
|
+
a3: { width: 420, height: 297 },
|
|
19
|
+
a4: { width: 210, height: 297 },
|
|
20
|
+
b4: { width: 364, height: 257 },
|
|
21
|
+
b5: { width: 176, height: 250 },
|
|
22
|
+
letter: { width: 215.9, height: 279.4 },
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* MIME types for supported image formats
|
|
26
|
+
*/
|
|
27
|
+
const IMAGE_MIME_TYPES = {
|
|
28
|
+
'.png': 'image/png',
|
|
29
|
+
'.jpg': 'image/jpeg',
|
|
30
|
+
'.jpeg': 'image/jpeg',
|
|
31
|
+
'.tiff': 'image/tiff',
|
|
32
|
+
'.tif': 'image/tiff',
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* Read image file and convert to base64 data URI
|
|
36
|
+
*/
|
|
37
|
+
function readPhotoAsDataUri(photoPath) {
|
|
38
|
+
const ext = path.extname(photoPath).toLowerCase();
|
|
39
|
+
const mimeType = IMAGE_MIME_TYPES[ext];
|
|
40
|
+
if (!mimeType) {
|
|
41
|
+
throw new Error(`Unsupported image format: ${ext}`);
|
|
42
|
+
}
|
|
43
|
+
const imageBuffer = fs.readFileSync(photoPath);
|
|
44
|
+
const base64 = imageBuffer.toString('base64');
|
|
45
|
+
return `data:${mimeType};base64,${base64}`;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Escape HTML special characters
|
|
49
|
+
*/
|
|
50
|
+
export function escapeHtml(text) {
|
|
51
|
+
return text
|
|
52
|
+
.replace(/&/g, '&')
|
|
53
|
+
.replace(/</g, '<')
|
|
54
|
+
.replace(/>/g, '>')
|
|
55
|
+
.replace(/"/g, '"')
|
|
56
|
+
.replace(/'/g, ''');
|
|
57
|
+
}
|
|
58
|
+
/**
|
|
59
|
+
* Detect language from CV content
|
|
60
|
+
*/
|
|
61
|
+
function detectLanguage(cv) {
|
|
62
|
+
// Check if name_ja exists or if sections have Japanese titles
|
|
63
|
+
if (cv.metadata.name_ja)
|
|
64
|
+
return 'ja';
|
|
65
|
+
for (const section of cv.sections) {
|
|
66
|
+
// Check for Japanese characters in title
|
|
67
|
+
if (/[\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FAF]/.test(section.title)) {
|
|
68
|
+
return 'ja';
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
return 'en';
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* Default section order for CV format
|
|
75
|
+
*/
|
|
76
|
+
const DEFAULT_CV_SECTION_ORDER = ['summary', 'experience', 'education', 'skills', 'certifications', 'languages', 'competencies', 'motivation'];
|
|
77
|
+
/**
|
|
78
|
+
* Resolve section ID from tag or ID
|
|
79
|
+
* Returns the section ID if input matches a tag or is already an ID
|
|
80
|
+
*/
|
|
81
|
+
function resolveSectionId(input, sections) {
|
|
82
|
+
// First check if it's a direct section ID match
|
|
83
|
+
const directMatch = sections.find(s => s.id === input);
|
|
84
|
+
if (directMatch) {
|
|
85
|
+
return directMatch.id;
|
|
86
|
+
}
|
|
87
|
+
// Then check if it matches a section title (case-insensitive)
|
|
88
|
+
const titleMatch = sections.find(s => s.title.toLowerCase() === input.toLowerCase());
|
|
89
|
+
if (titleMatch) {
|
|
90
|
+
return titleMatch.id;
|
|
91
|
+
}
|
|
92
|
+
// Finally, check SECTION_DEFINITIONS tags
|
|
93
|
+
const def = findSectionByTag(input);
|
|
94
|
+
if (def) {
|
|
95
|
+
// Check if this section exists in the input
|
|
96
|
+
const sectionExists = sections.find(s => s.id === def.id);
|
|
97
|
+
if (sectionExists) {
|
|
98
|
+
return def.id;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Filter and order sections based on sectionOrder config
|
|
105
|
+
* If sectionOrder is provided, only include sections in that order
|
|
106
|
+
* If not provided, use default order for CV or include all sections for rirekisho
|
|
107
|
+
*/
|
|
108
|
+
function filterAndOrderSections(sections, format, sectionOrder, logger) {
|
|
109
|
+
// Get all section IDs from input
|
|
110
|
+
const allSectionIds = sections.map(s => s.id);
|
|
111
|
+
// Determine which sections are valid for this format
|
|
112
|
+
const validSectionIds = allSectionIds.filter(id => isSectionValidForFormat(id, format));
|
|
113
|
+
const invalidSectionIds = allSectionIds.filter(id => !isSectionValidForFormat(id, format));
|
|
114
|
+
let includedSectionIds;
|
|
115
|
+
let skippedSectionIds;
|
|
116
|
+
if (format === 'cv') {
|
|
117
|
+
if (sectionOrder && sectionOrder.length > 0) {
|
|
118
|
+
// Resolve section order (tags/titles to IDs)
|
|
119
|
+
const resolvedOrder = [];
|
|
120
|
+
for (const input of sectionOrder) {
|
|
121
|
+
const resolvedId = resolveSectionId(input, sections);
|
|
122
|
+
if (resolvedId && validSectionIds.includes(resolvedId) && !resolvedOrder.includes(resolvedId)) {
|
|
123
|
+
resolvedOrder.push(resolvedId);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
// Use custom order - only include sections that are in sectionOrder AND valid for format
|
|
127
|
+
includedSectionIds = resolvedOrder;
|
|
128
|
+
skippedSectionIds = validSectionIds.filter(id => !resolvedOrder.includes(id));
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
// Use default order for CV
|
|
132
|
+
const orderedIds = [];
|
|
133
|
+
const remainingIds = new Set(validSectionIds);
|
|
134
|
+
// Add sections in default order
|
|
135
|
+
for (const id of DEFAULT_CV_SECTION_ORDER) {
|
|
136
|
+
if (remainingIds.has(id)) {
|
|
137
|
+
orderedIds.push(id);
|
|
138
|
+
remainingIds.delete(id);
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
// Add any remaining sections not in default order
|
|
142
|
+
for (const id of remainingIds) {
|
|
143
|
+
orderedIds.push(id);
|
|
144
|
+
}
|
|
145
|
+
includedSectionIds = orderedIds;
|
|
146
|
+
skippedSectionIds = [];
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
else {
|
|
150
|
+
// Rirekisho: use all valid sections in original order
|
|
151
|
+
includedSectionIds = validSectionIds;
|
|
152
|
+
skippedSectionIds = [];
|
|
153
|
+
}
|
|
154
|
+
// Log section information
|
|
155
|
+
logger.info({ sections: includedSectionIds }, 'Sections included');
|
|
156
|
+
if (skippedSectionIds.length > 0) {
|
|
157
|
+
logger.info({ sections: skippedSectionIds }, 'Sections skipped (not in section-order)');
|
|
158
|
+
}
|
|
159
|
+
if (invalidSectionIds.length > 0) {
|
|
160
|
+
logger.info({ sections: invalidSectionIds }, `Sections skipped (not valid for ${format} format)`);
|
|
161
|
+
}
|
|
162
|
+
// Build ordered section list
|
|
163
|
+
const sectionMap = new Map(sections.map(s => [s.id, s]));
|
|
164
|
+
const orderedSections = [];
|
|
165
|
+
for (const id of includedSectionIds) {
|
|
166
|
+
const section = sectionMap.get(id);
|
|
167
|
+
if (section) {
|
|
168
|
+
orderedSections.push(section);
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
return orderedSections;
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Generate HTML for CV format
|
|
175
|
+
*/
|
|
176
|
+
function generateCVHTML(cv, paperSize, _chronologicalOrder, sectionOrder, logger) {
|
|
177
|
+
const language = detectLanguage(cv);
|
|
178
|
+
// TODO: Add chronological order support for CV format
|
|
179
|
+
// Filter and order sections if logger is provided
|
|
180
|
+
let sections = cv.sections;
|
|
181
|
+
if (logger) {
|
|
182
|
+
sections = filterAndOrderSections(cv.sections, 'cv', sectionOrder, logger);
|
|
183
|
+
}
|
|
184
|
+
const filteredCv = { ...cv, sections };
|
|
185
|
+
if (language === 'ja') {
|
|
186
|
+
return generateCVJaHTML(filteredCv, { paperSize });
|
|
187
|
+
}
|
|
188
|
+
return generateCVEnHTML(filteredCv, { paperSize });
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Generate PDF from HTML
|
|
192
|
+
*/
|
|
193
|
+
async function generatePDF(html, paperSize, isRirekisho) {
|
|
194
|
+
const browser = await puppeteer.launch({
|
|
195
|
+
headless: true,
|
|
196
|
+
args: ['--no-sandbox', '--disable-setuid-sandbox'],
|
|
197
|
+
});
|
|
198
|
+
try {
|
|
199
|
+
const page = await browser.newPage();
|
|
200
|
+
await page.setContent(html, { waitUntil: ['load', 'networkidle0'] });
|
|
201
|
+
const size = PAGE_SIZES[paperSize];
|
|
202
|
+
let pdfOptions;
|
|
203
|
+
if (isRirekisho) {
|
|
204
|
+
// Rirekisho uses landscape orientation with the specified paper size
|
|
205
|
+
// PAGE_SIZES for rirekisho are already in landscape (width > height)
|
|
206
|
+
const rirekishoSizes = {
|
|
207
|
+
a3: { width: 420, height: 297 },
|
|
208
|
+
a4: { width: 297, height: 210 },
|
|
209
|
+
b4: { width: 364, height: 257 },
|
|
210
|
+
b5: { width: 257, height: 182 },
|
|
211
|
+
letter: { width: 279.4, height: 215.9 },
|
|
212
|
+
};
|
|
213
|
+
const rirekishoSize = rirekishoSizes[paperSize];
|
|
214
|
+
await page.setViewport({
|
|
215
|
+
width: Math.round(rirekishoSize.width * 3.78),
|
|
216
|
+
height: Math.round(rirekishoSize.height * 3.78),
|
|
217
|
+
deviceScaleFactor: 2,
|
|
218
|
+
});
|
|
219
|
+
pdfOptions = {
|
|
220
|
+
width: `${rirekishoSize.width}mm`,
|
|
221
|
+
height: `${rirekishoSize.height}mm`,
|
|
222
|
+
printBackground: true,
|
|
223
|
+
margin: { top: '0mm', right: '0mm', bottom: '0mm', left: '0mm' },
|
|
224
|
+
preferCSSPageSize: false,
|
|
225
|
+
scale: 1,
|
|
226
|
+
};
|
|
227
|
+
}
|
|
228
|
+
else {
|
|
229
|
+
pdfOptions = {
|
|
230
|
+
width: `${size.width}mm`,
|
|
231
|
+
height: `${size.height}mm`,
|
|
232
|
+
printBackground: true,
|
|
233
|
+
margin: { top: '10mm', right: '10mm', bottom: '10mm', left: '10mm' },
|
|
234
|
+
preferCSSPageSize: true,
|
|
235
|
+
};
|
|
236
|
+
}
|
|
237
|
+
const pdfUint8Array = await page.pdf(pdfOptions);
|
|
238
|
+
return Buffer.from(pdfUint8Array);
|
|
239
|
+
}
|
|
240
|
+
finally {
|
|
241
|
+
await browser.close();
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Generate output files
|
|
246
|
+
*/
|
|
247
|
+
export async function generateOutput(cv, config, logger) {
|
|
248
|
+
const generatedFiles = [];
|
|
249
|
+
const formats = config.format === 'both' ? ['cv', 'rirekisho'] : [config.format];
|
|
250
|
+
const outputTypes = config.outputType === 'both' ? ['html', 'pdf'] : [config.outputType];
|
|
251
|
+
// Ensure output directory exists
|
|
252
|
+
const outputDir = path.dirname(config.output);
|
|
253
|
+
if (!fs.existsSync(outputDir)) {
|
|
254
|
+
fs.mkdirSync(outputDir, { recursive: true });
|
|
255
|
+
}
|
|
256
|
+
for (const format of formats) {
|
|
257
|
+
logger.debug(`Generating ${format}...`);
|
|
258
|
+
// Determine chronological order
|
|
259
|
+
// rirekisho always uses 'asc' (oldest first), cv uses config value or defaults to 'desc'
|
|
260
|
+
const chronologicalOrder = format === 'rirekisho' ? 'asc' : (config.chronologicalOrder ?? 'desc');
|
|
261
|
+
// Generate HTML
|
|
262
|
+
let html;
|
|
263
|
+
if (format === 'rirekisho') {
|
|
264
|
+
// Log sections for rirekisho
|
|
265
|
+
const sections = filterAndOrderSections(cv.sections, 'rirekisho', undefined, logger);
|
|
266
|
+
const filteredCv = { ...cv, sections };
|
|
267
|
+
// Read photo file if provided (only for rirekisho)
|
|
268
|
+
let photoDataUri;
|
|
269
|
+
if (config.photo) {
|
|
270
|
+
photoDataUri = readPhotoAsDataUri(config.photo);
|
|
271
|
+
logger.debug({ photo: config.photo }, 'Photo loaded for rirekisho');
|
|
272
|
+
}
|
|
273
|
+
html = generateRirekishoHTML(filteredCv, {
|
|
274
|
+
paperSize: config.paperSize,
|
|
275
|
+
chronologicalOrder,
|
|
276
|
+
hideMotivation: config.hideMotivation,
|
|
277
|
+
photoDataUri,
|
|
278
|
+
});
|
|
279
|
+
}
|
|
280
|
+
else {
|
|
281
|
+
html = generateCVHTML(cv, config.paperSize, chronologicalOrder, config.sectionOrder, logger);
|
|
282
|
+
}
|
|
283
|
+
const baseName = path.basename(config.output);
|
|
284
|
+
const suffix = format === 'rirekisho' ? '_rirekisho' : '_cv';
|
|
285
|
+
for (const outputType of outputTypes) {
|
|
286
|
+
const ext = outputType === 'pdf' ? '.pdf' : '.html';
|
|
287
|
+
const outputPath = path.join(outputDir, `${baseName}${suffix}${ext}`);
|
|
288
|
+
if (outputType === 'html') {
|
|
289
|
+
fs.writeFileSync(outputPath, html, 'utf-8');
|
|
290
|
+
}
|
|
291
|
+
else {
|
|
292
|
+
const pdfBuffer = await generatePDF(html, config.paperSize, format === 'rirekisho');
|
|
293
|
+
fs.writeFileSync(outputPath, pdfBuffer);
|
|
294
|
+
}
|
|
295
|
+
generatedFiles.push(outputPath);
|
|
296
|
+
logger.debug(`Generated: ${outputPath}`);
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
return generatedFiles;
|
|
300
|
+
}
|
|
301
|
+
export default generateOutput;
|
|
302
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/generator/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* English CV Generator
|
|
3
|
+
* Generates HTML for English CV format with Times font family
|
|
4
|
+
*/
|
|
5
|
+
import type { PaperSize } from '../types/config.js';
|
|
6
|
+
import type { CVMetadata } from '../types/metadata.js';
|
|
7
|
+
import type { ParsedSection } from '../types/sections.js';
|
|
8
|
+
export interface CVEnOptions {
|
|
9
|
+
readonly paperSize: PaperSize;
|
|
10
|
+
}
|
|
11
|
+
/**
|
|
12
|
+
* Input for CV generation
|
|
13
|
+
*/
|
|
14
|
+
export interface CVInput {
|
|
15
|
+
readonly metadata: CVMetadata;
|
|
16
|
+
readonly sections: readonly ParsedSection[];
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Generate English HTML CV
|
|
20
|
+
*/
|
|
21
|
+
export declare function generateCVEnHTML(cv: CVInput, options: CVEnOptions): string;
|
|
22
|
+
//# sourceMappingURL=resume_en.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"resume_en.d.ts","sourceRoot":"","sources":["../../src/generator/resume_en.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AACpD,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AACvD,OAAO,KAAK,EAMV,aAAa,EAId,MAAM,sBAAsB,CAAC;AAE9B,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED;;GAEG;AACH,MAAM,WAAW,OAAO;IACtB,QAAQ,CAAC,QAAQ,EAAE,UAAU,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,SAAS,aAAa,EAAE,CAAC;CAC7C;AA0gBD;;GAEG;AACH,wBAAgB,gBAAgB,CAAC,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,WAAW,GAAG,MAAM,CAkC1E"}
|