@gallop.software/canon 2.26.0 → 2.30.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/cli/commands/generate.d.ts +2 -1
- package/dist/cli/commands/generate.js +337 -76
- package/dist/cli/config.d.ts +6 -0
- package/dist/cli/config.js +17 -0
- package/dist/cli/index.js +36 -10
- package/dist/eslint/index.d.ts +8 -0
- package/dist/eslint/index.js +13 -1
- package/dist/eslint/rules/no-classnames-package.d.ts +3 -0
- package/dist/eslint/rules/no-classnames-package.js +46 -0
- package/dist/eslint/rules/no-inline-svg.d.ts +3 -0
- package/dist/eslint/rules/no-inline-svg.js +37 -0
- package/dist/eslint/rules/no-raw-colors.d.ts +3 -0
- package/dist/eslint/rules/no-raw-colors.js +139 -0
- package/dist/eslint/rules/prefer-alias-imports.d.ts +3 -0
- package/dist/eslint/rules/prefer-alias-imports.js +105 -0
- package/dist/eslint/rules/prefer-list-components.js +3 -3
- package/dist/eslint/rules/prefer-typography-components.js +7 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.js +1 -1
- package/dist/types/config.d.ts +36 -0
- package/dist/types/config.js +2 -0
- package/package.json +5 -1
- package/patterns/007-import-paths.md +4 -3
- package/patterns/009-color-tokens.md +4 -3
- package/patterns/012-icon-system.md +4 -3
- package/patterns/014-clsx-not-classnames.md +3 -3
- package/schema.json +8 -8
|
@@ -1,11 +1,32 @@
|
|
|
1
1
|
import * as fs from 'fs';
|
|
2
2
|
import * as path from 'path';
|
|
3
3
|
import { version, patterns, guarantees } from '../../index.js';
|
|
4
|
+
import { loadConfig } from '../config.js';
|
|
5
|
+
/**
|
|
6
|
+
* Detect output format from filename
|
|
7
|
+
*/
|
|
8
|
+
function detectFormat(filename) {
|
|
9
|
+
const base = path.basename(filename).toLowerCase();
|
|
10
|
+
if (base === 'claude.md')
|
|
11
|
+
return 'claude';
|
|
12
|
+
if (base === 'copilot-instructions.md')
|
|
13
|
+
return 'copilot';
|
|
14
|
+
return 'cursorrules';
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* Get all output targets when generating all files
|
|
18
|
+
*/
|
|
19
|
+
function getAllTargets() {
|
|
20
|
+
return [
|
|
21
|
+
{ output: '.cursorrules', format: 'cursorrules' },
|
|
22
|
+
{ output: 'CLAUDE.md', format: 'claude' },
|
|
23
|
+
{ output: '.github/copilot-instructions.md', format: 'copilot' },
|
|
24
|
+
];
|
|
25
|
+
}
|
|
4
26
|
/**
|
|
5
27
|
* Read a pattern markdown file and extract sections
|
|
6
28
|
*/
|
|
7
29
|
function readPatternFile(patternFile) {
|
|
8
|
-
// Try to find the canon package patterns directory
|
|
9
30
|
const possiblePaths = [
|
|
10
31
|
path.join(process.cwd(), 'node_modules/@gallop.software/canon', patternFile),
|
|
11
32
|
// Fallback for development
|
|
@@ -24,7 +45,6 @@ function readPatternFile(patternFile) {
|
|
|
24
45
|
function extractExamples(content) {
|
|
25
46
|
const good = [];
|
|
26
47
|
const bad = [];
|
|
27
|
-
// Find code blocks after "### Good" or "### Bad" headers
|
|
28
48
|
const goodMatch = content.match(/### Good\s*\n```[\s\S]*?```/g);
|
|
29
49
|
const badMatch = content.match(/### Bad\s*\n```[\s\S]*?```/g);
|
|
30
50
|
if (goodMatch) {
|
|
@@ -41,71 +61,105 @@ function extractExamples(content) {
|
|
|
41
61
|
}
|
|
42
62
|
return { good, bad };
|
|
43
63
|
}
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
*/
|
|
47
|
-
function generateCursorrules() {
|
|
64
|
+
// ─── Shared section generators ────────────────────────────────────────────
|
|
65
|
+
function generateHeader(format) {
|
|
48
66
|
const lines = [];
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
67
|
+
if (format === 'claude') {
|
|
68
|
+
lines.push(`# CLAUDE.md — Project-Specific Intelligence`);
|
|
69
|
+
lines.push('');
|
|
70
|
+
lines.push(`> Auto-generated from Gallop Canon v${version}. Do not edit manually.`);
|
|
71
|
+
lines.push(`> Regenerate with: npm run generate:ai-rules`);
|
|
72
|
+
}
|
|
73
|
+
else if (format === 'copilot') {
|
|
74
|
+
lines.push(`# Gallop Canon v${version} - Copilot Instructions`);
|
|
75
|
+
lines.push('');
|
|
76
|
+
lines.push('This file is auto-generated from @gallop.software/canon. Do not edit manually.');
|
|
77
|
+
lines.push('Regenerate with: npm run generate:ai-rules');
|
|
78
|
+
}
|
|
79
|
+
else {
|
|
80
|
+
lines.push(`# Gallop Canon v${version} - AI Rules`);
|
|
81
|
+
lines.push('');
|
|
82
|
+
lines.push('This file is auto-generated from @gallop.software/canon. Do not edit manually.');
|
|
83
|
+
lines.push('Regenerate with: npm run generate:ai-rules');
|
|
84
|
+
}
|
|
63
85
|
lines.push('');
|
|
64
|
-
|
|
86
|
+
return lines;
|
|
87
|
+
}
|
|
88
|
+
function generateTechStack() {
|
|
89
|
+
return [
|
|
90
|
+
'## Tech Stack',
|
|
91
|
+
'',
|
|
92
|
+
'- Next.js 16 with App Router',
|
|
93
|
+
'- React 19',
|
|
94
|
+
'- TypeScript',
|
|
95
|
+
'- Tailwind CSS v4',
|
|
96
|
+
'- clsx for conditional class names',
|
|
97
|
+
'',
|
|
98
|
+
];
|
|
99
|
+
}
|
|
100
|
+
function generateEnforcedPatterns(format) {
|
|
101
|
+
const lines = [];
|
|
102
|
+
const enforcedPatterns = patterns.filter(p => p.enforcement === 'eslint' && p.rule);
|
|
65
103
|
lines.push('## Enforced Patterns (ESLint)');
|
|
66
104
|
lines.push('');
|
|
67
105
|
lines.push('These patterns are enforced by `@gallop.software/canon/eslint`. Violations will be flagged.');
|
|
68
106
|
lines.push('');
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
lines.push('');
|
|
75
|
-
lines.push(`- **ESLint Rule:** \`${pattern.rule}\``);
|
|
76
|
-
lines.push(`- **Category:** ${pattern.category}`);
|
|
107
|
+
if (format === 'claude') {
|
|
108
|
+
// Claude can run lint — brief list with rule names
|
|
109
|
+
for (const pattern of enforcedPatterns) {
|
|
110
|
+
lines.push(`- **${pattern.id}: ${pattern.title}** — \`${pattern.rule}\` — ${pattern.summary}`);
|
|
111
|
+
}
|
|
77
112
|
lines.push('');
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
}
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
113
|
+
}
|
|
114
|
+
else {
|
|
115
|
+
// Cursorrules and Copilot: full examples
|
|
116
|
+
for (const pattern of enforcedPatterns) {
|
|
117
|
+
lines.push(`### ${pattern.id}: ${pattern.title}`);
|
|
118
|
+
lines.push('');
|
|
119
|
+
lines.push(pattern.summary);
|
|
120
|
+
lines.push('');
|
|
121
|
+
lines.push(`- **ESLint Rule:** \`${pattern.rule}\``);
|
|
122
|
+
lines.push(`- **Category:** ${pattern.category}`);
|
|
123
|
+
lines.push('');
|
|
124
|
+
if (format === 'cursorrules') {
|
|
125
|
+
const content = readPatternFile(pattern.file);
|
|
126
|
+
if (content) {
|
|
127
|
+
const { good, bad } = extractExamples(content);
|
|
128
|
+
if (bad.length > 0) {
|
|
129
|
+
lines.push('**Bad:**');
|
|
130
|
+
lines.push('');
|
|
131
|
+
lines.push(bad[0]);
|
|
132
|
+
lines.push('');
|
|
133
|
+
}
|
|
134
|
+
if (good.length > 0) {
|
|
135
|
+
lines.push('**Good:**');
|
|
136
|
+
lines.push('');
|
|
137
|
+
lines.push(good[0]);
|
|
138
|
+
lines.push('');
|
|
139
|
+
}
|
|
140
|
+
}
|
|
93
141
|
}
|
|
94
142
|
}
|
|
95
143
|
}
|
|
96
|
-
|
|
144
|
+
return lines;
|
|
145
|
+
}
|
|
146
|
+
function generateDocPatterns() {
|
|
147
|
+
const lines = [];
|
|
148
|
+
const docPatterns = patterns.filter(p => p.enforcement === 'documentation');
|
|
97
149
|
lines.push('## Documentation Patterns');
|
|
98
150
|
lines.push('');
|
|
99
151
|
lines.push('These patterns are not enforced by ESLint but should be followed.');
|
|
100
152
|
lines.push('');
|
|
101
|
-
const docPatterns = patterns.filter(p => p.enforcement === 'documentation');
|
|
102
153
|
for (const pattern of docPatterns) {
|
|
103
154
|
lines.push(`### ${pattern.id}: ${pattern.title}`);
|
|
104
155
|
lines.push('');
|
|
105
156
|
lines.push(pattern.summary);
|
|
106
157
|
lines.push('');
|
|
107
158
|
}
|
|
108
|
-
|
|
159
|
+
return lines;
|
|
160
|
+
}
|
|
161
|
+
function generateGuarantees() {
|
|
162
|
+
const lines = [];
|
|
109
163
|
lines.push('## Canon Guarantees');
|
|
110
164
|
lines.push('');
|
|
111
165
|
lines.push('Following these patterns provides these guarantees:');
|
|
@@ -114,37 +168,67 @@ function generateCursorrules() {
|
|
|
114
168
|
lines.push(`- **${guarantee.name}** (${guarantee.id}): Patterns ${guarantee.patterns.join(', ')}`);
|
|
115
169
|
}
|
|
116
170
|
lines.push('');
|
|
117
|
-
|
|
171
|
+
return lines;
|
|
172
|
+
}
|
|
173
|
+
function generateComponentReference(config) {
|
|
174
|
+
const lines = [];
|
|
118
175
|
lines.push('## Component Quick Reference');
|
|
119
176
|
lines.push('');
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
177
|
+
if (config?.components?.length) {
|
|
178
|
+
for (const comp of config.components) {
|
|
179
|
+
const propsStr = comp.props?.length ? ` - props: ${comp.props.map(p => `\`${p}\``).join(', ')}` : '';
|
|
180
|
+
const noteStr = comp.notes ? ` (${comp.notes})` : '';
|
|
181
|
+
lines.push(`- \`${comp.name}\`${propsStr}${noteStr}`);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
else {
|
|
185
|
+
// Fallback: hardcoded component list
|
|
186
|
+
lines.push('### Typography');
|
|
187
|
+
lines.push('- `Heading` - props: `as`, `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
|
|
188
|
+
lines.push('- `Paragraph` - props: `color`, `margin`, `fontSize`, `lineHeight`, `textAlign`');
|
|
189
|
+
lines.push('- `Span` - props: `color`, `margin`, `fontSize` (inline text, mb-0 default)');
|
|
190
|
+
lines.push('- `Label` - props: `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
|
|
191
|
+
lines.push('- `Quote` - props: `variant`, `color`, `margin`, `fontSize`, `fontWeight`, `textAlign`');
|
|
192
|
+
lines.push('');
|
|
193
|
+
lines.push('### Layout');
|
|
194
|
+
lines.push('- `Section` - semantic section wrapper');
|
|
195
|
+
lines.push('- `Columns` - grid layout, props: `cols`, `gap`, `align`');
|
|
196
|
+
lines.push('- `Column` - column child');
|
|
197
|
+
lines.push('');
|
|
198
|
+
lines.push('### Interactive');
|
|
199
|
+
lines.push('- `Button` - props: `href`, `variant`, `icon`, `iconPlacement`, `margin`');
|
|
200
|
+
lines.push('- `Icon` - Iconify icon wrapper');
|
|
201
|
+
}
|
|
135
202
|
lines.push('');
|
|
136
|
-
|
|
203
|
+
return lines;
|
|
204
|
+
}
|
|
205
|
+
function generateDoNotSection(config) {
|
|
206
|
+
const lines = [];
|
|
137
207
|
lines.push('## Do NOT');
|
|
138
208
|
lines.push('');
|
|
139
|
-
|
|
140
|
-
lines.push(
|
|
209
|
+
// Default rules always present
|
|
210
|
+
lines.push("- Use `'use client'` in blocks - extract to components");
|
|
211
|
+
lines.push('- Use raw `<p>`, `<span>`, or `<h1>`–`<h6>` - use Paragraph/Span/Heading components');
|
|
141
212
|
lines.push('- Use className for margin/color/fontSize when component has props');
|
|
142
213
|
lines.push('- Use Container inside Section - Section already provides containment');
|
|
143
214
|
lines.push('- Use `classnames` package - use `clsx` instead');
|
|
144
215
|
lines.push('- Use inline styles for hover states - use Tailwind classes');
|
|
145
216
|
lines.push('- Use native `IntersectionObserver` - use `react-intersection-observer` package');
|
|
217
|
+
lines.push('- Use inline `<svg>` in blocks - use the Icon component with Iconify icons');
|
|
218
|
+
lines.push('- Use deep relative imports (`../../`) - use `@/` alias imports');
|
|
219
|
+
// Template-specific rules
|
|
220
|
+
if (config?.rules) {
|
|
221
|
+
for (const rule of config.rules) {
|
|
222
|
+
if (rule.type === 'doNot') {
|
|
223
|
+
lines.push(`- ${rule.rule}`);
|
|
224
|
+
}
|
|
225
|
+
}
|
|
226
|
+
}
|
|
146
227
|
lines.push('');
|
|
147
|
-
|
|
228
|
+
return lines;
|
|
229
|
+
}
|
|
230
|
+
function generateFileAuthority() {
|
|
231
|
+
const lines = [];
|
|
148
232
|
lines.push('## File & Folder Authority');
|
|
149
233
|
lines.push('');
|
|
150
234
|
lines.push('These rules govern what AI is allowed and forbidden to do when creating, moving, or modifying files and folders.');
|
|
@@ -220,29 +304,206 @@ function generateCursorrules() {
|
|
|
220
304
|
lines.push('- Import from `_scripts/` or `_data/` in runtime code');
|
|
221
305
|
lines.push('- Manually edit files in `_data/` (generated only)');
|
|
222
306
|
lines.push('');
|
|
223
|
-
|
|
307
|
+
return lines;
|
|
308
|
+
}
|
|
309
|
+
function generateVerification(config) {
|
|
310
|
+
const lines = [];
|
|
224
311
|
lines.push('## Post-Edit Verification');
|
|
225
312
|
lines.push('');
|
|
226
313
|
lines.push('After editing files:');
|
|
227
|
-
|
|
228
|
-
|
|
314
|
+
if (config?.verification?.length) {
|
|
315
|
+
let step = 1;
|
|
316
|
+
for (const cmd of config.verification) {
|
|
317
|
+
lines.push(`${step}. Run \`${cmd}\``);
|
|
318
|
+
step++;
|
|
319
|
+
}
|
|
320
|
+
lines.push(`${step}. Fix any violations before committing`);
|
|
321
|
+
}
|
|
322
|
+
else {
|
|
323
|
+
lines.push('1. Run `npm run lint` to check for errors');
|
|
324
|
+
lines.push('2. Fix any violations before committing');
|
|
325
|
+
}
|
|
229
326
|
lines.push('');
|
|
230
327
|
lines.push('Note: Only lint files you edited, not the entire codebase.');
|
|
231
328
|
lines.push('');
|
|
329
|
+
return lines;
|
|
330
|
+
}
|
|
331
|
+
// ─── Claude-specific sections ─────────────────────────────────────────────
|
|
332
|
+
function generateAutoGenFiles(config) {
|
|
333
|
+
if (!config?.generatedFiles?.length)
|
|
334
|
+
return [];
|
|
335
|
+
const lines = [];
|
|
336
|
+
lines.push('## Auto-Generated Files — Never Edit Manually');
|
|
337
|
+
lines.push('');
|
|
338
|
+
lines.push('| File | Regenerate With | Triggered By |');
|
|
339
|
+
lines.push('|---|---|---|');
|
|
340
|
+
for (const file of config.generatedFiles) {
|
|
341
|
+
lines.push(`| \`${file.path}\` | \`${file.command}\` | ${file.trigger} |`);
|
|
342
|
+
}
|
|
343
|
+
lines.push('');
|
|
344
|
+
return lines;
|
|
345
|
+
}
|
|
346
|
+
function generateBuildCommands(config) {
|
|
347
|
+
if (!config?.buildCommands?.length)
|
|
348
|
+
return [];
|
|
349
|
+
const lines = [];
|
|
350
|
+
lines.push('## Build Commands');
|
|
351
|
+
lines.push('');
|
|
352
|
+
lines.push('| Command | Purpose |');
|
|
353
|
+
lines.push('|---|---|');
|
|
354
|
+
for (const cmd of config.buildCommands) {
|
|
355
|
+
lines.push(`| \`${cmd.script}\` | ${cmd.description} |`);
|
|
356
|
+
}
|
|
357
|
+
lines.push('');
|
|
358
|
+
return lines;
|
|
359
|
+
}
|
|
360
|
+
function generateColorTokens(config) {
|
|
361
|
+
if (!config?.colorTokens)
|
|
362
|
+
return [];
|
|
363
|
+
const lines = [];
|
|
364
|
+
const ct = config.colorTokens;
|
|
365
|
+
lines.push('## Color Token System');
|
|
366
|
+
lines.push('');
|
|
367
|
+
lines.push('All colors use semantic tokens defined in `src/styles/tailwind.css` `@theme`:');
|
|
368
|
+
lines.push('');
|
|
369
|
+
if (ct.surface?.length) {
|
|
370
|
+
lines.push(`- **Surface**: ${ct.surface.map(s => `\`${s}\``).join(', ')}`);
|
|
371
|
+
}
|
|
372
|
+
if (ct.text?.length) {
|
|
373
|
+
lines.push(`- **Text**: ${ct.text.map(s => `\`${s}\``).join(', ')}`);
|
|
374
|
+
}
|
|
375
|
+
if (ct.overlay?.length) {
|
|
376
|
+
lines.push(`- **Overlay** (fixed — don't flip in dark mode): ${ct.overlay.map(s => `\`${s}\``).join(', ')}`);
|
|
377
|
+
}
|
|
378
|
+
if (ct.accents?.length) {
|
|
379
|
+
lines.push(`- **Accents**: ${ct.accents.map(s => `\`${s}\``).join(', ')}`);
|
|
380
|
+
}
|
|
381
|
+
lines.push('');
|
|
382
|
+
lines.push('**Never use**: `gray-*`, `white`, `black`, `slate-*` — always map to a semantic token.');
|
|
383
|
+
lines.push('');
|
|
384
|
+
return lines;
|
|
385
|
+
}
|
|
386
|
+
function generateStateManagement(config) {
|
|
387
|
+
if (!config?.state)
|
|
388
|
+
return [];
|
|
389
|
+
const lines = [];
|
|
390
|
+
const st = config.state;
|
|
391
|
+
lines.push('## State Management');
|
|
392
|
+
lines.push('');
|
|
393
|
+
lines.push(`${st.library} store at \`${st.file}\`. Read with \`${st.readPattern}\`, write with \`${st.writePattern}\`.`);
|
|
394
|
+
lines.push('');
|
|
395
|
+
if (st.properties?.length) {
|
|
396
|
+
lines.push(`Available state: ${st.properties.map(p => `\`${p}\``).join(', ')}.`);
|
|
397
|
+
lines.push('');
|
|
398
|
+
}
|
|
399
|
+
return lines;
|
|
400
|
+
}
|
|
401
|
+
function generateTemplateRules(config) {
|
|
402
|
+
if (!config?.rules?.length)
|
|
403
|
+
return [];
|
|
404
|
+
const doRules = config.rules.filter(r => r.type === 'do');
|
|
405
|
+
if (!doRules.length)
|
|
406
|
+
return [];
|
|
407
|
+
const lines = [];
|
|
408
|
+
lines.push('## Template-Specific Rules');
|
|
409
|
+
lines.push('');
|
|
410
|
+
for (const rule of doRules) {
|
|
411
|
+
lines.push(`- ${rule.rule}`);
|
|
412
|
+
}
|
|
413
|
+
lines.push('');
|
|
414
|
+
return lines;
|
|
415
|
+
}
|
|
416
|
+
// ─── Format generators ────────────────────────────────────────────────────
|
|
417
|
+
function generateCursorrules(config) {
|
|
418
|
+
const lines = [
|
|
419
|
+
...generateHeader('cursorrules'),
|
|
420
|
+
...generateTechStack(),
|
|
421
|
+
...generateEnforcedPatterns('cursorrules'),
|
|
422
|
+
...generateDocPatterns(),
|
|
423
|
+
...generateGuarantees(),
|
|
424
|
+
...generateComponentReference(config),
|
|
425
|
+
...generateDoNotSection(config),
|
|
426
|
+
...generateFileAuthority(),
|
|
427
|
+
...generateVerification(config),
|
|
428
|
+
];
|
|
232
429
|
return lines.join('\n');
|
|
233
430
|
}
|
|
431
|
+
function generateClaudeMd(config) {
|
|
432
|
+
const lines = [
|
|
433
|
+
...generateHeader('claude'),
|
|
434
|
+
...generateAutoGenFiles(config),
|
|
435
|
+
...generateBuildCommands(config),
|
|
436
|
+
...generateEnforcedPatterns('claude'),
|
|
437
|
+
...generateDocPatterns(),
|
|
438
|
+
...generateColorTokens(config),
|
|
439
|
+
...generateComponentReference(config),
|
|
440
|
+
...generateStateManagement(config),
|
|
441
|
+
...generateTemplateRules(config),
|
|
442
|
+
...generateDoNotSection(config),
|
|
443
|
+
...generateVerification(config),
|
|
444
|
+
];
|
|
445
|
+
return lines.join('\n');
|
|
446
|
+
}
|
|
447
|
+
function generateCopilotInstructions(config) {
|
|
448
|
+
const lines = [
|
|
449
|
+
...generateHeader('copilot'),
|
|
450
|
+
...generateTechStack(),
|
|
451
|
+
...generateEnforcedPatterns('copilot'),
|
|
452
|
+
...generateDocPatterns(),
|
|
453
|
+
...generateComponentReference(config),
|
|
454
|
+
...generateDoNotSection(config),
|
|
455
|
+
...generateVerification(config),
|
|
456
|
+
];
|
|
457
|
+
return lines.join('\n');
|
|
458
|
+
}
|
|
459
|
+
function generateContent(format, config) {
|
|
460
|
+
switch (format) {
|
|
461
|
+
case 'claude':
|
|
462
|
+
return generateClaudeMd(config);
|
|
463
|
+
case 'copilot':
|
|
464
|
+
return generateCopilotInstructions(config);
|
|
465
|
+
case 'cursorrules':
|
|
466
|
+
default:
|
|
467
|
+
return generateCursorrules(config);
|
|
468
|
+
}
|
|
469
|
+
}
|
|
470
|
+
function writeOutput(content, outputPath) {
|
|
471
|
+
const dir = path.dirname(outputPath);
|
|
472
|
+
if (!fs.existsSync(dir)) {
|
|
473
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
474
|
+
}
|
|
475
|
+
fs.writeFileSync(outputPath, content, 'utf-8');
|
|
476
|
+
}
|
|
477
|
+
// ─── Public API ───────────────────────────────────────────────────────────
|
|
234
478
|
export async function generate(options) {
|
|
235
|
-
const
|
|
236
|
-
if (options.output === '
|
|
237
|
-
//
|
|
479
|
+
const config = loadConfig();
|
|
480
|
+
if (options.output === 'all') {
|
|
481
|
+
// Generate all targets
|
|
482
|
+
const targets = getAllTargets();
|
|
483
|
+
for (const target of targets) {
|
|
484
|
+
const content = generateContent(target.format, config);
|
|
485
|
+
const outputPath = path.resolve(process.cwd(), target.output);
|
|
486
|
+
writeOutput(content, outputPath);
|
|
487
|
+
console.log(`✓ Generated ${target.output}`);
|
|
488
|
+
}
|
|
489
|
+
console.log(` Canon v${version} — ${patterns.length} patterns, ${guarantees.length} guarantees`);
|
|
490
|
+
if (config) {
|
|
491
|
+
console.log(` Template config: ${config.name}`);
|
|
492
|
+
}
|
|
493
|
+
}
|
|
494
|
+
else if (options.output === '-') {
|
|
495
|
+
const content = generateContent(options.format, config);
|
|
238
496
|
console.log(content);
|
|
239
497
|
}
|
|
240
498
|
else {
|
|
241
|
-
|
|
499
|
+
const content = generateContent(options.format, config);
|
|
242
500
|
const outputPath = path.resolve(process.cwd(), options.output);
|
|
243
|
-
|
|
501
|
+
writeOutput(content, outputPath);
|
|
244
502
|
console.log(`✓ Generated ${options.output} from Canon v${version}`);
|
|
245
503
|
console.log(` ${patterns.length} patterns, ${guarantees.length} guarantees`);
|
|
504
|
+
if (config) {
|
|
505
|
+
console.log(` Template config: ${config.name}`);
|
|
506
|
+
}
|
|
246
507
|
}
|
|
247
508
|
}
|
|
248
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2dlbmVyYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFjLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBTzFFOztHQUVHO0FBQ0gsU0FBUyxlQUFlLENBQUMsV0FBbUI7SUFDMUMsbURBQW1EO0lBQ25ELE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHFDQUFxQyxFQUFFLFdBQVcsQ0FBQztRQUM1RSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0tBQ3pELENBQUE7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQTtJQUV4Qix5REFBeUQ7SUFDekQsTUFBTSxTQUFTLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQy9ELE1BQU0sUUFBUSxHQUFHLE9BQU8sQ0FB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QUFDLElBQUksQ0FBQyw0REFBNEQsQ0FBQyxDQUFBO0lBQ3hFLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDekIsQ0FBQztBQUVELE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLE9BQXdCO0lBQ3JELE1BQU0sT0FBTyxHQUFHLG1CQUFtQixFQUFFLENBQUE7SUFFckMsSUFBSSxPQUFPLENBQUMsTUFBTSxLQUFLLEdBQUcsRUFBRSxDQUFDO1FBQzNCLG1CQUFtQjtRQUNuQixPQUFPLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFBO0lBQ3RCLENBQUM7U0FBTSxDQUFDO1FBQ04sZ0JBQWdCO1FBQ2hCLE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5RCxFQUFFLENBQUMsYUFBYSxDQUFDLFVBQVUsRUFBRSxPQUFPLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxlQUFlLE9BQU8sQ0FBQyxNQUFNLGdCQUFnQixPQUFPLEVBQUUsQ0FBQyxDQUFBO1FBQ25FLE9BQU8sQ0FBQyxHQUFHLENBQUMsS0FBSyxRQUFRLENBQUMsTUFBTSxjQUFjLFVBQVUsQ0FBQyxNQUFNLGFBQWEsQ0FBQyxDQUFBO0lBQy9FLENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyB2ZXJzaW9uLCBwYXR0ZXJucywgY2F0ZWdvcmllcywgZ3VhcmFudGVlcyB9IGZyb20gJy4uLy4uL2luZGV4LmpzJ1xuXG5pbnRlcmZhY2UgR2VuZXJhdGVPcHRpb25zIHtcbiAgb3V0cHV0OiBzdHJpbmdcbiAgZm9ybWF0OiAnY3Vyc29ycnVsZXMnIHwgJ21hcmtkb3duJ1xufVxuXG4vKipcbiAqIFJlYWQgYSBwYXR0ZXJuIG1hcmtkb3duIGZpbGUgYW5kIGV4dHJhY3Qgc2VjdGlvbnNcbiAqL1xuZnVuY3Rpb24gcmVhZFBhdHRlcm5GaWxlKHBhdHRlcm5GaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgLy8gVHJ5IHRvIGZpbmQgdGhlIGNhbm9uIHBhY2thZ2UgcGF0dGVybnMgZGlyZWN0b3J5XG4gIGNvbnN0IHBvc3NpYmxlUGF0aHMgPSBbXG4gICAgcGF0aC5qb2luKHByb2Nlc3MuY3dkKCksICdub2RlX21vZHVsZXMvQGdhbGxvcC5zb2Z0d2FyZS9jYW5vbicsIHBhdHRlcm5GaWxlKSxcbiAgICAvLyBGYWxsYmFjayBmb3IgZGV2ZWxvcG1lbnRcbiAgICBwYXRoLmpvaW4oaW1wb3J0Lm1ldGEuZGlybmFtZSwgJy4uLy4uLy4uLycsIHBhdHRlcm5GaWxlKSxcbiAgXVxuXG4gIGZvciAoY29uc3QgZmlsZVBhdGggb2YgcG9zc2libGVQYXRocykge1xuICAgIGlmIChmcy5leGlzdHNTeW5jKGZpbGVQYXRoKSkge1xuICAgICAgcmV0dXJuIGZzLnJlYWRGaWxlU3luYyhmaWxlUGF0aCwgJ3V0Zi04JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gbnVsbFxufVxuXG4vKipcbiAqIEV4dHJhY3QgZXhhbXBsZXMgZnJvbSBwYXR0ZXJuIG1hcmtkb3duXG4gKi9cbmZ1bmN0aW9uIGV4dHJhY3RFeGFtcGxlcyhjb250ZW50OiBzdHJpbmcpOiB7IGdvb2Q6IHN0cmluZ1tdOyBiYWQ6IHN0cmluZ1tdIH0ge1xuICBjb25zdCBnb29kOiBzdHJpbmdbXSA9IFtdXG4gIGNvbnN0IGJhZDogc3RyaW5nW10gPSBbXVxuXG4gIC8vIEZpbmQgY29kZSBibG9ja3MgYWZ0ZXIgXCIjIyMgR29vZFwiIG9yIFwiIyMjIEJhZFwiIGhlYWRlcnNcbiAgY29uc3QgZ29vZE1hdGNoID0gY29udGVudC5tYXRjaCgvIyMjIEdvb2RcXHMqXFxuYGBgW1xcc1xcU10qP2BgYC9nKVxuICBjb25zdCBiYWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goLyMjIyBCYWRcXHMqXFxuYGBgW1xcc1xcU10qP2BgYC9nKVxuXG4gIGlmIChnb29kTWF0Y2gpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGdvb2RNYXRjaCkge1xuICAgICAgY29uc3QgY29kZSA9IG1hdGNoLnJlcGxhY2UoLyMjIyBHb29kXFxzKlxcbi8sICcnKS50cmltKClcbiAgICAgIGdvb2QucHVzaChjb2RlKVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYWRNYXRjaCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgYmFkTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBtYXRjaC5yZXBsYWNlKC8jIyMgQmFkXFxzKlxcbi8sICcnKS50cmltKClcbiAgICAgIGJhZC5wdXNoKGNvZGUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZ29vZCwgYmFkIH1cbn1cblxuLyoqXG4gKiBHZW5lcmF0ZSAuY3Vyc29ycnVsZXMgY29udGVudCBmcm9tIENhbm9uXG4gKi9cbmZ1bmN0aW9uIGdlbmVyYXRlQ3Vyc29ycnVsZXMoKTogc3RyaW5nIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cblxuICAvLyBIZWFkZXJcbiAgbGluZXMucHVzaChgIyBHYWxsb3AgQ2Fub24gdiR7dmVyc2lvbn0gLSBBSSBSdWxlc2ApXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ1RoaXMgZmlsZSBpcyBhdXRvLWdlbmVyYXRlZCBmcm9tIEBnYWxsb3Auc29mdHdhcmUvY2Fub24uIERvIG5vdCBlZGl0IG1hbnVhbGx5LicpXG4gIGxpbmVzLnB1c2goJ1JlZ2VuZXJhdGUgd2l0aDogbnBtIHJ1biBnZW5lcmF0ZTphaS1ydWxlcycpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gVGVjaCBzdGFjayAoQ2Fub24tY29tcGF0aWJsZSB0ZW1wbGF0ZXMpXG4gIGxpbmVzLnB1c2goJyMjIFRlY2ggU3RhY2snKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCctIE5leHQuanMgMTYgd2l0aCBBcHAgUm91dGVyJylcbiAgbGluZXMucHVzaCgnLSBSZWFjdCAxOScpXG4gIGxpbmVzLnB1c2goJy0gVHlwZVNjcmlwdCcpXG4gIGxpbmVzLnB1c2goJy0gVGFpbHdpbmQgQ1NTIHY0JylcbiAgbGluZXMucHVzaCgnLSBjbHN4IGZvciBjb25kaXRpb25hbCBjbGFzcyBuYW1lcycpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gRW5mb3JjZWQgcGF0dGVybnMgKEVTTGludCBydWxlcylcbiAgbGluZXMucHVzaCgnIyMgRW5mb3JjZWQgUGF0dGVybnMgKEVTTGludCknKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdUaGVzZSBwYXR0ZXJucyBhcmUgZW5mb3JjZWQgYnkgYEBnYWxsb3Auc29mdHdhcmUvY2Fub24vZXNsaW50YC4gVmlvbGF0aW9ucyB3aWxsIGJlIGZsYWdnZWQuJylcbiAgbGluZXMucHVzaCgnJylcblxuICBjb25zdCBlbmZvcmNlZFBhdHRlcm5zID0gcGF0dGVybnMuZmlsdGVyKHAgPT4gcC5lbmZvcmNlbWVudCA9PT0gJ2VzbGludCcgJiYgcC5ydWxlKVxuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZW5mb3JjZWRQYXR0ZXJucykge1xuICAgIGxpbmVzLnB1c2goYCMjIyAke3BhdHRlcm4uaWR9OiAke3BhdHRlcm4udGl0bGV9YClcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2gocGF0dGVybi5zdW1tYXJ5KVxuICAgIGxpbmVzLnB1c2goJycpXG4gICAgbGluZXMucHVzaChgLSAqKkVTTGludCBSdWxlOioqIFxcYCR7cGF0dGVybi5ydWxlfVxcYGApXG4gICAgbGluZXMucHVzaChgLSAqKkNhdGVnb3J5OioqICR7cGF0dGVybi5jYXRlZ29yeX1gKVxuICAgIGxpbmVzLnB1c2goJycpXG5cbiAgICAvLyBUcnkgdG8gcmVhZCBhbmQgaW5jbHVkZSBleGFtcGxlc1xuICAgIGNvbnN0IGNvbnRlbnQgPSByZWFkUGF0dGVybkZpbGUocGF0dGVybi5maWxlKVxuICAgIGlmIChjb250ZW50KSB7XG4gICAgICBjb25zdCB7IGdvb2QsIGJhZCB9ID0gZXh0cmFjdEV4YW1wbGVzKGNvbnRlbnQpXG4gICAgICBpZiAoYmFkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnKipCYWQ6KionKVxuICAgICAgICBsaW5lcy5wdXNoKCcnKVxuICAgICAgICBsaW5lcy5wdXNoKGJhZFswXSlcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgIH1cbiAgICAgIGlmIChnb29kLmxlbmd0aCA+IDApIHtcbiAgICAgICAgbGluZXMucHVzaCgnKipHb29kOioqJylcbiAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgbGluZXMucHVzaChnb29kWzBdKVxuICAgICAgICBsaW5lcy5wdXNoKCcnKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIERvY3VtZW50YXRpb24gcGF0dGVybnNcbiAgbGluZXMucHVzaCgnIyMgRG9jdW1lbnRhdGlvbiBQYXR0ZXJucycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ1RoZXNlIHBhdHRlcm5zIGFyZSBub3QgZW5mb3JjZWQgYnkgRVNMaW50IGJ1dCBzaG91bGQgYmUgZm9sbG93ZWQuJylcbiAgbGluZXMucHVzaCgnJylcblxuICBjb25zdCBkb2NQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcihwID0+IHAuZW5mb3JjZW1lbnQgPT09ICdkb2N1bWVudGF0aW9uJylcbiAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGRvY1BhdHRlcm5zKSB7XG4gICAgbGluZXMucHVzaChgIyMjICR7cGF0dGVybi5pZH06ICR7cGF0dGVybi50aXRsZX1gKVxuICAgIGxpbmVzLnB1c2goJycpXG4gICAgbGluZXMucHVzaChwYXR0ZXJuLnN1bW1hcnkpXG4gICAgbGluZXMucHVzaCgnJylcbiAgfVxuXG4gIC8vIEd1YXJhbnRlZXNcbiAgbGluZXMucHVzaCgnIyMgQ2Fub24gR3VhcmFudGVlcycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ0ZvbGxvd2luZyB0aGVzZSBwYXR0ZXJucyBwcm92aWRlcyB0aGVzZSBndWFyYW50ZWVzOicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgZm9yIChjb25zdCBndWFyYW50ZWUgb2YgZ3VhcmFudGVlcykge1xuICAgIGxpbmVzLnB1c2goYC0gKioke2d1YXJhbnRlZS5uYW1lfSoqICgke2d1YXJhbnRlZS5pZH0pOiBQYXR0ZXJucyAke2d1YXJhbnRlZS5wYXR0ZXJucy5qb2luKCcsICcpfWApXG4gIH1cbiAgbGluZXMucHVzaCgnJylcblxuICAvLyBRdWljayByZWZlcmVuY2UgZm9yIGNvbXBvbmVudHNcbiAgbGluZXMucHVzaCgnIyMgQ29tcG9uZW50IFF1aWNrIFJlZmVyZW5jZScpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyMjIyBUeXBvZ3JhcGh5JylcbiAgbGluZXMucHVzaCgnLSBgSGVhZGluZ2AgLSBwcm9wczogYGFzYCwgYGNvbG9yYCwgYG1hcmdpbmAsIGBmb250U2l6ZWAsIGBmb250V2VpZ2h0YCwgYHRleHRBbGlnbmAnKVxuICBsaW5lcy5wdXNoKCctIGBQYXJhZ3JhcGhgIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgbGluZUhlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgU3BhbmAgLSBwcm9wczogYGNvbG9yYCwgYG1hcmdpbmAsIGBmb250U2l6ZWAgKGlubGluZSB0ZXh0LCBtYi0wIGRlZmF1bHQpJylcbiAgbGluZXMucHVzaCgnLSBgTGFiZWxgIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgZm9udFdlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgbGluZXMucHVzaCgnLSBgUXVvdGVgIC0gcHJvcHM6IGB2YXJpYW50YCwgYGNvbG9yYCwgYG1hcmdpbmAsIGBmb250U2l6ZWAsIGBmb250V2VpZ2h0YCwgYHRleHRBbGlnbmAnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcjIyMgTGF5b3V0JylcbiAgbGluZXMucHVzaCgnLSBgU2VjdGlvbmAgLSBzZW1hbnRpYyBzZWN0aW9uIHdyYXBwZXInKVxuICBsaW5lcy5wdXNoKCctIGBDb2x1bW5zYCAtIGdyaWQgbGF5b3V0LCBwcm9wczogYGNvbHNgLCBgZ2FwYCwgYGFsaWduYCcpXG4gIGxpbmVzLnB1c2goJy0gYENvbHVtbmAgLSBjb2x1bW4gY2hpbGQnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcjIyMgSW50ZXJhY3RpdmUnKVxuICBsaW5lcy5wdXNoKCctIGBCdXR0b25gIC0gcHJvcHM6IGBocmVmYCwgYHZhcmlhbnRgLCBgaWNvbmAsIGBpY29uUGxhY2VtZW50YCwgYG1hcmdpbmAnKVxuICBsaW5lcy5wdXNoKCctIGBJY29uYCAtIEljb25pZnkgaWNvbiB3cmFwcGVyJylcbiAgbGluZXMucHVzaCgnJylcblxuICAvLyBEbyBOT1Qgc2VjdGlvblxuICBsaW5lcy5wdXNoKCcjIyBEbyBOT1QnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBgXFwndXNlIGNsaWVudFxcJ2AgaW4gYmxvY2tzIC0gZXh0cmFjdCB0byBjb21wb25lbnRzJylcbiAgbGluZXMucHVzaCgnLSBVc2UgcmF3IGA8cD5gIG9yIGA8c3Bhbj5gIC0gdXNlIFBhcmFncmFwaC9TcGFuIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBjbGFzc05hbWUgZm9yIG1hcmdpbi9jb2xvci9mb250U2l6ZSB3aGVuIGNvbXBvbmVudCBoYXMgcHJvcHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBDb250YWluZXIgaW5zaWRlIFNlY3Rpb24gLSBTZWN0aW9uIGFscmVhZHkgcHJvdmlkZXMgY29udGFpbm1lbnQnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBgY2xhc3NuYW1lc2AgcGFja2FnZSAtIHVzZSBgY2xzeGAgaW5zdGVhZCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGlubGluZSBzdHlsZXMgZm9yIGhvdmVyIHN0YXRlcyAtIHVzZSBUYWlsd2luZCBjbGFzc2VzJylcbiAgbGluZXMucHVzaCgnLSBVc2UgbmF0aXZlIGBJbnRlcnNlY3Rpb25PYnNlcnZlcmAgLSB1c2UgYHJlYWN0LWludGVyc2VjdGlvbi1vYnNlcnZlcmAgcGFja2FnZScpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gRmlsZSAmIEZvbGRlciBBdXRob3JpdHkgc2VjdGlvblxuICBsaW5lcy5wdXNoKCcjIyBGaWxlICYgRm9sZGVyIEF1dGhvcml0eScpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ1RoZXNlIHJ1bGVzIGdvdmVybiB3aGF0IEFJIGlzIGFsbG93ZWQgYW5kIGZvcmJpZGRlbiB0byBkbyB3aGVuIGNyZWF0aW5nLCBtb3ZpbmcsIG9yIG1vZGlmeWluZyBmaWxlcyBhbmQgZm9sZGVycy4nKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGxpbmVzLnB1c2goJyMjIyBEZWZpbmVkIGAvc3JjYCBTdHJ1Y3R1cmUnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdgYGAnKVxuICBsaW5lcy5wdXNoKCdzcmMvJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGFwcC8gICAgICAgICAgIyBSb3V0ZXMsIGxheW91dHMsIG1ldGFkYXRhIChOZXh0LmpzIEFwcCBSb3V0ZXIpJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGJsb2Nrcy8gICAgICAgIyBQYWdlLWxldmVsIGNvbnRlbnQgc2VjdGlvbnMnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgYmxvZy8gICAgICAgICAjIEJsb2cgY29udGVudCAoYXJjaGl2ZSBjb250ZW50IHR5cGUpJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGNvbXBvbmVudHMvICAgIyBSZXVzYWJsZSBVSSBwcmltaXRpdmVzJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGhvb2tzLyAgICAgICAgIyBDdXN0b20gUmVhY3QgaG9va3MnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgc3R5bGVzLyAgICAgICAjIENTUywgVGFpbHdpbmQsIGZvbnRzJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIHRlbXBsYXRlLyAgICAgIyBUZW1wbGF0ZS1sZXZlbCBjb21wb25lbnRzJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIHRvb2xzLyAgICAgICAgIyBVdGlsaXR5IHRvb2xzJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIHR5cGVzLyAgICAgICAgIyBUeXBlU2NyaXB0IHR5cGVzJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIHV0aWxzLyAgICAgICAgIyBVdGlsaXR5IGZ1bmN0aW9ucycpXG4gIGxpbmVzLnB1c2goJ+KUlOKUgOKUgCBzdGF0ZS50cyAgICAgICMgR2xvYmFsIHN0YXRlJylcbiAgbGluZXMucHVzaCgnYGBgJylcbiAgbGluZXMucHVzaCgnJylcblxuICBsaW5lcy5wdXNoKCcjIyMgQXBwIFJvdXRlciBTdHJ1Y3R1cmUnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdSb3V0ZXMgbXVzdCB1c2UgTmV4dC5qcyByb3V0ZSBncm91cHMuIEF0IG1pbmltdW0sIGAoZGVmYXVsdClgIG11c3QgZXhpc3Q6JylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnYGBgJylcbiAgbGluZXMucHVzaCgnc3JjL2FwcC8nKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgKGRlZmF1bHQpLyAgICAgICAgIyBSZXF1aXJlZCAtIGRlZmF1bHQgbGF5b3V0IGdyb3VwJylcbiAgbGluZXMucHVzaCgn4pSCICAg4pSc4pSA4pSAIGxheW91dC50c3gnKVxuICBsaW5lcy5wdXNoKCfilIIgICDilJTilIDilIAge3JvdXRlc30vJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIChoZXJvKS8gICAgICAgICAgICMgT3B0aW9uYWwgLSBoZXJvIGxheW91dCB2YXJpYW50JylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGFwaS8gICAgICAgICAgICAgICMgQVBJIHJvdXRlcyAoZXhjZXB0aW9uIC0gbm8gZ3JvdXBpbmcpJylcbiAgbGluZXMucHVzaCgn4pSc4pSA4pSAIGxheW91dC50c3ggICAgICAgICMgUm9vdCBsYXlvdXQnKVxuICBsaW5lcy5wdXNoKCfilJTilIDilIAgbWV0YWRhdGEudHN4ICAgICAgIyBTaGFyZWQgbWV0YWRhdGEnKVxuICBsaW5lcy5wdXNoKCdgYGAnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCctIEFsbCBwYWdlIHJvdXRlcyBtdXN0IGJlIGluc2lkZSBhIHJvdXRlIGdyb3VwIChwYXJlbnRoZXNlcyBmb2xkZXIpJylcbiAgbGluZXMucHVzaCgnLSBOZXZlciBjcmVhdGUgcm91dGVzIGRpcmVjdGx5IHVuZGVyIGBzcmMvYXBwL2AgKGV4Y2VwdCBgYXBpL2AsIHJvb3QgZmlsZXMpJylcbiAgbGluZXMucHVzaCgnLSBOZXcgcm91dGUgZ3JvdXBzIGFyZSBhbGxvd2VkIGZyZWVseSB3aGVuIGEgbmV3IGxheW91dCB2YXJpYW50IGlzIG5lZWRlZCcpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgbGluZXMucHVzaCgnIyMjIEZpbGUgU3RydWN0dXJlIFJ1bGVzJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnKipCbG9ja3M6KionKVxuICBsaW5lcy5wdXNoKCctIEFsd2F5cyBzaW5nbGUgZmlsZXMgZGlyZWN0bHkgaW4gYHNyYy9ibG9ja3MvYCcpXG4gIGxpbmVzLnB1c2goJy0gTmV2ZXIgY3JlYXRlIGZvbGRlcnMgaW5zaWRlIGBzcmMvYmxvY2tzL2AnKVxuICBsaW5lcy5wdXNoKCctIEV4YW1wbGU6IGBzcmMvYmxvY2tzL2hlcm8tMS50c3hgLCBgc3JjL2Jsb2Nrcy90ZXN0aW1vbmlhbC0zLnRzeGAnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcqKkNvbXBvbmVudHM6KionKVxuICBsaW5lcy5wdXNoKCctIFNpbXBsZSBjb21wb25lbnRzOiBTaW5nbGUgZmlsZSBpbiBgc3JjL2NvbXBvbmVudHMvYCcpXG4gIGxpbmVzLnB1c2goJy0gQ29tcGxleCBjb21wb25lbnRzOiBGb2xkZXIgd2l0aCBgaW5kZXgudHN4YCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGZvbGRlcnMgd2hlbiBjb21wb25lbnQgaGFzIG11bHRpcGxlIHN1Yi1maWxlcycpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgbGluZXMucHVzaCgnIyMjIERPIC0gV2hhdCBBSSBJUyBBbGxvd2VkIFRvIERvJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgZmlsZXMgb25seSBpbnNpZGUgZXhpc3RpbmcgQ2Fub24tZGVmaW5lZCB6b25lcycpXG4gIGxpbmVzLnB1c2goJy0gUGxhY2UgbmV3IGZpbGVzIGluIHRoZSB6b25lIHRoYXQgbWF0Y2hlcyB0aGVpciBhcmNoaXRlY3R1cmFsIHJvbGUnKVxuICBsaW5lcy5wdXNoKCctIEZvbGxvdyBleGlzdGluZyBmb2xkZXIgY29udmVudGlvbnMgd2l0aGluIGEgem9uZScpXG4gIGxpbmVzLnB1c2goJy0gUmV1c2UgZXhpc3RpbmcgZm9sZGVycyB3aGVuIHBvc3NpYmxlJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgbmV3IHJvdXRlIGdyb3VwcyBpbiBgc3JjL2FwcC9gIHdoZW4gbmV3IGxheW91dHMgYXJlIG5lZWRlZCcpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIG5ldyBhcmNoaXZlIGNvbnRlbnQgZm9sZGVycyAobGlrZSBgYmxvZy9gLCBgcG9ydGZvbGlvL2ApIGluIGAvc3JjYCcpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIGRvdGZpbGVzL2RpcmVjdG9yaWVzIGF0IHByb2plY3Qgcm9vdCAoYC5naXRodWIvYCwgYC5jdXJzb3IvYCwgZXRjLiknKVxuICBsaW5lcy5wdXNoKCctIEFzayBmb3IgY29uZmlybWF0aW9uIGlmIHRoZSBjb3JyZWN0IHpvbmUgaXMgYW1iaWd1b3VzJylcbiAgbGluZXMucHVzaCgnJylcblxuICBsaW5lcy5wdXNoKCcjIyMgRE8gTk9UIC0gV2hhdCBBSSBJcyBGb3JiaWRkZW4gVG8gRG8nKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBuZXcgdG9wLWxldmVsIGRpcmVjdG9yaWVzIChleGNlcHQgZG90ZmlsZXMpJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgbmV3IGZvbGRlcnMgaW4gYC9zcmNgIChleGNlcHQgYXJjaGl2ZSBjb250ZW50IG9yIHJvdXRlIGdyb3VwcyknKVxuICBsaW5lcy5wdXNoKCctIFBsYWNlIGZpbGVzIG91dHNpZGUgQ2Fub24tZGVmaW5lZCB6b25lcycpXG4gIGxpbmVzLnB1c2goJy0gTWl4IHJlc3BvbnNpYmlsaXRpZXMgYWNyb3NzIHpvbmVzIChjb21wb25lbnRzIGltcG9ydGluZyBibG9ja3MsIGV0Yy4pJylcbiAgbGluZXMucHVzaCgnLSBSZW9yZ2FuaXplIG9yIG1vdmUgZm9sZGVycyB3aXRob3V0IGV4cGxpY2l0IGluc3RydWN0aW9uJylcbiAgbGluZXMucHVzaCgnLSBJbnZlbnQgbmV3IG9yZ2FuaXphdGlvbmFsIGNvbnZlbnRpb25zJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgcGxhY2Vob2xkZXIgb3Igc3BlY3VsYXRpdmUgZmlsZXMnKVxuICBsaW5lcy5wdXNoKCctIEltcG9ydCBmcm9tIGBfc2NyaXB0cy9gIG9yIGBfZGF0YS9gIGluIHJ1bnRpbWUgY29kZScpXG4gIGxpbmVzLnB1c2goJy0gTWFudWFsbHkgZWRpdCBmaWxlcyBpbiBgX2RhdGEvYCAoZ2VuZXJhdGVkIG9ubHkpJylcbiAgbGluZXMucHVzaCgnJylcblxuICAvLyBQb3N0LWVkaXQgdmVyaWZpY2F0aW9uXG4gIGxpbmVzLnB1c2goJyMjIFBvc3QtRWRpdCBWZXJpZmljYXRpb24nKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdBZnRlciBlZGl0aW5nIGZpbGVzOicpXG4gIGxpbmVzLnB1c2goJzEuIFJ1biBgbnBtIHJ1biBsaW50YCB0byBjaGVjayBmb3IgZXJyb3JzJylcbiAgbGluZXMucHVzaCgnMi4gRml4IGFueSB2aW9sYXRpb25zIGJlZm9yZSBjb21taXR0aW5nJylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnTm90ZTogT25seSBsaW50IGZpbGVzIHlvdSBlZGl0ZWQsIG5vdCB0aGUgZW50aXJlIGNvZGViYXNlLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpXG59XG5cbmV4cG9ydCBhc3luYyBmdW5jdGlvbiBnZW5lcmF0ZShvcHRpb25zOiBHZW5lcmF0ZU9wdGlvbnMpOiBQcm9taXNlPHZvaWQ+IHtcbiAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQ3Vyc29ycnVsZXMoKVxuXG4gIGlmIChvcHRpb25zLm91dHB1dCA9PT0gJy0nKSB7XG4gICAgLy8gT3V0cHV0IHRvIHN0ZG91dFxuICAgIGNvbnNvbGUubG9nKGNvbnRlbnQpXG4gIH0gZWxzZSB7XG4gICAgLy8gV3JpdGUgdG8gZmlsZVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3B0aW9ucy5vdXRwdXQpXG4gICAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBjb250ZW50LCAndXRmLTgnKVxuICAgIGNvbnNvbGUubG9nKGDinJMgR2VuZXJhdGVkICR7b3B0aW9ucy5vdXRwdXR9IGZyb20gQ2Fub24gdiR7dmVyc2lvbn1gKVxuICAgIGNvbnNvbGUubG9nKGAgICR7cGF0dGVybnMubGVuZ3RofSBwYXR0ZXJucywgJHtndWFyYW50ZWVzLmxlbmd0aH0gZ3VhcmFudGVlc2ApXG4gIH1cbn1cbiJdfQ==
|
|
509
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZ2VuZXJhdGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY2xpL2NvbW1hbmRzL2dlbmVyYXRlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sS0FBSyxFQUFFLE1BQU0sSUFBSSxDQUFBO0FBQ3hCLE9BQU8sS0FBSyxJQUFJLE1BQU0sTUFBTSxDQUFBO0FBQzVCLE9BQU8sRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxNQUFNLGdCQUFnQixDQUFBO0FBQzlELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFVekM7O0dBRUc7QUFDSCxTQUFTLFlBQVksQ0FBQyxRQUFnQjtJQUNwQyxNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFBO0lBQ2xELElBQUksSUFBSSxLQUFLLFdBQVc7UUFBRSxPQUFPLFFBQVEsQ0FBQTtJQUN6QyxJQUFJLElBQUksS0FBSyx5QkFBeUI7UUFBRSxPQUFPLFNBQVMsQ0FBQTtJQUN4RCxPQUFPLGFBQWEsQ0FBQTtBQUN0QixDQUFDO0FBRUQ7O0dBRUc7QUFDSCxTQUFTLGFBQWE7SUFDcEIsT0FBTztRQUNMLEVBQUUsTUFBTSxFQUFFLGNBQWMsRUFBRSxNQUFNLEVBQUUsYUFBYSxFQUFFO1FBQ2pELEVBQUUsTUFBTSxFQUFFLFdBQVcsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO1FBQ3pDLEVBQUUsTUFBTSxFQUFFLGlDQUFpQyxFQUFFLE1BQU0sRUFBRSxTQUFTLEVBQUU7S0FDakUsQ0FBQTtBQUNILENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLFdBQW1CO0lBQzFDLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLElBQUksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLHFDQUFxQyxFQUFFLFdBQVcsQ0FBQztRQUM1RSwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLEVBQUUsV0FBVyxDQUFDO0tBQ3pELENBQUE7SUFFRCxLQUFLLE1BQU0sUUFBUSxJQUFJLGFBQWEsRUFBRSxDQUFDO1FBQ3JDLElBQUksRUFBRSxDQUFDLFVBQVUsQ0FBQyxRQUFRLENBQUMsRUFBRSxDQUFDO1lBQzVCLE9BQU8sRUFBRSxDQUFDLFlBQVksQ0FBQyxRQUFRLEVBQUUsT0FBTyxDQUFDLENBQUE7UUFDM0MsQ0FBQztJQUNILENBQUM7SUFFRCxPQUFPLElBQUksQ0FBQTtBQUNiLENBQUM7QUFFRDs7R0FFRztBQUNILFNBQVMsZUFBZSxDQUFDLE9BQWU7SUFDdEMsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFBO0lBQ3pCLE1BQU0sR0FBRyxHQUFhLEVBQUUsQ0FBQTtJQUV4QixNQUFNLFNBQVMsR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDL0QsTUFBTSxRQUFRLEdBQUcsT0FBTyxDQUFDLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFBO0lBRTdELElBQUksU0FBUyxFQUFFLENBQUM7UUFDZCxLQUFLLE1BQU0sS0FBSyxJQUFJLFNBQVMsRUFBRSxDQUFDO1lBQzlCLE1BQU0sSUFBSSxHQUFHLEtBQUssQ0FBQyxPQUFPLENBQUMsZUFBZSxFQUFFLEVBQUUsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFBO1lBQ3RELElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7UUFDakIsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFFBQVEsRUFBRSxDQUFDO1FBQ2IsS0FBSyxNQUFNLEtBQUssSUFBSSxRQUFRLEVBQUUsQ0FBQztZQUM3QixNQUFNLElBQUksR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDLGNBQWMsRUFBRSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQTtZQUNyRCxHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFBO1FBQ2hCLENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsQ0FBQTtBQUN0QixDQUFDO0FBRUQsNkVBQTZFO0FBRTdFLFNBQVMsY0FBYyxDQUFDLE1BQW9CO0lBQzFDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztRQUN4QixLQUFLLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7UUFDekQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsdUNBQXVDLE9BQU8seUJBQXlCLENBQUMsQ0FBQTtRQUNuRixLQUFLLENBQUMsSUFBSSxDQUFDLDhDQUE4QyxDQUFDLENBQUE7SUFDNUQsQ0FBQztTQUFNLElBQUksTUFBTSxLQUFLLFNBQVMsRUFBRSxDQUFDO1FBQ2hDLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLE9BQU8seUJBQXlCLENBQUMsQ0FBQTtRQUMvRCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1FBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxnRkFBZ0YsQ0FBQyxDQUFBO1FBQzVGLEtBQUssQ0FBQyxJQUFJLENBQUMsNENBQTRDLENBQUMsQ0FBQTtJQUMxRCxDQUFDO1NBQU0sQ0FBQztRQUNOLEtBQUssQ0FBQyxJQUFJLENBQUMsbUJBQW1CLE9BQU8sYUFBYSxDQUFDLENBQUE7UUFDbkQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtRQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0ZBQWdGLENBQUMsQ0FBQTtRQUM1RixLQUFLLENBQUMsSUFBSSxDQUFDLDRDQUE0QyxDQUFDLENBQUE7SUFDMUQsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLGlCQUFpQjtJQUN4QixPQUFPO1FBQ0wsZUFBZTtRQUNmLEVBQUU7UUFDRiw4QkFBOEI7UUFDOUIsWUFBWTtRQUNaLGNBQWM7UUFDZCxtQkFBbUI7UUFDbkIsb0NBQW9DO1FBQ3BDLEVBQUU7S0FDSCxDQUFBO0FBQ0gsQ0FBQztBQUVELFNBQVMsd0JBQXdCLENBQUMsTUFBb0I7SUFDcEQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLE1BQU0sZ0JBQWdCLEdBQUcsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQyxXQUFXLEtBQUssUUFBUSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQTtJQUVuRixLQUFLLENBQUMsSUFBSSxDQUFDLCtCQUErQixDQUFDLENBQUE7SUFDM0MsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsNkZBQTZGLENBQUMsQ0FBQTtJQUN6RyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsSUFBSSxNQUFNLEtBQUssUUFBUSxFQUFFLENBQUM7UUFDeEIsbURBQW1EO1FBQ25ELEtBQUssTUFBTSxPQUFPLElBQUksZ0JBQWdCLEVBQUUsQ0FBQztZQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sT0FBTyxDQUFDLEVBQUUsS0FBSyxPQUFPLENBQUMsS0FBSyxVQUFVLE9BQU8sQ0FBQyxJQUFJLFFBQVEsT0FBTyxDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDaEcsQ0FBQztRQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEIsQ0FBQztTQUFNLENBQUM7UUFDTix5Q0FBeUM7UUFDekMsS0FBSyxNQUFNLE9BQU8sSUFBSSxnQkFBZ0IsRUFBRSxDQUFDO1lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1lBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7WUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtZQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO1lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyx3QkFBd0IsT0FBTyxDQUFDLElBQUksSUFBSSxDQUFDLENBQUE7WUFDcEQsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsT0FBTyxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUE7WUFDakQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtZQUVkLElBQUksTUFBTSxLQUFLLGFBQWEsRUFBRSxDQUFDO2dCQUM3QixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFBO2dCQUM3QyxJQUFJLE9BQU8sRUFBRSxDQUFDO29CQUNaLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFBO29CQUM5QyxJQUFJLEdBQUcsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ25CLEtBQUssQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUE7d0JBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7d0JBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDbEIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDaEIsQ0FBQztvQkFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7d0JBQ3BCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7d0JBQ3ZCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7d0JBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQTt3QkFDbkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtvQkFDaEIsQ0FBQztnQkFDSCxDQUFDO1lBQ0gsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyxtQkFBbUI7SUFDMUIsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLE1BQU0sV0FBVyxHQUFHLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsV0FBVyxLQUFLLGVBQWUsQ0FBQyxDQUFBO0lBRTNFLEtBQUssQ0FBQyxJQUFJLENBQUMsMkJBQTJCLENBQUMsQ0FBQTtJQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxtRUFBbUUsQ0FBQyxDQUFBO0lBQy9FLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxLQUFLLE1BQU0sT0FBTyxJQUFJLFdBQVcsRUFBRSxDQUFDO1FBQ2xDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxPQUFPLENBQUMsRUFBRSxLQUFLLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFBO1FBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsQ0FBQTtRQUMzQixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2hCLENBQUM7SUFFRCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLGtCQUFrQjtJQUN6QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUE7SUFFMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxDQUFBO0lBQ2pDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7SUFDakUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLEtBQUssTUFBTSxTQUFTLElBQUksVUFBVSxFQUFFLENBQUM7UUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLFNBQVMsQ0FBQyxJQUFJLE9BQU8sU0FBUyxDQUFDLEVBQUUsZUFBZSxTQUFTLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDcEcsQ0FBQztJQUNELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLDBCQUEwQixDQUFDLE1BQWtDO0lBQ3BFLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixLQUFLLENBQUMsSUFBSSxDQUFDLDhCQUE4QixDQUFDLENBQUE7SUFDMUMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLElBQUksTUFBTSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUMvQixLQUFLLE1BQU0sSUFBSSxJQUFJLE1BQU0sQ0FBQyxVQUFVLEVBQUUsQ0FBQztZQUNyQyxNQUFNLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsYUFBYSxJQUFJLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFBO1lBQ3BHLE1BQU0sT0FBTyxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLEtBQUssSUFBSSxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUE7WUFDcEQsS0FBSyxDQUFDLElBQUksQ0FBQyxPQUFPLElBQUksQ0FBQyxJQUFJLEtBQUssUUFBUSxHQUFHLE9BQU8sRUFBRSxDQUFDLENBQUE7UUFDdkQsQ0FBQztJQUNILENBQUM7U0FBTSxDQUFDO1FBQ04scUNBQXFDO1FBQ3JDLEtBQUssQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQTtRQUM1QixLQUFLLENBQUMsSUFBSSxDQUFDLHFGQUFxRixDQUFDLENBQUE7UUFDakcsS0FBSyxDQUFDLElBQUksQ0FBQyxpRkFBaUYsQ0FBQyxDQUFBO1FBQzdGLEtBQUssQ0FBQyxJQUFJLENBQUMsNkVBQTZFLENBQUMsQ0FBQTtRQUN6RixLQUFLLENBQUMsSUFBSSxDQUFDLDZFQUE2RSxDQUFDLENBQUE7UUFDekYsS0FBSyxDQUFDLElBQUksQ0FBQyx3RkFBd0YsQ0FBQyxDQUFBO1FBQ3BHLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFBO1FBQ3hCLEtBQUssQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtRQUNwRCxLQUFLLENBQUMsSUFBSSxDQUFDLDBEQUEwRCxDQUFDLENBQUE7UUFDdEUsS0FBSyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO1FBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7UUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7UUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQywwRUFBMEUsQ0FBQyxDQUFBO1FBQ3RGLEtBQUssQ0FBQyxJQUFJLENBQUMsaUNBQWlDLENBQUMsQ0FBQTtJQUMvQyxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQVMsb0JBQW9CLENBQUMsTUFBa0M7SUFDOUQsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBRTFCLEtBQUssQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUE7SUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLCtCQUErQjtJQUMvQixLQUFLLENBQUMsSUFBSSxDQUFDLHdEQUF3RCxDQUFDLENBQUE7SUFDcEUsS0FBSyxDQUFDLElBQUksQ0FBQyxxRkFBcUYsQ0FBQyxDQUFBO0lBQ2pHLEtBQUssQ0FBQyxJQUFJLENBQUMsb0VBQW9FLENBQUMsQ0FBQTtJQUNoRixLQUFLLENBQUMsSUFBSSxDQUFDLHVFQUF1RSxDQUFDLENBQUE7SUFDbkYsS0FBSyxDQUFDLElBQUksQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO0lBQzdELEtBQUssQ0FBQyxJQUFJLENBQUMsNkRBQTZELENBQUMsQ0FBQTtJQUN6RSxLQUFLLENBQUMsSUFBSSxDQUFDLGlGQUFpRixDQUFDLENBQUE7SUFDN0YsS0FBSyxDQUFDLElBQUksQ0FBQyw0RUFBNEUsQ0FBQyxDQUFBO0lBQ3hGLEtBQUssQ0FBQyxJQUFJLENBQUMsaUVBQWlFLENBQUMsQ0FBQTtJQUU3RSwwQkFBMEI7SUFDMUIsSUFBSSxNQUFNLEVBQUUsS0FBSyxFQUFFLENBQUM7UUFDbEIsS0FBSyxNQUFNLElBQUksSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEMsSUFBSSxJQUFJLENBQUMsSUFBSSxLQUFLLE9BQU8sRUFBRSxDQUFDO2dCQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7WUFDOUIsQ0FBQztRQUNILENBQUM7SUFDSCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQVMscUJBQXFCO0lBQzVCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixLQUFLLENBQUMsSUFBSSxDQUFDLDRCQUE0QixDQUFDLENBQUE7SUFDeEMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsa0hBQWtILENBQUMsQ0FBQTtJQUM5SCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsS0FBSyxDQUFDLElBQUksQ0FBQyw4QkFBOEIsQ0FBQyxDQUFBO0lBQzFDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDbEIsS0FBSyxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO0lBQ2hGLEtBQUssQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQTtJQUM3RCxLQUFLLENBQUMsSUFBSSxDQUFDLHlEQUF5RCxDQUFDLENBQUE7SUFDckUsS0FBSyxDQUFDLElBQUksQ0FBQyw0Q0FBNEMsQ0FBQyxDQUFBO0lBQ3hELEtBQUssQ0FBQyxJQUFJLENBQUMsd0NBQXdDLENBQUMsQ0FBQTtJQUNwRCxLQUFLLENBQUMsSUFBSSxDQUFDLDBDQUEwQyxDQUFDLENBQUE7SUFDdEQsS0FBSyxDQUFDLElBQUksQ0FBQywrQ0FBK0MsQ0FBQyxDQUFBO0lBQzNELEtBQUssQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtJQUMvQyxLQUFLLENBQUMsSUFBSSxDQUFDLHNDQUFzQyxDQUFDLENBQUE7SUFDbEQsS0FBSyxDQUFDLElBQUksQ0FBQyx1Q0FBdUMsQ0FBQyxDQUFBO0lBQ25ELEtBQUssQ0FBQyxJQUFJLENBQUMsa0NBQWtDLENBQUMsQ0FBQTtJQUM5QyxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxLQUFLLENBQUMsSUFBSSxDQUFDLDBCQUEwQixDQUFDLENBQUE7SUFDdEMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQTtJQUN2RixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQTtJQUNqQixLQUFLLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFBO0lBQ3RCLEtBQUssQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQTtJQUNyRSxLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLENBQUE7SUFDaEMsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsd0RBQXdELENBQUMsQ0FBQTtJQUNwRSxLQUFLLENBQUMsSUFBSSxDQUFDLDhEQUE4RCxDQUFDLENBQUE7SUFDMUUsS0FBSyxDQUFDLElBQUksQ0FBQyxxQ0FBcUMsQ0FBQyxDQUFBO0lBQ2pELEtBQUssQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxDQUFBO0lBQ2pCLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHFFQUFxRSxDQUFDLENBQUE7SUFDakYsS0FBSyxDQUFDLElBQUksQ0FBQyw2RUFBNkUsQ0FBQyxDQUFBO0lBQ3pGLEtBQUssQ0FBQyxJQUFJLENBQUMsMkVBQTJFLENBQUMsQ0FBQTtJQUN2RixLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsS0FBSyxDQUFDLElBQUksQ0FBQywwQkFBMEIsQ0FBQyxDQUFBO0lBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFBO0lBQ3pCLEtBQUssQ0FBQyxJQUFJLENBQUMsaURBQWlELENBQUMsQ0FBQTtJQUM3RCxLQUFLLENBQUMsSUFBSSxDQUFDLDZDQUE2QyxDQUFDLENBQUE7SUFDekQsS0FBSyxDQUFDLElBQUksQ0FBQyxvRUFBb0UsQ0FBQyxDQUFBO0lBQ2hGLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLGlCQUFpQixDQUFDLENBQUE7SUFDN0IsS0FBSyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQ25FLEtBQUssQ0FBQyxJQUFJLENBQUMsK0NBQStDLENBQUMsQ0FBQTtJQUMzRCxLQUFLLENBQUMsSUFBSSxDQUFDLHFEQUFxRCxDQUFDLENBQUE7SUFDakUsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLEtBQUssQ0FBQyxJQUFJLENBQUMsbUNBQW1DLENBQUMsQ0FBQTtJQUMvQyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQ2QsS0FBSyxDQUFDLElBQUksQ0FBQyx5REFBeUQsQ0FBQyxDQUFBO0lBQ3JFLEtBQUssQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQTtJQUNqRixLQUFLLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxDQUFDLENBQUE7SUFDaEUsS0FBSyxDQUFDLElBQUksQ0FBQyx3Q0FBd0MsQ0FBQyxDQUFBO0lBQ3BELEtBQUssQ0FBQyxJQUFJLENBQUMscUVBQXFFLENBQUMsQ0FBQTtJQUNqRixLQUFLLENBQUMsSUFBSSxDQUFDLDZFQUE2RSxDQUFDLENBQUE7SUFDekYsS0FBSyxDQUFDLElBQUksQ0FBQyw4RUFBOEUsQ0FBQyxDQUFBO0lBQzFGLEtBQUssQ0FBQyxJQUFJLENBQUMseURBQXlELENBQUMsQ0FBQTtJQUNyRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsS0FBSyxDQUFDLElBQUksQ0FBQyx5Q0FBeUMsQ0FBQyxDQUFBO0lBQ3JELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHNEQUFzRCxDQUFDLENBQUE7SUFDbEUsS0FBSyxDQUFDLElBQUksQ0FBQyx5RUFBeUUsQ0FBQyxDQUFBO0lBQ3JGLEtBQUssQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLHlFQUF5RSxDQUFDLENBQUE7SUFDckYsS0FBSyxDQUFDLElBQUksQ0FBQywyREFBMkQsQ0FBQyxDQUFBO0lBQ3ZFLEtBQUssQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUNyRCxLQUFLLENBQUMsSUFBSSxDQUFDLDJDQUEyQyxDQUFDLENBQUE7SUFDdkQsS0FBSyxDQUFDLElBQUksQ0FBQyx1REFBdUQsQ0FBQyxDQUFBO0lBQ25FLEtBQUssQ0FBQyxJQUFJLENBQUMsb0RBQW9ELENBQUMsQ0FBQTtJQUNoRSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyxvQkFBb0IsQ0FBQyxNQUFrQztJQUM5RCxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUE7SUFFMUIsS0FBSyxDQUFDLElBQUksQ0FBQywyQkFBMkIsQ0FBQyxDQUFBO0lBQ3ZDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHNCQUFzQixDQUFDLENBQUE7SUFFbEMsSUFBSSxNQUFNLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxDQUFDO1FBQ2pDLElBQUksSUFBSSxHQUFHLENBQUMsQ0FBQTtRQUNaLEtBQUssTUFBTSxHQUFHLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3RDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxJQUFJLFdBQVcsR0FBRyxJQUFJLENBQUMsQ0FBQTtZQUNyQyxJQUFJLEVBQUUsQ0FBQTtRQUNSLENBQUM7UUFDRCxLQUFLLENBQUMsSUFBSSxDQUFDLEdBQUcsSUFBSSx3Q0FBd0MsQ0FBQyxDQUFBO0lBQzdELENBQUM7U0FBTSxDQUFDO1FBQ04sS0FBSyxDQUFDLElBQUksQ0FBQywyQ0FBMkMsQ0FBQyxDQUFBO1FBQ3ZELEtBQUssQ0FBQyxJQUFJLENBQUMseUNBQXlDLENBQUMsQ0FBQTtJQUN2RCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsNERBQTRELENBQUMsQ0FBQTtJQUN4RSxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsNkVBQTZFO0FBRTdFLFNBQVMsb0JBQW9CLENBQUMsTUFBa0M7SUFDOUQsSUFBSSxDQUFDLE1BQU0sRUFBRSxjQUFjLEVBQUUsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRTlDLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQTtJQUUxQixLQUFLLENBQUMsSUFBSSxDQUFDLCtDQUErQyxDQUFDLENBQUE7SUFDM0QsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsMkNBQTJDLENBQUMsQ0FBQTtJQUN2RCxLQUFLLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFBO0lBRTNCLEtBQUssTUFBTSxJQUFJLElBQUksTUFBTSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3pDLEtBQUssQ0FBQyxJQUFJLENBQUMsT0FBTyxJQUFJLENBQUMsSUFBSSxVQUFVLElBQUksQ0FBQyxPQUFPLFFBQVEsSUFBSSxDQUFDLE9BQU8sSUFBSSxDQUFDLENBQUE7SUFDNUUsQ0FBQztJQUVELEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxPQUFPLEtBQUssQ0FBQTtBQUNkLENBQUM7QUFFRCxTQUFTLHFCQUFxQixDQUFDLE1BQWtDO0lBQy9ELElBQUksQ0FBQyxNQUFNLEVBQUUsYUFBYSxFQUFFLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUU3QyxNQUFNLEtBQUssR0FBYSxFQUFFLENBQUE7SUFFMUIsS0FBSyxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFBO0lBQy9CLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLHVCQUF1QixDQUFDLENBQUE7SUFDbkMsS0FBSyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQTtJQUV2QixLQUFLLE1BQU0sR0FBRyxJQUFJLE1BQU0sQ0FBQyxhQUFhLEVBQUUsQ0FBQztRQUN2QyxLQUFLLENBQUMsSUFBSSxDQUFDLE9BQU8sR0FBRyxDQUFDLE1BQU0sUUFBUSxHQUFHLENBQUMsV0FBVyxJQUFJLENBQUMsQ0FBQTtJQUMxRCxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQVMsbUJBQW1CLENBQUMsTUFBa0M7SUFDN0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxXQUFXO1FBQUUsT0FBTyxFQUFFLENBQUE7SUFFbkMsTUFBTSxLQUFLLEdBQWEsRUFBRSxDQUFBO0lBQzFCLE1BQU0sRUFBRSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUE7SUFFN0IsS0FBSyxDQUFDLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxDQUFBO0lBQ25DLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDZCxLQUFLLENBQUMsSUFBSSxDQUFDLCtFQUErRSxDQUFDLENBQUE7SUFDM0YsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzVFLENBQUM7SUFDRCxJQUFJLEVBQUUsQ0FBQyxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDcEIsS0FBSyxDQUFDLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDdEUsQ0FBQztJQUNELElBQUksRUFBRSxDQUFDLE9BQU8sRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUN2QixLQUFLLENBQUMsSUFBSSxDQUFDLG9EQUFvRCxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBQzlHLENBQUM7SUFDRCxJQUFJLEVBQUUsQ0FBQyxPQUFPLEVBQUUsTUFBTSxFQUFFLENBQUM7UUFDdkIsS0FBSyxDQUFDLElBQUksQ0FBQyxrQkFBa0IsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUM1RSxDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLEtBQUssQ0FBQyxJQUFJLENBQUMsd0ZBQXdGLENBQUMsQ0FBQTtJQUNwRyxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFBO0lBRWQsT0FBTyxLQUFLLENBQUE7QUFDZCxDQUFDO0FBRUQsU0FBUyx1QkFBdUIsQ0FBQyxNQUFrQztJQUNqRSxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUs7UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUU3QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUE7SUFDMUIsTUFBTSxFQUFFLEdBQUcsTUFBTSxDQUFDLEtBQUssQ0FBQTtJQUV2QixLQUFLLENBQUMsSUFBSSxDQUFDLHFCQUFxQixDQUFDLENBQUE7SUFDakMsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLENBQUMsT0FBTyxlQUFlLEVBQUUsQ0FBQyxJQUFJLG1CQUFtQixFQUFFLENBQUMsV0FBVyxvQkFBb0IsRUFBRSxDQUFDLFlBQVksS0FBSyxDQUFDLENBQUE7SUFDeEgsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUVkLElBQUksRUFBRSxDQUFDLFVBQVUsRUFBRSxNQUFNLEVBQUUsQ0FBQztRQUMxQixLQUFLLENBQUMsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUMsVUFBVSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQ2hGLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFDaEIsQ0FBQztJQUVELE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELFNBQVMscUJBQXFCLENBQUMsTUFBa0M7SUFDL0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxLQUFLLEVBQUUsTUFBTTtRQUFFLE9BQU8sRUFBRSxDQUFBO0lBRXJDLE1BQU0sT0FBTyxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDLElBQUksS0FBSyxJQUFJLENBQUMsQ0FBQTtJQUN6RCxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU07UUFBRSxPQUFPLEVBQUUsQ0FBQTtJQUU5QixNQUFNLEtBQUssR0FBYSxFQUFFLENBQUE7SUFFMUIsS0FBSyxDQUFDLElBQUksQ0FBQyw0QkFBNEIsQ0FBQyxDQUFBO0lBQ3hDLEtBQUssQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUE7SUFFZCxLQUFLLE1BQU0sSUFBSSxJQUFJLE9BQU8sRUFBRSxDQUFDO1FBQzNCLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQTtJQUM5QixDQUFDO0lBRUQsS0FBSyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQTtJQUNkLE9BQU8sS0FBSyxDQUFBO0FBQ2QsQ0FBQztBQUVELDZFQUE2RTtBQUU3RSxTQUFTLG1CQUFtQixDQUFDLE1BQWtDO0lBQzdELE1BQU0sS0FBSyxHQUFhO1FBQ3RCLEdBQUcsY0FBYyxDQUFDLGFBQWEsQ0FBQztRQUNoQyxHQUFHLGlCQUFpQixFQUFFO1FBQ3RCLEdBQUcsd0JBQXdCLENBQUMsYUFBYSxDQUFDO1FBQzFDLEdBQUcsbUJBQW1CLEVBQUU7UUFDeEIsR0FBRyxrQkFBa0IsRUFBRTtRQUN2QixHQUFHLDBCQUEwQixDQUFDLE1BQU0sQ0FBQztRQUNyQyxHQUFHLG9CQUFvQixDQUFDLE1BQU0sQ0FBQztRQUMvQixHQUFHLHFCQUFxQixFQUFFO1FBQzFCLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0tBQ2hDLENBQUE7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDekIsQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsTUFBa0M7SUFDMUQsTUFBTSxLQUFLLEdBQWE7UUFDdEIsR0FBRyxjQUFjLENBQUMsUUFBUSxDQUFDO1FBQzNCLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO1FBQy9CLEdBQUcscUJBQXFCLENBQUMsTUFBTSxDQUFDO1FBQ2hDLEdBQUcsd0JBQXdCLENBQUMsUUFBUSxDQUFDO1FBQ3JDLEdBQUcsbUJBQW1CLEVBQUU7UUFDeEIsR0FBRyxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7UUFDOUIsR0FBRywwQkFBMEIsQ0FBQyxNQUFNLENBQUM7UUFDckMsR0FBRyx1QkFBdUIsQ0FBQyxNQUFNLENBQUM7UUFDbEMsR0FBRyxxQkFBcUIsQ0FBQyxNQUFNLENBQUM7UUFDaEMsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7UUFDL0IsR0FBRyxvQkFBb0IsQ0FBQyxNQUFNLENBQUM7S0FDaEMsQ0FBQTtJQUVELE9BQU8sS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQTtBQUN6QixDQUFDO0FBRUQsU0FBUywyQkFBMkIsQ0FBQyxNQUFrQztJQUNyRSxNQUFNLEtBQUssR0FBYTtRQUN0QixHQUFHLGNBQWMsQ0FBQyxTQUFTLENBQUM7UUFDNUIsR0FBRyxpQkFBaUIsRUFBRTtRQUN0QixHQUFHLHdCQUF3QixDQUFDLFNBQVMsQ0FBQztRQUN0QyxHQUFHLG1CQUFtQixFQUFFO1FBQ3hCLEdBQUcsMEJBQTBCLENBQUMsTUFBTSxDQUFDO1FBQ3JDLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO1FBQy9CLEdBQUcsb0JBQW9CLENBQUMsTUFBTSxDQUFDO0tBQ2hDLENBQUE7SUFFRCxPQUFPLEtBQUssQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUE7QUFDekIsQ0FBQztBQUVELFNBQVMsZUFBZSxDQUFDLE1BQW9CLEVBQUUsTUFBa0M7SUFDL0UsUUFBUSxNQUFNLEVBQUUsQ0FBQztRQUNmLEtBQUssUUFBUTtZQUNYLE9BQU8sZ0JBQWdCLENBQUMsTUFBTSxDQUFDLENBQUE7UUFDakMsS0FBSyxTQUFTO1lBQ1osT0FBTywyQkFBMkIsQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM1QyxLQUFLLGFBQWEsQ0FBQztRQUNuQjtZQUNFLE9BQU8sbUJBQW1CLENBQUMsTUFBTSxDQUFDLENBQUE7SUFDdEMsQ0FBQztBQUNILENBQUM7QUFFRCxTQUFTLFdBQVcsQ0FBQyxPQUFlLEVBQUUsVUFBa0I7SUFDdEQsTUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsQ0FBQTtJQUNwQyxJQUFJLENBQUMsRUFBRSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDO1FBQ3hCLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLEVBQUUsU0FBUyxFQUFFLElBQUksRUFBRSxDQUFDLENBQUE7SUFDeEMsQ0FBQztJQUNELEVBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQTtBQUNoRCxDQUFDO0FBRUQsNkVBQTZFO0FBRTdFLE1BQU0sQ0FBQyxLQUFLLFVBQVUsUUFBUSxDQUFDLE9BQXdCO0lBQ3JELE1BQU0sTUFBTSxHQUFHLFVBQVUsRUFBRSxDQUFBO0lBRTNCLElBQUksT0FBTyxDQUFDLE1BQU0sS0FBSyxLQUFLLEVBQUUsQ0FBQztRQUM3Qix1QkFBdUI7UUFDdkIsTUFBTSxPQUFPLEdBQUcsYUFBYSxFQUFFLENBQUE7UUFDL0IsS0FBSyxNQUFNLE1BQU0sSUFBSSxPQUFPLEVBQUUsQ0FBQztZQUM3QixNQUFNLE9BQU8sR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRSxNQUFNLENBQUMsQ0FBQTtZQUN0RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUE7WUFDN0QsV0FBVyxDQUFDLE9BQU8sRUFBRSxVQUFVLENBQUMsQ0FBQTtZQUNoQyxPQUFPLENBQUMsR0FBRyxDQUFDLGVBQWUsTUFBTSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUE7UUFDN0MsQ0FBQztRQUNELE9BQU8sQ0FBQyxHQUFHLENBQUMsWUFBWSxPQUFPLE1BQU0sUUFBUSxDQUFDLE1BQU0sY0FBYyxVQUFVLENBQUMsTUFBTSxhQUFhLENBQUMsQ0FBQTtRQUNqRyxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDbEQsQ0FBQztJQUNILENBQUM7U0FBTSxJQUFJLE9BQU8sQ0FBQyxNQUFNLEtBQUssR0FBRyxFQUFFLENBQUM7UUFDbEMsTUFBTSxPQUFPLEdBQUcsZUFBZSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsTUFBTSxDQUFDLENBQUE7UUFDdkQsT0FBTyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsQ0FBQTtJQUN0QixDQUFDO1NBQU0sQ0FBQztRQUNOLE1BQU0sT0FBTyxHQUFHLGVBQWUsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3ZELE1BQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsQ0FBQTtRQUM5RCxXQUFXLENBQUMsT0FBTyxFQUFFLFVBQVUsQ0FBQyxDQUFBO1FBQ2hDLE9BQU8sQ0FBQyxHQUFHLENBQUMsZUFBZSxPQUFPLENBQUMsTUFBTSxnQkFBZ0IsT0FBTyxFQUFFLENBQUMsQ0FBQTtRQUNuRSxPQUFPLENBQUMsR0FBRyxDQUFDLEtBQUssUUFBUSxDQUFDLE1BQU0sY0FBYyxVQUFVLENBQUMsTUFBTSxhQUFhLENBQUMsQ0FBQTtRQUM3RSxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLEdBQUcsQ0FBQyxzQkFBc0IsTUFBTSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUE7UUFDbEQsQ0FBQztJQUNILENBQUM7QUFDSCxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICogYXMgZnMgZnJvbSAnZnMnXG5pbXBvcnQgKiBhcyBwYXRoIGZyb20gJ3BhdGgnXG5pbXBvcnQgeyB2ZXJzaW9uLCBwYXR0ZXJucywgZ3VhcmFudGVlcyB9IGZyb20gJy4uLy4uL2luZGV4LmpzJ1xuaW1wb3J0IHsgbG9hZENvbmZpZyB9IGZyb20gJy4uL2NvbmZpZy5qcydcbmltcG9ydCB0eXBlIHsgQ2Fub25UZW1wbGF0ZUNvbmZpZyB9IGZyb20gJy4uLy4uL3R5cGVzL2NvbmZpZy5qcydcblxudHlwZSBPdXRwdXRGb3JtYXQgPSAnY3Vyc29ycnVsZXMnIHwgJ2NsYXVkZScgfCAnY29waWxvdCdcblxuaW50ZXJmYWNlIEdlbmVyYXRlT3B0aW9ucyB7XG4gIG91dHB1dDogc3RyaW5nXG4gIGZvcm1hdDogT3V0cHV0Rm9ybWF0XG59XG5cbi8qKlxuICogRGV0ZWN0IG91dHB1dCBmb3JtYXQgZnJvbSBmaWxlbmFtZVxuICovXG5mdW5jdGlvbiBkZXRlY3RGb3JtYXQoZmlsZW5hbWU6IHN0cmluZyk6IE91dHB1dEZvcm1hdCB7XG4gIGNvbnN0IGJhc2UgPSBwYXRoLmJhc2VuYW1lKGZpbGVuYW1lKS50b0xvd2VyQ2FzZSgpXG4gIGlmIChiYXNlID09PSAnY2xhdWRlLm1kJykgcmV0dXJuICdjbGF1ZGUnXG4gIGlmIChiYXNlID09PSAnY29waWxvdC1pbnN0cnVjdGlvbnMubWQnKSByZXR1cm4gJ2NvcGlsb3QnXG4gIHJldHVybiAnY3Vyc29ycnVsZXMnXG59XG5cbi8qKlxuICogR2V0IGFsbCBvdXRwdXQgdGFyZ2V0cyB3aGVuIGdlbmVyYXRpbmcgYWxsIGZpbGVzXG4gKi9cbmZ1bmN0aW9uIGdldEFsbFRhcmdldHMoKTogR2VuZXJhdGVPcHRpb25zW10ge1xuICByZXR1cm4gW1xuICAgIHsgb3V0cHV0OiAnLmN1cnNvcnJ1bGVzJywgZm9ybWF0OiAnY3Vyc29ycnVsZXMnIH0sXG4gICAgeyBvdXRwdXQ6ICdDTEFVREUubWQnLCBmb3JtYXQ6ICdjbGF1ZGUnIH0sXG4gICAgeyBvdXRwdXQ6ICcuZ2l0aHViL2NvcGlsb3QtaW5zdHJ1Y3Rpb25zLm1kJywgZm9ybWF0OiAnY29waWxvdCcgfSxcbiAgXVxufVxuXG4vKipcbiAqIFJlYWQgYSBwYXR0ZXJuIG1hcmtkb3duIGZpbGUgYW5kIGV4dHJhY3Qgc2VjdGlvbnNcbiAqL1xuZnVuY3Rpb24gcmVhZFBhdHRlcm5GaWxlKHBhdHRlcm5GaWxlOiBzdHJpbmcpOiBzdHJpbmcgfCBudWxsIHtcbiAgY29uc3QgcG9zc2libGVQYXRocyA9IFtcbiAgICBwYXRoLmpvaW4ocHJvY2Vzcy5jd2QoKSwgJ25vZGVfbW9kdWxlcy9AZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uJywgcGF0dGVybkZpbGUpLFxuICAgIC8vIEZhbGxiYWNrIGZvciBkZXZlbG9wbWVudFxuICAgIHBhdGguam9pbihpbXBvcnQubWV0YS5kaXJuYW1lLCAnLi4vLi4vLi4vJywgcGF0dGVybkZpbGUpLFxuICBdXG5cbiAgZm9yIChjb25zdCBmaWxlUGF0aCBvZiBwb3NzaWJsZVBhdGhzKSB7XG4gICAgaWYgKGZzLmV4aXN0c1N5bmMoZmlsZVBhdGgpKSB7XG4gICAgICByZXR1cm4gZnMucmVhZEZpbGVTeW5jKGZpbGVQYXRoLCAndXRmLTgnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsXG59XG5cbi8qKlxuICogRXh0cmFjdCBleGFtcGxlcyBmcm9tIHBhdHRlcm4gbWFya2Rvd25cbiAqL1xuZnVuY3Rpb24gZXh0cmFjdEV4YW1wbGVzKGNvbnRlbnQ6IHN0cmluZyk6IHsgZ29vZDogc3RyaW5nW107IGJhZDogc3RyaW5nW10gfSB7XG4gIGNvbnN0IGdvb2Q6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgYmFkOiBzdHJpbmdbXSA9IFtdXG5cbiAgY29uc3QgZ29vZE1hdGNoID0gY29udGVudC5tYXRjaCgvIyMjIEdvb2RcXHMqXFxuYGBgW1xcc1xcU10qP2BgYC9nKVxuICBjb25zdCBiYWRNYXRjaCA9IGNvbnRlbnQubWF0Y2goLyMjIyBCYWRcXHMqXFxuYGBgW1xcc1xcU10qP2BgYC9nKVxuXG4gIGlmIChnb29kTWF0Y2gpIHtcbiAgICBmb3IgKGNvbnN0IG1hdGNoIG9mIGdvb2RNYXRjaCkge1xuICAgICAgY29uc3QgY29kZSA9IG1hdGNoLnJlcGxhY2UoLyMjIyBHb29kXFxzKlxcbi8sICcnKS50cmltKClcbiAgICAgIGdvb2QucHVzaChjb2RlKVxuICAgIH1cbiAgfVxuXG4gIGlmIChiYWRNYXRjaCkge1xuICAgIGZvciAoY29uc3QgbWF0Y2ggb2YgYmFkTWF0Y2gpIHtcbiAgICAgIGNvbnN0IGNvZGUgPSBtYXRjaC5yZXBsYWNlKC8jIyMgQmFkXFxzKlxcbi8sICcnKS50cmltKClcbiAgICAgIGJhZC5wdXNoKGNvZGUpXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHsgZ29vZCwgYmFkIH1cbn1cblxuLy8g4pSA4pSA4pSAIFNoYXJlZCBzZWN0aW9uIGdlbmVyYXRvcnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIGdlbmVyYXRlSGVhZGVyKGZvcm1hdDogT3V0cHV0Rm9ybWF0KTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIGlmIChmb3JtYXQgPT09ICdjbGF1ZGUnKSB7XG4gICAgbGluZXMucHVzaChgIyBDTEFVREUubWQg4oCUIFByb2plY3QtU3BlY2lmaWMgSW50ZWxsaWdlbmNlYClcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2goYD4gQXV0by1nZW5lcmF0ZWQgZnJvbSBHYWxsb3AgQ2Fub24gdiR7dmVyc2lvbn0uIERvIG5vdCBlZGl0IG1hbnVhbGx5LmApXG4gICAgbGluZXMucHVzaChgPiBSZWdlbmVyYXRlIHdpdGg6IG5wbSBydW4gZ2VuZXJhdGU6YWktcnVsZXNgKVxuICB9IGVsc2UgaWYgKGZvcm1hdCA9PT0gJ2NvcGlsb3QnKSB7XG4gICAgbGluZXMucHVzaChgIyBHYWxsb3AgQ2Fub24gdiR7dmVyc2lvbn0gLSBDb3BpbG90IEluc3RydWN0aW9uc2ApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKCdUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uLiBEbyBub3QgZWRpdCBtYW51YWxseS4nKVxuICAgIGxpbmVzLnB1c2goJ1JlZ2VuZXJhdGUgd2l0aDogbnBtIHJ1biBnZW5lcmF0ZTphaS1ydWxlcycpXG4gIH0gZWxzZSB7XG4gICAgbGluZXMucHVzaChgIyBHYWxsb3AgQ2Fub24gdiR7dmVyc2lvbn0gLSBBSSBSdWxlc2ApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKCdUaGlzIGZpbGUgaXMgYXV0by1nZW5lcmF0ZWQgZnJvbSBAZ2FsbG9wLnNvZnR3YXJlL2Nhbm9uLiBEbyBub3QgZWRpdCBtYW51YWxseS4nKVxuICAgIGxpbmVzLnB1c2goJ1JlZ2VuZXJhdGUgd2l0aDogbnBtIHJ1biBnZW5lcmF0ZTphaS1ydWxlcycpXG4gIH1cblxuICBsaW5lcy5wdXNoKCcnKVxuICByZXR1cm4gbGluZXNcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVUZWNoU3RhY2soKTogc3RyaW5nW10ge1xuICByZXR1cm4gW1xuICAgICcjIyBUZWNoIFN0YWNrJyxcbiAgICAnJyxcbiAgICAnLSBOZXh0LmpzIDE2IHdpdGggQXBwIFJvdXRlcicsXG4gICAgJy0gUmVhY3QgMTknLFxuICAgICctIFR5cGVTY3JpcHQnLFxuICAgICctIFRhaWx3aW5kIENTUyB2NCcsXG4gICAgJy0gY2xzeCBmb3IgY29uZGl0aW9uYWwgY2xhc3MgbmFtZXMnLFxuICAgICcnLFxuICBdXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlRW5mb3JjZWRQYXR0ZXJucyhmb3JtYXQ6IE91dHB1dEZvcm1hdCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgZW5mb3JjZWRQYXR0ZXJucyA9IHBhdHRlcm5zLmZpbHRlcihwID0+IHAuZW5mb3JjZW1lbnQgPT09ICdlc2xpbnQnICYmIHAucnVsZSlcblxuICBsaW5lcy5wdXNoKCcjIyBFbmZvcmNlZCBQYXR0ZXJucyAoRVNMaW50KScpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ1RoZXNlIHBhdHRlcm5zIGFyZSBlbmZvcmNlZCBieSBgQGdhbGxvcC5zb2Z0d2FyZS9jYW5vbi9lc2xpbnRgLiBWaW9sYXRpb25zIHdpbGwgYmUgZmxhZ2dlZC4nKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGlmIChmb3JtYXQgPT09ICdjbGF1ZGUnKSB7XG4gICAgLy8gQ2xhdWRlIGNhbiBydW4gbGludCDigJQgYnJpZWYgbGlzdCB3aXRoIHJ1bGUgbmFtZXNcbiAgICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZW5mb3JjZWRQYXR0ZXJucykge1xuICAgICAgbGluZXMucHVzaChgLSAqKiR7cGF0dGVybi5pZH06ICR7cGF0dGVybi50aXRsZX0qKiDigJQgXFxgJHtwYXR0ZXJuLnJ1bGV9XFxgIOKAlCAke3BhdHRlcm4uc3VtbWFyeX1gKVxuICAgIH1cbiAgICBsaW5lcy5wdXNoKCcnKVxuICB9IGVsc2Uge1xuICAgIC8vIEN1cnNvcnJ1bGVzIGFuZCBDb3BpbG90OiBmdWxsIGV4YW1wbGVzXG4gICAgZm9yIChjb25zdCBwYXR0ZXJuIG9mIGVuZm9yY2VkUGF0dGVybnMpIHtcbiAgICAgIGxpbmVzLnB1c2goYCMjIyAke3BhdHRlcm4uaWR9OiAke3BhdHRlcm4udGl0bGV9YClcbiAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICBsaW5lcy5wdXNoKHBhdHRlcm4uc3VtbWFyeSlcbiAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICBsaW5lcy5wdXNoKGAtICoqRVNMaW50IFJ1bGU6KiogXFxgJHtwYXR0ZXJuLnJ1bGV9XFxgYClcbiAgICAgIGxpbmVzLnB1c2goYC0gKipDYXRlZ29yeToqKiAke3BhdHRlcm4uY2F0ZWdvcnl9YClcbiAgICAgIGxpbmVzLnB1c2goJycpXG5cbiAgICAgIGlmIChmb3JtYXQgPT09ICdjdXJzb3JydWxlcycpIHtcbiAgICAgICAgY29uc3QgY29udGVudCA9IHJlYWRQYXR0ZXJuRmlsZShwYXR0ZXJuLmZpbGUpXG4gICAgICAgIGlmIChjb250ZW50KSB7XG4gICAgICAgICAgY29uc3QgeyBnb29kLCBiYWQgfSA9IGV4dHJhY3RFeGFtcGxlcyhjb250ZW50KVxuICAgICAgICAgIGlmIChiYWQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnKipCYWQ6KionKVxuICAgICAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgICAgIGxpbmVzLnB1c2goYmFkWzBdKVxuICAgICAgICAgICAgbGluZXMucHVzaCgnJylcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGdvb2QubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbGluZXMucHVzaCgnKipHb29kOioqJylcbiAgICAgICAgICAgIGxpbmVzLnB1c2goJycpXG4gICAgICAgICAgICBsaW5lcy5wdXNoKGdvb2RbMF0pXG4gICAgICAgICAgICBsaW5lcy5wdXNoKCcnKVxuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBsaW5lc1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURvY1BhdHRlcm5zKCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cbiAgY29uc3QgZG9jUGF0dGVybnMgPSBwYXR0ZXJucy5maWx0ZXIocCA9PiBwLmVuZm9yY2VtZW50ID09PSAnZG9jdW1lbnRhdGlvbicpXG5cbiAgbGluZXMucHVzaCgnIyMgRG9jdW1lbnRhdGlvbiBQYXR0ZXJucycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ1RoZXNlIHBhdHRlcm5zIGFyZSBub3QgZW5mb3JjZWQgYnkgRVNMaW50IGJ1dCBzaG91bGQgYmUgZm9sbG93ZWQuJylcbiAgbGluZXMucHVzaCgnJylcblxuICBmb3IgKGNvbnN0IHBhdHRlcm4gb2YgZG9jUGF0dGVybnMpIHtcbiAgICBsaW5lcy5wdXNoKGAjIyMgJHtwYXR0ZXJuLmlkfTogJHtwYXR0ZXJuLnRpdGxlfWApXG4gICAgbGluZXMucHVzaCgnJylcbiAgICBsaW5lcy5wdXNoKHBhdHRlcm4uc3VtbWFyeSlcbiAgICBsaW5lcy5wdXNoKCcnKVxuICB9XG5cbiAgcmV0dXJuIGxpbmVzXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlR3VhcmFudGVlcygpOiBzdHJpbmdbXSB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgbGluZXMucHVzaCgnIyMgQ2Fub24gR3VhcmFudGVlcycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ0ZvbGxvd2luZyB0aGVzZSBwYXR0ZXJucyBwcm92aWRlcyB0aGVzZSBndWFyYW50ZWVzOicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgZm9yIChjb25zdCBndWFyYW50ZWUgb2YgZ3VhcmFudGVlcykge1xuICAgIGxpbmVzLnB1c2goYC0gKioke2d1YXJhbnRlZS5uYW1lfSoqICgke2d1YXJhbnRlZS5pZH0pOiBQYXR0ZXJucyAke2d1YXJhbnRlZS5wYXR0ZXJucy5qb2luKCcsICcpfWApXG4gIH1cbiAgbGluZXMucHVzaCgnJylcblxuICByZXR1cm4gbGluZXNcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVDb21wb25lbnRSZWZlcmVuY2UoY29uZmlnOiBDYW5vblRlbXBsYXRlQ29uZmlnIHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cblxuICBsaW5lcy5wdXNoKCcjIyBDb21wb25lbnQgUXVpY2sgUmVmZXJlbmNlJylcbiAgbGluZXMucHVzaCgnJylcblxuICBpZiAoY29uZmlnPy5jb21wb25lbnRzPy5sZW5ndGgpIHtcbiAgICBmb3IgKGNvbnN0IGNvbXAgb2YgY29uZmlnLmNvbXBvbmVudHMpIHtcbiAgICAgIGNvbnN0IHByb3BzU3RyID0gY29tcC5wcm9wcz8ubGVuZ3RoID8gYCAtIHByb3BzOiAke2NvbXAucHJvcHMubWFwKHAgPT4gYFxcYCR7cH1cXGBgKS5qb2luKCcsICcpfWAgOiAnJ1xuICAgICAgY29uc3Qgbm90ZVN0ciA9IGNvbXAubm90ZXMgPyBgICgke2NvbXAubm90ZXN9KWAgOiAnJ1xuICAgICAgbGluZXMucHVzaChgLSBcXGAke2NvbXAubmFtZX1cXGAke3Byb3BzU3RyfSR7bm90ZVN0cn1gKVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogaGFyZGNvZGVkIGNvbXBvbmVudCBsaXN0XG4gICAgbGluZXMucHVzaCgnIyMjIFR5cG9ncmFwaHknKVxuICAgIGxpbmVzLnB1c2goJy0gYEhlYWRpbmdgIC0gcHJvcHM6IGBhc2AsIGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgZm9udFdlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgICBsaW5lcy5wdXNoKCctIGBQYXJhZ3JhcGhgIC0gcHJvcHM6IGBjb2xvcmAsIGBtYXJnaW5gLCBgZm9udFNpemVgLCBgbGluZUhlaWdodGAsIGB0ZXh0QWxpZ25gJylcbiAgICBsaW5lcy5wdXNoKCctIGBTcGFuYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCAoaW5saW5lIHRleHQsIG1iLTAgZGVmYXVsdCknKVxuICAgIGxpbmVzLnB1c2goJy0gYExhYmVsYCAtIHByb3BzOiBgY29sb3JgLCBgbWFyZ2luYCwgYGZvbnRTaXplYCwgYGZvbnRXZWlnaHRgLCBgdGV4dEFsaWduYCcpXG4gICAgbGluZXMucHVzaCgnLSBgUXVvdGVgIC0gcHJvcHM6IGB2YXJpYW50YCwgYGNvbG9yYCwgYG1hcmdpbmAsIGBmb250U2l6ZWAsIGBmb250V2VpZ2h0YCwgYHRleHRBbGlnbmAnKVxuICAgIGxpbmVzLnB1c2goJycpXG4gICAgbGluZXMucHVzaCgnIyMjIExheW91dCcpXG4gICAgbGluZXMucHVzaCgnLSBgU2VjdGlvbmAgLSBzZW1hbnRpYyBzZWN0aW9uIHdyYXBwZXInKVxuICAgIGxpbmVzLnB1c2goJy0gYENvbHVtbnNgIC0gZ3JpZCBsYXlvdXQsIHByb3BzOiBgY29sc2AsIGBnYXBgLCBgYWxpZ25gJylcbiAgICBsaW5lcy5wdXNoKCctIGBDb2x1bW5gIC0gY29sdW1uIGNoaWxkJylcbiAgICBsaW5lcy5wdXNoKCcnKVxuICAgIGxpbmVzLnB1c2goJyMjIyBJbnRlcmFjdGl2ZScpXG4gICAgbGluZXMucHVzaCgnLSBgQnV0dG9uYCAtIHByb3BzOiBgaHJlZmAsIGB2YXJpYW50YCwgYGljb25gLCBgaWNvblBsYWNlbWVudGAsIGBtYXJnaW5gJylcbiAgICBsaW5lcy5wdXNoKCctIGBJY29uYCAtIEljb25pZnkgaWNvbiB3cmFwcGVyJylcbiAgfVxuXG4gIGxpbmVzLnB1c2goJycpXG4gIHJldHVybiBsaW5lc1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZURvTm90U2VjdGlvbihjb25maWc6IENhbm9uVGVtcGxhdGVDb25maWcgfCBudWxsKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIGxpbmVzLnB1c2goJyMjIERvIE5PVCcpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgLy8gRGVmYXVsdCBydWxlcyBhbHdheXMgcHJlc2VudFxuICBsaW5lcy5wdXNoKFwiLSBVc2UgYCd1c2UgY2xpZW50J2AgaW4gYmxvY2tzIC0gZXh0cmFjdCB0byBjb21wb25lbnRzXCIpXG4gIGxpbmVzLnB1c2goJy0gVXNlIHJhdyBgPHA+YCwgYDxzcGFuPmAsIG9yIGA8aDE+YOKAk2A8aDY+YCAtIHVzZSBQYXJhZ3JhcGgvU3Bhbi9IZWFkaW5nIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBjbGFzc05hbWUgZm9yIG1hcmdpbi9jb2xvci9mb250U2l6ZSB3aGVuIGNvbXBvbmVudCBoYXMgcHJvcHMnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBDb250YWluZXIgaW5zaWRlIFNlY3Rpb24gLSBTZWN0aW9uIGFscmVhZHkgcHJvdmlkZXMgY29udGFpbm1lbnQnKVxuICBsaW5lcy5wdXNoKCctIFVzZSBgY2xhc3NuYW1lc2AgcGFja2FnZSAtIHVzZSBgY2xzeGAgaW5zdGVhZCcpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGlubGluZSBzdHlsZXMgZm9yIGhvdmVyIHN0YXRlcyAtIHVzZSBUYWlsd2luZCBjbGFzc2VzJylcbiAgbGluZXMucHVzaCgnLSBVc2UgbmF0aXZlIGBJbnRlcnNlY3Rpb25PYnNlcnZlcmAgLSB1c2UgYHJlYWN0LWludGVyc2VjdGlvbi1vYnNlcnZlcmAgcGFja2FnZScpXG4gIGxpbmVzLnB1c2goJy0gVXNlIGlubGluZSBgPHN2Zz5gIGluIGJsb2NrcyAtIHVzZSB0aGUgSWNvbiBjb21wb25lbnQgd2l0aCBJY29uaWZ5IGljb25zJylcbiAgbGluZXMucHVzaCgnLSBVc2UgZGVlcCByZWxhdGl2ZSBpbXBvcnRzIChgLi4vLi4vYCkgLSB1c2UgYEAvYCBhbGlhcyBpbXBvcnRzJylcblxuICAvLyBUZW1wbGF0ZS1zcGVjaWZpYyBydWxlc1xuICBpZiAoY29uZmlnPy5ydWxlcykge1xuICAgIGZvciAoY29uc3QgcnVsZSBvZiBjb25maWcucnVsZXMpIHtcbiAgICAgIGlmIChydWxlLnR5cGUgPT09ICdkb05vdCcpIHtcbiAgICAgICAgbGluZXMucHVzaChgLSAke3J1bGUucnVsZX1gKVxuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGxpbmVzLnB1c2goJycpXG4gIHJldHVybiBsaW5lc1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUZpbGVBdXRob3JpdHkoKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIGxpbmVzLnB1c2goJyMjIEZpbGUgJiBGb2xkZXIgQXV0aG9yaXR5JylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnVGhlc2UgcnVsZXMgZ292ZXJuIHdoYXQgQUkgaXMgYWxsb3dlZCBhbmQgZm9yYmlkZGVuIHRvIGRvIHdoZW4gY3JlYXRpbmcsIG1vdmluZywgb3IgbW9kaWZ5aW5nIGZpbGVzIGFuZCBmb2xkZXJzLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgbGluZXMucHVzaCgnIyMjIERlZmluZWQgYC9zcmNgIFN0cnVjdHVyZScpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ2BgYCcpXG4gIGxpbmVzLnB1c2goJ3NyYy8nKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgYXBwLyAgICAgICAgICAjIFJvdXRlcywgbGF5b3V0cywgbWV0YWRhdGEgKE5leHQuanMgQXBwIFJvdXRlciknKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgYmxvY2tzLyAgICAgICAjIFBhZ2UtbGV2ZWwgY29udGVudCBzZWN0aW9ucycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBibG9nLyAgICAgICAgICMgQmxvZyBjb250ZW50IChhcmNoaXZlIGNvbnRlbnQgdHlwZSknKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgY29tcG9uZW50cy8gICAjIFJldXNhYmxlIFVJIHByaW1pdGl2ZXMnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgaG9va3MvICAgICAgICAjIEN1c3RvbSBSZWFjdCBob29rcycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCBzdHlsZXMvICAgICAgICMgQ1NTLCBUYWlsd2luZCwgZm9udHMnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgdGVtcGxhdGUvICAgICAjIFRlbXBsYXRlLWxldmVsIGNvbXBvbmVudHMnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgdG9vbHMvICAgICAgICAjIFV0aWxpdHkgdG9vbHMnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgdHlwZXMvICAgICAgICAjIFR5cGVTY3JpcHQgdHlwZXMnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgdXRpbHMvICAgICAgICAjIFV0aWxpdHkgZnVuY3Rpb25zJylcbiAgbGluZXMucHVzaCgn4pSU4pSA4pSAIHN0YXRlLnRzICAgICAgIyBHbG9iYWwgc3RhdGUnKVxuICBsaW5lcy5wdXNoKCdgYGAnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGxpbmVzLnB1c2goJyMjIyBBcHAgUm91dGVyIFN0cnVjdHVyZScpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ1JvdXRlcyBtdXN0IHVzZSBOZXh0LmpzIHJvdXRlIGdyb3Vwcy4gQXQgbWluaW11bSwgYChkZWZhdWx0KWAgbXVzdCBleGlzdDonKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdgYGAnKVxuICBsaW5lcy5wdXNoKCdzcmMvYXBwLycpXG4gIGxpbmVzLnB1c2goJ+KUnOKUgOKUgCAoZGVmYXVsdCkvICAgICAgICAjIFJlcXVpcmVkIC0gZGVmYXVsdCBsYXlvdXQgZ3JvdXAnKVxuICBsaW5lcy5wdXNoKCfilIIgICDilJzilIDilIAgbGF5b3V0LnRzeCcpXG4gIGxpbmVzLnB1c2goJ+KUgiAgIOKUlOKUgOKUgCB7cm91dGVzfS8nKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgKGhlcm8pLyAgICAgICAgICAgIyBPcHRpb25hbCAtIGhlcm8gbGF5b3V0IHZhcmlhbnQnKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgYXBpLyAgICAgICAgICAgICAgIyBBUEkgcm91dGVzIChleGNlcHRpb24gLSBubyBncm91cGluZyknKVxuICBsaW5lcy5wdXNoKCfilJzilIDilIAgbGF5b3V0LnRzeCAgICAgICAgIyBSb290IGxheW91dCcpXG4gIGxpbmVzLnB1c2goJ+KUlOKUgOKUgCBtZXRhZGF0YS50c3ggICAgICAjIFNoYXJlZCBtZXRhZGF0YScpXG4gIGxpbmVzLnB1c2goJ2BgYCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gQWxsIHBhZ2Ugcm91dGVzIG11c3QgYmUgaW5zaWRlIGEgcm91dGUgZ3JvdXAgKHBhcmVudGhlc2VzIGZvbGRlciknKVxuICBsaW5lcy5wdXNoKCctIE5ldmVyIGNyZWF0ZSByb3V0ZXMgZGlyZWN0bHkgdW5kZXIgYHNyYy9hcHAvYCAoZXhjZXB0IGBhcGkvYCwgcm9vdCBmaWxlcyknKVxuICBsaW5lcy5wdXNoKCctIE5ldyByb3V0ZSBncm91cHMgYXJlIGFsbG93ZWQgZnJlZWx5IHdoZW4gYSBuZXcgbGF5b3V0IHZhcmlhbnQgaXMgbmVlZGVkJylcbiAgbGluZXMucHVzaCgnJylcblxuICBsaW5lcy5wdXNoKCcjIyMgRmlsZSBTdHJ1Y3R1cmUgUnVsZXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCcqKkJsb2NrczoqKicpXG4gIGxpbmVzLnB1c2goJy0gQWx3YXlzIHNpbmdsZSBmaWxlcyBkaXJlY3RseSBpbiBgc3JjL2Jsb2Nrcy9gJylcbiAgbGluZXMucHVzaCgnLSBOZXZlciBjcmVhdGUgZm9sZGVycyBpbnNpZGUgYHNyYy9ibG9ja3MvYCcpXG4gIGxpbmVzLnB1c2goJy0gRXhhbXBsZTogYHNyYy9ibG9ja3MvaGVyby0xLnRzeGAsIGBzcmMvYmxvY2tzL3Rlc3RpbW9uaWFsLTMudHN4YCcpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJyoqQ29tcG9uZW50czoqKicpXG4gIGxpbmVzLnB1c2goJy0gU2ltcGxlIGNvbXBvbmVudHM6IFNpbmdsZSBmaWxlIGluIGBzcmMvY29tcG9uZW50cy9gJylcbiAgbGluZXMucHVzaCgnLSBDb21wbGV4IGNvbXBvbmVudHM6IEZvbGRlciB3aXRoIGBpbmRleC50c3hgJylcbiAgbGluZXMucHVzaCgnLSBVc2UgZm9sZGVycyB3aGVuIGNvbXBvbmVudCBoYXMgbXVsdGlwbGUgc3ViLWZpbGVzJylcbiAgbGluZXMucHVzaCgnJylcblxuICBsaW5lcy5wdXNoKCcjIyMgRE8gLSBXaGF0IEFJIElTIEFsbG93ZWQgVG8gRG8nKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBmaWxlcyBvbmx5IGluc2lkZSBleGlzdGluZyBDYW5vbi1kZWZpbmVkIHpvbmVzJylcbiAgbGluZXMucHVzaCgnLSBQbGFjZSBuZXcgZmlsZXMgaW4gdGhlIHpvbmUgdGhhdCBtYXRjaGVzIHRoZWlyIGFyY2hpdGVjdHVyYWwgcm9sZScpXG4gIGxpbmVzLnB1c2goJy0gRm9sbG93IGV4aXN0aW5nIGZvbGRlciBjb252ZW50aW9ucyB3aXRoaW4gYSB6b25lJylcbiAgbGluZXMucHVzaCgnLSBSZXVzZSBleGlzdGluZyBmb2xkZXJzIHdoZW4gcG9zc2libGUnKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBuZXcgcm91dGUgZ3JvdXBzIGluIGBzcmMvYXBwL2Agd2hlbiBuZXcgbGF5b3V0cyBhcmUgbmVlZGVkJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgbmV3IGFyY2hpdmUgY29udGVudCBmb2xkZXJzIChsaWtlIGBibG9nL2AsIGBwb3J0Zm9saW8vYCkgaW4gYC9zcmNgJylcbiAgbGluZXMucHVzaCgnLSBDcmVhdGUgZG90ZmlsZXMvZGlyZWN0b3JpZXMgYXQgcHJvamVjdCByb290IChgLmdpdGh1Yi9gLCBgLmN1cnNvci9gLCBldGMuKScpXG4gIGxpbmVzLnB1c2goJy0gQXNrIGZvciBjb25maXJtYXRpb24gaWYgdGhlIGNvcnJlY3Qgem9uZSBpcyBhbWJpZ3VvdXMnKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIGxpbmVzLnB1c2goJyMjIyBETyBOT1QgLSBXaGF0IEFJIElzIEZvcmJpZGRlbiBUbyBEbycpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJy0gQ3JlYXRlIG5ldyB0b3AtbGV2ZWwgZGlyZWN0b3JpZXMgKGV4Y2VwdCBkb3RmaWxlcyknKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBuZXcgZm9sZGVycyBpbiBgL3NyY2AgKGV4Y2VwdCBhcmNoaXZlIGNvbnRlbnQgb3Igcm91dGUgZ3JvdXBzKScpXG4gIGxpbmVzLnB1c2goJy0gUGxhY2UgZmlsZXMgb3V0c2lkZSBDYW5vbi1kZWZpbmVkIHpvbmVzJylcbiAgbGluZXMucHVzaCgnLSBNaXggcmVzcG9uc2liaWxpdGllcyBhY3Jvc3Mgem9uZXMgKGNvbXBvbmVudHMgaW1wb3J0aW5nIGJsb2NrcywgZXRjLiknKVxuICBsaW5lcy5wdXNoKCctIFJlb3JnYW5pemUgb3IgbW92ZSBmb2xkZXJzIHdpdGhvdXQgZXhwbGljaXQgaW5zdHJ1Y3Rpb24nKVxuICBsaW5lcy5wdXNoKCctIEludmVudCBuZXcgb3JnYW5pemF0aW9uYWwgY29udmVudGlvbnMnKVxuICBsaW5lcy5wdXNoKCctIENyZWF0ZSBwbGFjZWhvbGRlciBvciBzcGVjdWxhdGl2ZSBmaWxlcycpXG4gIGxpbmVzLnB1c2goJy0gSW1wb3J0IGZyb20gYF9zY3JpcHRzL2Agb3IgYF9kYXRhL2AgaW4gcnVudGltZSBjb2RlJylcbiAgbGluZXMucHVzaCgnLSBNYW51YWxseSBlZGl0IGZpbGVzIGluIGBfZGF0YS9gIChnZW5lcmF0ZWQgb25seSknKVxuICBsaW5lcy5wdXNoKCcnKVxuXG4gIHJldHVybiBsaW5lc1xufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZVZlcmlmaWNhdGlvbihjb25maWc6IENhbm9uVGVtcGxhdGVDb25maWcgfCBudWxsKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIGxpbmVzLnB1c2goJyMjIFBvc3QtRWRpdCBWZXJpZmljYXRpb24nKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCdBZnRlciBlZGl0aW5nIGZpbGVzOicpXG5cbiAgaWYgKGNvbmZpZz8udmVyaWZpY2F0aW9uPy5sZW5ndGgpIHtcbiAgICBsZXQgc3RlcCA9IDFcbiAgICBmb3IgKGNvbnN0IGNtZCBvZiBjb25maWcudmVyaWZpY2F0aW9uKSB7XG4gICAgICBsaW5lcy5wdXNoKGAke3N0ZXB9LiBSdW4gXFxgJHtjbWR9XFxgYClcbiAgICAgIHN0ZXArK1xuICAgIH1cbiAgICBsaW5lcy5wdXNoKGAke3N0ZXB9LiBGaXggYW55IHZpb2xhdGlvbnMgYmVmb3JlIGNvbW1pdHRpbmdgKVxuICB9IGVsc2Uge1xuICAgIGxpbmVzLnB1c2goJzEuIFJ1biBgbnBtIHJ1biBsaW50YCB0byBjaGVjayBmb3IgZXJyb3JzJylcbiAgICBsaW5lcy5wdXNoKCcyLiBGaXggYW55IHZpb2xhdGlvbnMgYmVmb3JlIGNvbW1pdHRpbmcnKVxuICB9XG5cbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnTm90ZTogT25seSBsaW50IGZpbGVzIHlvdSBlZGl0ZWQsIG5vdCB0aGUgZW50aXJlIGNvZGViYXNlLicpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgcmV0dXJuIGxpbmVzXG59XG5cbi8vIOKUgOKUgOKUgCBDbGF1ZGUtc3BlY2lmaWMgc2VjdGlvbnMg4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSA4pSAXG5cbmZ1bmN0aW9uIGdlbmVyYXRlQXV0b0dlbkZpbGVzKGNvbmZpZzogQ2Fub25UZW1wbGF0ZUNvbmZpZyB8IG51bGwpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnPy5nZW5lcmF0ZWRGaWxlcz8ubGVuZ3RoKSByZXR1cm4gW11cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuXG4gIGxpbmVzLnB1c2goJyMjIEF1dG8tR2VuZXJhdGVkIEZpbGVzIOKAlCBOZXZlciBFZGl0IE1hbnVhbGx5JylcbiAgbGluZXMucHVzaCgnJylcbiAgbGluZXMucHVzaCgnfCBGaWxlIHwgUmVnZW5lcmF0ZSBXaXRoIHwgVHJpZ2dlcmVkIEJ5IHwnKVxuICBsaW5lcy5wdXNoKCd8LS0tfC0tLXwtLS18JylcblxuICBmb3IgKGNvbnN0IGZpbGUgb2YgY29uZmlnLmdlbmVyYXRlZEZpbGVzKSB7XG4gICAgbGluZXMucHVzaChgfCBcXGAke2ZpbGUucGF0aH1cXGAgfCBcXGAke2ZpbGUuY29tbWFuZH1cXGAgfCAke2ZpbGUudHJpZ2dlcn0gfGApXG4gIH1cblxuICBsaW5lcy5wdXNoKCcnKVxuICByZXR1cm4gbGluZXNcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVCdWlsZENvbW1hbmRzKGNvbmZpZzogQ2Fub25UZW1wbGF0ZUNvbmZpZyB8IG51bGwpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnPy5idWlsZENvbW1hbmRzPy5sZW5ndGgpIHJldHVybiBbXVxuXG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtdXG5cbiAgbGluZXMucHVzaCgnIyMgQnVpbGQgQ29tbWFuZHMnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKCd8IENvbW1hbmQgfCBQdXJwb3NlIHwnKVxuICBsaW5lcy5wdXNoKCd8LS0tfC0tLXwnKVxuXG4gIGZvciAoY29uc3QgY21kIG9mIGNvbmZpZy5idWlsZENvbW1hbmRzKSB7XG4gICAgbGluZXMucHVzaChgfCBcXGAke2NtZC5zY3JpcHR9XFxgIHwgJHtjbWQuZGVzY3JpcHRpb259IHxgKVxuICB9XG5cbiAgbGluZXMucHVzaCgnJylcbiAgcmV0dXJuIGxpbmVzXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ29sb3JUb2tlbnMoY29uZmlnOiBDYW5vblRlbXBsYXRlQ29uZmlnIHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWc/LmNvbG9yVG9rZW5zKSByZXR1cm4gW11cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBjdCA9IGNvbmZpZy5jb2xvclRva2Vuc1xuXG4gIGxpbmVzLnB1c2goJyMjIENvbG9yIFRva2VuIFN5c3RlbScpXG4gIGxpbmVzLnB1c2goJycpXG4gIGxpbmVzLnB1c2goJ0FsbCBjb2xvcnMgdXNlIHNlbWFudGljIHRva2VucyBkZWZpbmVkIGluIGBzcmMvc3R5bGVzL3RhaWx3aW5kLmNzc2AgYEB0aGVtZWA6JylcbiAgbGluZXMucHVzaCgnJylcblxuICBpZiAoY3Quc3VyZmFjZT8ubGVuZ3RoKSB7XG4gICAgbGluZXMucHVzaChgLSAqKlN1cmZhY2UqKjogJHtjdC5zdXJmYWNlLm1hcChzID0+IGBcXGAke3N9XFxgYCkuam9pbignLCAnKX1gKVxuICB9XG4gIGlmIChjdC50ZXh0Py5sZW5ndGgpIHtcbiAgICBsaW5lcy5wdXNoKGAtICoqVGV4dCoqOiAke2N0LnRleHQubWFwKHMgPT4gYFxcYCR7c31cXGBgKS5qb2luKCcsICcpfWApXG4gIH1cbiAgaWYgKGN0Lm92ZXJsYXk/Lmxlbmd0aCkge1xuICAgIGxpbmVzLnB1c2goYC0gKipPdmVybGF5KiogKGZpeGVkIOKAlCBkb24ndCBmbGlwIGluIGRhcmsgbW9kZSk6ICR7Y3Qub3ZlcmxheS5tYXAocyA9PiBgXFxgJHtzfVxcYGApLmpvaW4oJywgJyl9YClcbiAgfVxuICBpZiAoY3QuYWNjZW50cz8ubGVuZ3RoKSB7XG4gICAgbGluZXMucHVzaChgLSAqKkFjY2VudHMqKjogJHtjdC5hY2NlbnRzLm1hcChzID0+IGBcXGAke3N9XFxgYCkuam9pbignLCAnKX1gKVxuICB9XG5cbiAgbGluZXMucHVzaCgnJylcblxuICBsaW5lcy5wdXNoKCcqKk5ldmVyIHVzZSoqOiBgZ3JheS0qYCwgYHdoaXRlYCwgYGJsYWNrYCwgYHNsYXRlLSpgIOKAlCBhbHdheXMgbWFwIHRvIGEgc2VtYW50aWMgdG9rZW4uJylcbiAgbGluZXMucHVzaCgnJylcblxuICByZXR1cm4gbGluZXNcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVTdGF0ZU1hbmFnZW1lbnQoY29uZmlnOiBDYW5vblRlbXBsYXRlQ29uZmlnIHwgbnVsbCk6IHN0cmluZ1tdIHtcbiAgaWYgKCFjb25maWc/LnN0YXRlKSByZXR1cm4gW11cblxuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXVxuICBjb25zdCBzdCA9IGNvbmZpZy5zdGF0ZVxuXG4gIGxpbmVzLnB1c2goJyMjIFN0YXRlIE1hbmFnZW1lbnQnKVxuICBsaW5lcy5wdXNoKCcnKVxuICBsaW5lcy5wdXNoKGAke3N0LmxpYnJhcnl9IHN0b3JlIGF0IFxcYCR7c3QuZmlsZX1cXGAuIFJlYWQgd2l0aCBcXGAke3N0LnJlYWRQYXR0ZXJufVxcYCwgd3JpdGUgd2l0aCBcXGAke3N0LndyaXRlUGF0dGVybn1cXGAuYClcbiAgbGluZXMucHVzaCgnJylcblxuICBpZiAoc3QucHJvcGVydGllcz8ubGVuZ3RoKSB7XG4gICAgbGluZXMucHVzaChgQXZhaWxhYmxlIHN0YXRlOiAke3N0LnByb3BlcnRpZXMubWFwKHAgPT4gYFxcYCR7cH1cXGBgKS5qb2luKCcsICcpfS5gKVxuICAgIGxpbmVzLnB1c2goJycpXG4gIH1cblxuICByZXR1cm4gbGluZXNcbn1cblxuZnVuY3Rpb24gZ2VuZXJhdGVUZW1wbGF0ZVJ1bGVzKGNvbmZpZzogQ2Fub25UZW1wbGF0ZUNvbmZpZyB8IG51bGwpOiBzdHJpbmdbXSB7XG4gIGlmICghY29uZmlnPy5ydWxlcz8ubGVuZ3RoKSByZXR1cm4gW11cblxuICBjb25zdCBkb1J1bGVzID0gY29uZmlnLnJ1bGVzLmZpbHRlcihyID0+IHIudHlwZSA9PT0gJ2RvJylcbiAgaWYgKCFkb1J1bGVzLmxlbmd0aCkgcmV0dXJuIFtdXG5cbiAgY29uc3QgbGluZXM6IHN0cmluZ1tdID0gW11cblxuICBsaW5lcy5wdXNoKCcjIyBUZW1wbGF0ZS1TcGVjaWZpYyBSdWxlcycpXG4gIGxpbmVzLnB1c2goJycpXG5cbiAgZm9yIChjb25zdCBydWxlIG9mIGRvUnVsZXMpIHtcbiAgICBsaW5lcy5wdXNoKGAtICR7cnVsZS5ydWxlfWApXG4gIH1cblxuICBsaW5lcy5wdXNoKCcnKVxuICByZXR1cm4gbGluZXNcbn1cblxuLy8g4pSA4pSA4pSAIEZvcm1hdCBnZW5lcmF0b3JzIOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgOKUgFxuXG5mdW5jdGlvbiBnZW5lcmF0ZUN1cnNvcnJ1bGVzKGNvbmZpZzogQ2Fub25UZW1wbGF0ZUNvbmZpZyB8IG51bGwpOiBzdHJpbmcge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXG4gICAgLi4uZ2VuZXJhdGVIZWFkZXIoJ2N1cnNvcnJ1bGVzJyksXG4gICAgLi4uZ2VuZXJhdGVUZWNoU3RhY2soKSxcbiAgICAuLi5nZW5lcmF0ZUVuZm9yY2VkUGF0dGVybnMoJ2N1cnNvcnJ1bGVzJyksXG4gICAgLi4uZ2VuZXJhdGVEb2NQYXR0ZXJucygpLFxuICAgIC4uLmdlbmVyYXRlR3VhcmFudGVlcygpLFxuICAgIC4uLmdlbmVyYXRlQ29tcG9uZW50UmVmZXJlbmNlKGNvbmZpZyksXG4gICAgLi4uZ2VuZXJhdGVEb05vdFNlY3Rpb24oY29uZmlnKSxcbiAgICAuLi5nZW5lcmF0ZUZpbGVBdXRob3JpdHkoKSxcbiAgICAuLi5nZW5lcmF0ZVZlcmlmaWNhdGlvbihjb25maWcpLFxuICBdXG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ2xhdWRlTWQoY29uZmlnOiBDYW5vblRlbXBsYXRlQ29uZmlnIHwgbnVsbCk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAuLi5nZW5lcmF0ZUhlYWRlcignY2xhdWRlJyksXG4gICAgLi4uZ2VuZXJhdGVBdXRvR2VuRmlsZXMoY29uZmlnKSxcbiAgICAuLi5nZW5lcmF0ZUJ1aWxkQ29tbWFuZHMoY29uZmlnKSxcbiAgICAuLi5nZW5lcmF0ZUVuZm9yY2VkUGF0dGVybnMoJ2NsYXVkZScpLFxuICAgIC4uLmdlbmVyYXRlRG9jUGF0dGVybnMoKSxcbiAgICAuLi5nZW5lcmF0ZUNvbG9yVG9rZW5zKGNvbmZpZyksXG4gICAgLi4uZ2VuZXJhdGVDb21wb25lbnRSZWZlcmVuY2UoY29uZmlnKSxcbiAgICAuLi5nZW5lcmF0ZVN0YXRlTWFuYWdlbWVudChjb25maWcpLFxuICAgIC4uLmdlbmVyYXRlVGVtcGxhdGVSdWxlcyhjb25maWcpLFxuICAgIC4uLmdlbmVyYXRlRG9Ob3RTZWN0aW9uKGNvbmZpZyksXG4gICAgLi4uZ2VuZXJhdGVWZXJpZmljYXRpb24oY29uZmlnKSxcbiAgXVxuXG4gIHJldHVybiBsaW5lcy5qb2luKCdcXG4nKVxufVxuXG5mdW5jdGlvbiBnZW5lcmF0ZUNvcGlsb3RJbnN0cnVjdGlvbnMoY29uZmlnOiBDYW5vblRlbXBsYXRlQ29uZmlnIHwgbnVsbCk6IHN0cmluZyB7XG4gIGNvbnN0IGxpbmVzOiBzdHJpbmdbXSA9IFtcbiAgICAuLi5nZW5lcmF0ZUhlYWRlcignY29waWxvdCcpLFxuICAgIC4uLmdlbmVyYXRlVGVjaFN0YWNrKCksXG4gICAgLi4uZ2VuZXJhdGVFbmZvcmNlZFBhdHRlcm5zKCdjb3BpbG90JyksXG4gICAgLi4uZ2VuZXJhdGVEb2NQYXR0ZXJucygpLFxuICAgIC4uLmdlbmVyYXRlQ29tcG9uZW50UmVmZXJlbmNlKGNvbmZpZyksXG4gICAgLi4uZ2VuZXJhdGVEb05vdFNlY3Rpb24oY29uZmlnKSxcbiAgICAuLi5nZW5lcmF0ZVZlcmlmaWNhdGlvbihjb25maWcpLFxuICBdXG5cbiAgcmV0dXJuIGxpbmVzLmpvaW4oJ1xcbicpXG59XG5cbmZ1bmN0aW9uIGdlbmVyYXRlQ29udGVudChmb3JtYXQ6IE91dHB1dEZvcm1hdCwgY29uZmlnOiBDYW5vblRlbXBsYXRlQ29uZmlnIHwgbnVsbCk6IHN0cmluZyB7XG4gIHN3aXRjaCAoZm9ybWF0KSB7XG4gICAgY2FzZSAnY2xhdWRlJzpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNsYXVkZU1kKGNvbmZpZylcbiAgICBjYXNlICdjb3BpbG90JzpcbiAgICAgIHJldHVybiBnZW5lcmF0ZUNvcGlsb3RJbnN0cnVjdGlvbnMoY29uZmlnKVxuICAgIGNhc2UgJ2N1cnNvcnJ1bGVzJzpcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGdlbmVyYXRlQ3Vyc29ycnVsZXMoY29uZmlnKVxuICB9XG59XG5cbmZ1bmN0aW9uIHdyaXRlT3V0cHV0KGNvbnRlbnQ6IHN0cmluZywgb3V0cHV0UGF0aDogc3RyaW5nKTogdm9pZCB7XG4gIGNvbnN0IGRpciA9IHBhdGguZGlybmFtZShvdXRwdXRQYXRoKVxuICBpZiAoIWZzLmV4aXN0c1N5bmMoZGlyKSkge1xuICAgIGZzLm1rZGlyU3luYyhkaXIsIHsgcmVjdXJzaXZlOiB0cnVlIH0pXG4gIH1cbiAgZnMud3JpdGVGaWxlU3luYyhvdXRwdXRQYXRoLCBjb250ZW50LCAndXRmLTgnKVxufVxuXG4vLyDilIDilIDilIAgUHVibGljIEFQSSDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIDilIBcblxuZXhwb3J0IGFzeW5jIGZ1bmN0aW9uIGdlbmVyYXRlKG9wdGlvbnM6IEdlbmVyYXRlT3B0aW9ucyk6IFByb21pc2U8dm9pZD4ge1xuICBjb25zdCBjb25maWcgPSBsb2FkQ29uZmlnKClcblxuICBpZiAob3B0aW9ucy5vdXRwdXQgPT09ICdhbGwnKSB7XG4gICAgLy8gR2VuZXJhdGUgYWxsIHRhcmdldHNcbiAgICBjb25zdCB0YXJnZXRzID0gZ2V0QWxsVGFyZ2V0cygpXG4gICAgZm9yIChjb25zdCB0YXJnZXQgb2YgdGFyZ2V0cykge1xuICAgICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQ29udGVudCh0YXJnZXQuZm9ybWF0LCBjb25maWcpXG4gICAgICBjb25zdCBvdXRwdXRQYXRoID0gcGF0aC5yZXNvbHZlKHByb2Nlc3MuY3dkKCksIHRhcmdldC5vdXRwdXQpXG4gICAgICB3cml0ZU91dHB1dChjb250ZW50LCBvdXRwdXRQYXRoKVxuICAgICAgY29uc29sZS5sb2coYOKckyBHZW5lcmF0ZWQgJHt0YXJnZXQub3V0cHV0fWApXG4gICAgfVxuICAgIGNvbnNvbGUubG9nKGAgIENhbm9uIHYke3ZlcnNpb259IOKAlCAke3BhdHRlcm5zLmxlbmd0aH0gcGF0dGVybnMsICR7Z3VhcmFudGVlcy5sZW5ndGh9IGd1YXJhbnRlZXNgKVxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgIFRlbXBsYXRlIGNvbmZpZzogJHtjb25maWcubmFtZX1gKVxuICAgIH1cbiAgfSBlbHNlIGlmIChvcHRpb25zLm91dHB1dCA9PT0gJy0nKSB7XG4gICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQ29udGVudChvcHRpb25zLmZvcm1hdCwgY29uZmlnKVxuICAgIGNvbnNvbGUubG9nKGNvbnRlbnQpXG4gIH0gZWxzZSB7XG4gICAgY29uc3QgY29udGVudCA9IGdlbmVyYXRlQ29udGVudChvcHRpb25zLmZvcm1hdCwgY29uZmlnKVxuICAgIGNvbnN0IG91dHB1dFBhdGggPSBwYXRoLnJlc29sdmUocHJvY2Vzcy5jd2QoKSwgb3B0aW9ucy5vdXRwdXQpXG4gICAgd3JpdGVPdXRwdXQoY29udGVudCwgb3V0cHV0UGF0aClcbiAgICBjb25zb2xlLmxvZyhg4pyTIEdlbmVyYXRlZCAke29wdGlvbnMub3V0cHV0fSBmcm9tIENhbm9uIHYke3ZlcnNpb259YClcbiAgICBjb25zb2xlLmxvZyhgICAke3BhdHRlcm5zLmxlbmd0aH0gcGF0dGVybnMsICR7Z3VhcmFudGVlcy5sZW5ndGh9IGd1YXJhbnRlZXNgKVxuICAgIGlmIChjb25maWcpIHtcbiAgICAgIGNvbnNvbGUubG9nKGAgIFRlbXBsYXRlIGNvbmZpZzogJHtjb25maWcubmFtZX1gKVxuICAgIH1cbiAgfVxufVxuIl19
|