drizzle-kit 0.9.3 → 0.9.4

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.
Files changed (2) hide show
  1. package/drizzle.js +2 -2134
  2. package/package.json +1 -1
package/drizzle.js CHANGED
@@ -1,2136 +1,4 @@
1
1
  #!/usr/bin/env node
2
2
 
3
- /******/ (() => { // webpackBootstrap
4
- /******/ "use strict";
5
- /******/ var __webpack_modules__ = ({
6
-
7
- /***/ "./src/differ.js":
8
- /*!***********************!*\
9
- !*** ./src/differ.js ***!
10
- \***********************/
11
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
12
-
13
- __webpack_require__.r(__webpack_exports__);
14
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
15
- /* harmony export */ "diffForRenamed": () => (/* binding */ diffForRenamed),
16
- /* harmony export */ "differ": () => (/* binding */ differ)
17
- /* harmony export */ });
18
- /* harmony import */ var json_diff__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! json-diff */ "json-diff");
19
- /* harmony import */ var json_diff__WEBPACK_IMPORTED_MODULE_0___default = /*#__PURE__*/__webpack_require__.n(json_diff__WEBPACK_IMPORTED_MODULE_0__);
20
- 'use-strict';
21
-
22
-
23
-
24
-
25
- function diffForRenamed(pairs) {
26
- // raname table1 to name of table2, so we can apply diffs
27
- const renamed = pairs.map(it => {
28
- const from = it.from || it.old
29
- const to = it.to || it.new
30
- const newFrom = { ...from, name: to.name }
31
- return [newFrom, to]
32
- })
33
-
34
- // find any alternations made to a renamed table
35
- const altered = renamed.map(pair => {
36
- const diffed = (0,json_diff__WEBPACK_IMPORTED_MODULE_0__.diff)(pair[0], pair[1]);
37
- diffed.name = pair[0].name
38
-
39
- return findAlternationsInTable(diffed)
40
- })
41
-
42
- return altered
43
- }
44
- function differ(json1, json2) {
45
- const difference = (0,json_diff__WEBPACK_IMPORTED_MODULE_0__.diff)(json1, json2);
46
-
47
- difference.tables = difference.tables ? difference.tables : {}
48
- difference.enums = difference.enums ? difference.enums : {}
49
-
50
- const tableEntries = Object.entries(difference.tables)
51
- const addedTables = tableEntries.filter(it => it[0].includes('__added'))
52
- .map(it => it[1])
53
- .map(it => {
54
- // console.log(it)
55
- return {
56
- ...it, indexes: Object.entries(it.indexes).map(indexEntry => {
57
- const idx = indexEntry[1]
58
- const name = idx['name']
59
- const columns = Object.values(idx['columns']).map(it => it['name'])
60
- return { name, columns }
61
- })
62
- }
63
- })
64
- const deletedTables = tableEntries.filter(it => it[0].includes('__deleted')).map(it => it[1])
65
-
66
- const enumsEntries = Object.entries(difference.enums)
67
-
68
- const addedEnums = enumsEntries.filter(it => it[0].includes('__added'))
69
- .map(it => it[1])
70
- .map(it => {
71
- // values: { val1: 'val1', val2: 'val2' } => values: ['val1', 'val2']
72
- const values = Object.entries(it.values).map(ve => ve[1])
73
- return { name: it.name, values: values }
74
- })
75
- const deletedEnums = enumsEntries.filter(it => it[0].includes('__deleted'))
76
- .map(it => it[1])
77
- .map(it => {
78
-
79
- // values: { val1: 'val1', val2: 'val2' } => values: ['val1', 'val2']
80
- const values = Object.entries(it.values).map(ve => ve[1])
81
- return { name: it.name, values: values }
82
- })
83
- const alteredEnums = enumsEntries.filter(it => !(it[0].includes('__added') || it[0].includes('__deleted')))
84
- .map(it => {
85
- const vals = it[1].values
86
- const addedValues = Object.entries(vals).filter(val => val[0].includes('__added')).map(val => val[1])
87
- const deletedValues = Object.entries(vals).filter(val => val[0].includes('__deleted')).map(val => val[1])
88
- // console.log('values: ', it[1].values)
89
- return { name: it[0], addedValues, deletedValues, }
90
- })
91
-
92
- const alteredTables = Object.keys(difference.tables)
93
- .filter(it => !(it.includes('__added') || it.includes('__deleted')))
94
- .map(it => {
95
- return { name: it, ...difference.tables[it] }
96
- })
97
-
98
- const alteredTablesWithColumns = alteredTables.map(table => findAlternationsInTable(table))
99
-
100
- return {
101
- addedTables,
102
- deletedTables,
103
- alteredTablesWithColumns,
104
- addedEnums,
105
- deletedEnums,
106
- alteredEnums,
107
- }
108
- }
109
-
110
- const findAlternationsInTable = (table) => {
111
- // map each table to have altered, deleted or renamed columns
112
- const columns = table.columns; //in case no columns were altered, but indexes were
113
-
114
- const added = Object.keys(columns).filter(it => it.includes('__added')).map(it => {
115
- return { ...columns[it] }
116
- })
117
- const deleted = Object.keys(columns).filter(it => it.includes('__deleted')).map(it => {
118
- return { ...columns[it] }
119
- })
120
- const altered = Object.keys(columns)
121
- .filter(it => !(it.includes('__deleted') || it.includes('__added')))
122
- .map(it => {
123
- return { name: it, ...columns[it] }
124
- })
125
-
126
- const deletedIndexes = Object.values(table.indexes__deleted || {}).map(it => {
127
- const name = it['name']
128
- const columns = Object.values(it['columns']).map(it => it['name'])
129
- return { name, columns }
130
- }).concat(
131
- Object.keys(table.indexes || {}).filter(it => it.includes('__deleted'))
132
- .map(it => {
133
- const idx = table.indexes[it]
134
- const name = idx['name']
135
- const columns = Object.values(idx['columns']).map(it => it['name'])
136
- return { name, columns }
137
- })
138
- );
139
-
140
- const addedIndexes = Object.values(table.indexes__added || {}).map(it => {
141
- const name = it['name']
142
- const columns = Object.values(it['columns']).map(it => it['name'])
143
- return { name, columns }
144
- }).concat(
145
- Object.keys(table.indexes || {}).filter(it => it.includes('__added'))
146
- .map(it => {
147
- const idx = table.indexes[it]
148
- const name = idx['name']
149
- const columns = Object.values(idx['columns']).map(it => it['name'])
150
- return { name, columns }
151
- })
152
- );
153
- return { name: table.name, deleted, added, altered, addedIndexes, deletedIndexes }
154
- }
155
-
156
- /***/ }),
157
-
158
- /***/ "./src/jsonStatements.js":
159
- /*!*******************************!*\
160
- !*** ./src/jsonStatements.js ***!
161
- \*******************************/
162
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
163
-
164
- __webpack_require__.r(__webpack_exports__);
165
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
166
- /* harmony export */ "Types": () => (/* binding */ Types),
167
- /* harmony export */ "prepareCreateTableJson": () => (/* binding */ prepareCreateTableJson),
168
- /* harmony export */ "prepareDropTableJson": () => (/* binding */ prepareDropTableJson),
169
- /* harmony export */ "prepareRenameTableJson": () => (/* binding */ prepareRenameTableJson),
170
- /* harmony export */ "prepareCreateEnumJson": () => (/* binding */ prepareCreateEnumJson),
171
- /* harmony export */ "prepareAddValuesToEnumJson": () => (/* binding */ prepareAddValuesToEnumJson),
172
- /* harmony export */ "prepareAlterTableColumnsJson": () => (/* binding */ prepareAlterTableColumnsJson),
173
- /* harmony export */ "prepareCreateIndexesJson": () => (/* binding */ prepareCreateIndexesJson),
174
- /* harmony export */ "prepareDropIndexesJson": () => (/* binding */ prepareDropIndexesJson)
175
- /* harmony export */ });
176
- class Types {
177
- static createTable = 'create_table'
178
- static dropTable = 'drop_table'
179
- static renameTable = 'rename_table'
180
- static alterTableDropColumn = 'alter_table_drop_column'
181
- static alterTableAddColumn = 'alter_table_add_column'
182
- static alterTableAlterColumnSetType = 'alter_table_alter_column_set_type'
183
- static alterTableAlterColumnSetDefault = 'alter_table_alter_column_set_default'
184
- static alterTableAlterColumnDropDefault = 'alter_table_alter_column_drop_default'
185
- static alterTableAlterColumnSetNotNull = 'alter_table_alter_column_set_notnull'
186
- static alterTableAlterColumnDropNotNull = 'alter_table_alter_column_drop_notnull'
187
- static createIndex = 'create_index'
188
- static dropIndex = 'drop_index'
189
- static createTypeEnum = 'create_type_enum'
190
- static alterTypeAddValue = 'alter_type_add_value'
191
- }
192
-
193
- const prepareCreateTableJson = (table) => {
194
- const { name, columns } = table
195
- const mappedColumns = Object.keys(columns)
196
- .map(it => {
197
- return { ...columns[it] }
198
- })
199
-
200
- return {
201
- type: Types.createTable,
202
- tableName: name,
203
- columns: mappedColumns
204
- };
205
- }
206
-
207
- const prepareDropTableJson = (table) => {
208
- return {
209
- type: Types.dropTable,
210
- tableName: table.name
211
- }
212
- }
213
-
214
- const prepareRenameTableJson = (tableFrom, tableTo) => {
215
- return {
216
- type: Types.renameTable,
217
- from: tableFrom.name,
218
- to: tableTo.name
219
- }
220
- }
221
-
222
- const prepareCreateEnumJson = (name, values) => {
223
- return {
224
- type: Types.createTypeEnum,
225
- enumName: name,
226
- values
227
- }
228
- }
229
-
230
- // https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
231
- const prepareAddValuesToEnumJson = (name, values) => {
232
- return values.map(it => {
233
- return {
234
- type: Types.alterTypeAddValue,
235
- enumName: name,
236
- enumValue: it
237
- }
238
- })
239
- }
240
-
241
- const prepareAlterTableColumnsJson = (table) => {
242
- const tableName = table['name'];
243
- const statements = []
244
-
245
- const dropColumns = _prepareDropColumns(tableName, table.deleted)
246
- const addColumns = _prepareAddColumns(tableName, table.added)
247
- const alterColumns = _prepareAlterColumns(tableName, table.altered)
248
-
249
-
250
- statements.push(...dropColumns)
251
- statements.push(...addColumns)
252
- statements.push(...alterColumns)
253
-
254
- return statements;
255
- }
256
-
257
- const _prepareDropColumns = (taleName, columns) => {
258
- return columns.map(it => {
259
- return {
260
- type: Types.alterTableDropColumn,
261
- tableName: taleName,
262
- columnName: it.name
263
- }
264
- })
265
- }
266
-
267
- const _prepareAddColumns = (tableName, columns) => {
268
- return columns.map(it => {
269
- return {
270
- type: Types.alterTableAddColumn,
271
- tableName,
272
- column: it
273
- }
274
- })
275
- }
276
-
277
- const _prepareAlterColumns = (tableName, columns) => {
278
- let statements = []
279
-
280
- for (const column of columns) {
281
- const columnName = column.name;
282
-
283
- if (column['type']) {
284
- const { __new } = column.type
285
-
286
- statements.push({
287
- type: Types.alterTableAlterColumnSetType,
288
- tableName,
289
- columnName,
290
- newDataType: __new
291
- })
292
- }
293
-
294
- if (column['defaultValue'] || column['defaultValue__added']) {
295
- const newDefaultValue = column.defaultValue.__new | column.defaultValue__added
296
- statements.push({
297
- type: Types.alterTableAlterColumnSetDefault,
298
- tableName,
299
- columnName,
300
- newDefault: newDefaultValue
301
- })
302
- }
303
-
304
- if (column['defaultValue__deleted']) {
305
- statements.push({
306
- type: Types.alterTableAlterColumnDropDefault,
307
- tableName,
308
- columnName,
309
- })
310
- }
311
-
312
- if (column['notNull__added'] || (column['notNull'] && column['notNull']['__new'])) {
313
- statements.push({
314
- type: Types.alterTableAlterColumnSetNotNull,
315
- tableName,
316
- columnName
317
- })
318
- }
319
-
320
- if (column['notNull__deleted'] || (column['notNull'] && !column['notNull']['__new'])) {
321
- statements.push({
322
- type: Types.alterTableAlterColumnDropNotNull,
323
- tableName,
324
- columnName
325
- })
326
- }
327
- }
328
-
329
- return statements
330
- }
331
-
332
- const prepareCreateIndexesJson = (tableName, indexes) => {
333
- return indexes.map(index => {
334
- return {
335
- type: Types.createIndex,
336
- tableName,
337
- indexName: index.name,
338
- indexValue: index.columns.join(', ')
339
- }
340
- })
341
- }
342
- const prepareDropIndexesJson = (tableName, indexes) => {
343
- return indexes.map(index => {
344
- return {
345
- type: Types.dropIndex,
346
- tableName,
347
- indexName: index.name,
348
- }
349
- })
350
- }
351
-
352
-
353
- /***/ }),
354
-
355
- /***/ "./src/sqlgenerator.js":
356
- /*!*****************************!*\
357
- !*** ./src/sqlgenerator.js ***!
358
- \*****************************/
359
- /***/ ((__unused_webpack_module, __webpack_exports__, __webpack_require__) => {
360
-
361
- __webpack_require__.r(__webpack_exports__);
362
- /* harmony export */ __webpack_require__.d(__webpack_exports__, {
363
- /* harmony export */ "fromJson": () => (/* binding */ fromJson),
364
- /* harmony export */ "prepareDeleteColumns": () => (/* binding */ prepareDeleteColumns),
365
- /* harmony export */ "prepareCreateColumns": () => (/* binding */ prepareCreateColumns),
366
- /* harmony export */ "prepareAlterColumns": () => (/* binding */ prepareAlterColumns),
367
- /* harmony export */ "prepareCreateTable": () => (/* binding */ prepareCreateTable),
368
- /* harmony export */ "prepareCreateIndex": () => (/* binding */ prepareCreateIndex),
369
- /* harmony export */ "prepareDropIndex": () => (/* binding */ prepareDropIndex),
370
- /* harmony export */ "prepareRenameTable": () => (/* binding */ prepareRenameTable),
371
- /* harmony export */ "prepareDropTable": () => (/* binding */ prepareDropTable),
372
- /* harmony export */ "prepareCreateEnum": () => (/* binding */ prepareCreateEnum),
373
- /* harmony export */ "prepareAddValuesToEnum": () => (/* binding */ prepareAddValuesToEnum)
374
- /* harmony export */ });
375
- /* harmony import */ var _jsonStatements__WEBPACK_IMPORTED_MODULE_0__ = __webpack_require__(/*! ./jsonStatements */ "./src/jsonStatements.js");
376
-
377
-
378
- class Convertor {
379
- constructor(type) {
380
- this.type = type
381
- }
382
-
383
- can(type) {
384
- return this.type === type;
385
- }
386
-
387
- convert(_) {
388
- throw Error('override the convert mothod')
389
- }
390
- }
391
-
392
- class CreateTableConvertor extends Convertor {
393
- constructor() {
394
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createTable)
395
- }
396
-
397
- convert(jsonStatement) {
398
- const { tableName, columns } = jsonStatement
399
- const mappedColumns = Object.keys(columns)
400
- .map(it => {
401
- return { ...columns[it] }
402
- })
403
-
404
- let statement = ''
405
-
406
- statement += `CREATE TABLE ${tableName} (\n`
407
- for (const column of mappedColumns) {
408
- // console.log(column);
409
- const primaryKeyStatement = column.primaryKey ? "PRIMARY KEY" : ''
410
- const notNullStatement = column.notNull ? "NOT NULL" : "";
411
- const defaultStatement = column.defaultValue ? `DEFAULT '${column.defaultValue}'` : "";
412
- statement += '\t' + `${column.name} ${column.type} ${primaryKeyStatement} ${defaultStatement} ${notNullStatement}`.replace(/ +/g, ' ').trim() + ',\n'
413
- }
414
- statement += `);`
415
- return statement;
416
- }
417
- }
418
-
419
- class CreateTypeEnumConvertor extends Convertor {
420
- constructor() {
421
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createTypeEnum)
422
- }
423
-
424
- convert(jsonStatement) {
425
- const { enumName, values } = jsonStatement
426
- let valuesStatement = '('
427
- valuesStatement += values.map(it => `'${it}'`).join(', ')
428
- valuesStatement += ')'
429
-
430
- return `CREATE TYPE ${enumName} AS ENUM${valuesStatement};`
431
- }
432
- }
433
-
434
- class AlterTypeAddValueConvertor extends Convertor {
435
- constructor() {
436
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTypeAddValue)
437
- }
438
-
439
- convert(jsonStatement) {
440
- const { enumName, enumValue } = jsonStatement
441
- return `ALTER TYPE ${enumName} ADD VALUE ${enumValue};`
442
- }
443
- }
444
-
445
- class DropTableConvertor extends Convertor {
446
- constructor() {
447
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.dropTable)
448
- }
449
-
450
- convert(jsonStatement) {
451
- const { tableName } = jsonStatement
452
- return `DROP TABLE ${tableName}`
453
- }
454
- }
455
-
456
- class RenameTableConvertor extends Convertor {
457
- constructor() {
458
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.renameTable)
459
- }
460
-
461
- convert(jsonStatement) {
462
- const { from, to } = jsonStatement
463
- return `ALTER TABLE ${from} RENAME TO ${to}`
464
- }
465
- }
466
-
467
- class AlterTableDropColumnConvertor extends Convertor {
468
- constructor() {
469
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableDropColumn)
470
- }
471
-
472
- convert(jsonStatement) {
473
- const { tableName, columnName } = jsonStatement
474
- return `ALTER TABLE ${tableName} DROP COLUMN IF EXISTS ${columnName};`
475
- }
476
- }
477
-
478
- class AlterTableAddColumnConvertor extends Convertor {
479
- constructor() {
480
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAddColumn)
481
- }
482
-
483
- convert(jsonStatement) {
484
- const { tableName, column } = jsonStatement
485
- const { name, type, defaultValue, notNull } = column;
486
-
487
- const defaultStatement = `${defaultValue ? ` DEFAULT ${defaultValue}` : ''}`
488
- const notNullStatement = `${notNull ? ' NOT NULL' : ''}`
489
- return `ALTER TABLE ${tableName} ADD COLUMN ${name} ${type}${defaultStatement}${notNullStatement}`.trim() + ';'
490
- }
491
- }
492
-
493
- class AlterTableAlterColumnSetTypeConvertor extends Convertor {
494
- constructor() {
495
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAlterColumnSetType)
496
- }
497
-
498
- convert(jsonStatement) {
499
- const { tableName, columnName, newDataType } = jsonStatement
500
- return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET DATA TYPE ${newDataType};`
501
- }
502
- }
503
-
504
- class AlterTableAlterColumnSetNotNullConvertor extends Convertor {
505
- constructor() {
506
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAlterColumnSetNotNull)
507
- }
508
-
509
- convert(jsonStatement) {
510
- const { tableName, columnName } = jsonStatement
511
- return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} SET NOT NULL;`
512
- }
513
- }
514
-
515
- class AlterTableAlterColumnDropNotNullConvertor extends Convertor {
516
- constructor() {
517
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.alterTableAlterColumnDropNotNull)
518
- }
519
-
520
- convert(jsonStatement) {
521
- const { tableName, columnName } = jsonStatement
522
- return `ALTER TABLE ${tableName} ALTER COLUMN ${columnName} DROP NOT NULL;`
523
- }
524
- }
525
-
526
- class CreateIndexConvertor extends Convertor {
527
- constructor() {
528
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.createIndex)
529
- }
530
-
531
- convert(jsonStatement) {
532
- const { tableName, indexName, indexValue } = jsonStatement
533
- return `CREATE INDEX ${indexName} ON ${tableName} (${indexValue});`
534
- }
535
- }
536
-
537
- class DropIndexConvertor extends Convertor {
538
- constructor() {
539
- super(_jsonStatements__WEBPACK_IMPORTED_MODULE_0__.Types.dropIndex)
540
- }
541
-
542
- convert(jsonStatement) {
543
- const { indexName } = jsonStatement
544
- return `DROP INDEX IF EXISTS ${indexName};`
545
- }
546
- }
547
-
548
- const convertors = []
549
- convertors.push(new CreateTableConvertor())
550
- convertors.push(new CreateTypeEnumConvertor())
551
- convertors.push(new DropTableConvertor())
552
- convertors.push(new RenameTableConvertor())
553
- convertors.push(new AlterTableDropColumnConvertor())
554
- convertors.push(new AlterTableAddColumnConvertor())
555
- convertors.push(new AlterTableAlterColumnSetTypeConvertor())
556
- convertors.push(new CreateIndexConvertor())
557
- convertors.push(new DropIndexConvertor())
558
- convertors.push(new AlterTypeAddValueConvertor())
559
- convertors.push(new AlterTableAlterColumnSetNotNullConvertor())
560
- convertors.push(new AlterTableAlterColumnDropNotNullConvertor())
561
-
562
- const fromJson = (statements) => {
563
- return statements.map(statement => {
564
- const filtered = convertors.filter(it => {
565
- return it.can(statement.type)
566
- })
567
- const convertor = filtered.length === 1 ? filtered[0] : undefined
568
-
569
- if (!convertor) {
570
- console.log('no convertor:', statement.type)
571
- return 'dry run'
572
- }
573
-
574
- return convertor.convert(statement)
575
- })
576
- }
577
-
578
- const prepareDeleteColumns = (tableName, columns) => {
579
- let statement = ''
580
- for (const column of columns) {
581
- statement += `ALTER TABLE ${tableName} DROP COLUMN IF EXISTS ${column.name};`
582
- statement += '\n'
583
- }
584
- return statement.trim()
585
- }
586
-
587
- const prepareCreateColumns = (tableName, columns) => {
588
- let statement = ''
589
- for (const column of columns) {
590
- const { name, type, defaultValue, notNull } = column;
591
-
592
- const defaultStatement = `${defaultValue ? `DEFAULT ${defaultValue}` : ''}`
593
- const notNullStatement = `${notNull ? 'NOT NULL' : ''}`
594
- statement += `ALTER TABLE ${tableName} ADD COLUMN ${name} ${type} ${defaultStatement} ${notNullStatement}`.trim() + ';'
595
- statement += '\n'
596
- }
597
- return statement.trim()
598
- }
599
-
600
- const prepareAlterColumns = (tableName, columns) => {
601
- let statement = ''
602
- for (const column of columns) {
603
- const { name } = column;
604
-
605
- if (column['type']) {
606
- const { __new } = column.type
607
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET DATA TYPE ${__new};`
608
- statement += '\n'
609
- }
610
-
611
- if (column['defaultValue']) {
612
- const { __new } = column.defaultValue
613
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET DEFAULT ${__new};`
614
- statement += '\n'
615
- }
616
-
617
- if (column['defaultValue__added']) {
618
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET DEFAULT ${column.defaultValue__added};`
619
- statement += '\n'
620
- }
621
-
622
- if (column['defaultValue__deleted']) {
623
- // console.log(`default value deleted`)
624
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} DROP DEFAULT;`
625
- statement += '\n'
626
- }
627
-
628
- if (column['notNull']) {
629
- const { __new } = column.notNull
630
- const dropStatement = __new ? 'SET NOT NULL' : 'DROP NOT NULL'
631
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} ${dropStatement};`
632
- statement += '\n'
633
- }
634
-
635
- if (column['notNull__added']) {
636
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} SET NOT NULL;`
637
- statement += '\n'
638
- }
639
-
640
- if (column['notNull__deleted']) {
641
- statement += `ALTER TABLE ${tableName} ALTER COLUMN ${name} DROP NOT NULL;`
642
- statement += '\n'
643
- }
644
- }
645
- return statement.trim()
646
- }
647
-
648
- const prepareCreateTable = (table) => {
649
- const { name, columns } = table
650
- const mappedColumns = Object.keys(columns)
651
- .map(it => {
652
- return { ...columns[it] }
653
- })
654
-
655
- let statement = ''
656
-
657
- statement += `CREATE TABLE ${name} (\n`
658
- for (const column of mappedColumns) {
659
- // console.log(column);
660
- const primaryKeyStatement = column.primaryKey ? "PRIMARY KEY" : ''
661
- const notNullStatement = column.notNull ? "NOT NULL" : "";
662
- const defaultStatement = column.defaultValue ? `DEFAULT '${column.defaultValue}'` : "";
663
- statement += '\t' + `${column.name} ${column.type} ${primaryKeyStatement} ${defaultStatement} ${notNullStatement}`.replace(/ +/g, ' ').trim() + ',\n'
664
- }
665
- statement += `);`
666
- return statement;
667
- }
668
-
669
- const prepareCreateIndex = (table, indexes) => {
670
- let statement = ''
671
- for (const index of indexes) {
672
- const { name, columns } = index
673
- statement += `CREATE INDEX ${name} ON ${table} (${columns.join(', ')});`
674
- statement += '\n'
675
- }
676
-
677
- return statement.trim()
678
- }
679
-
680
- const prepareDropIndex = (table, indexes) => {
681
- let statement = ''
682
- for (const index of indexes) {
683
- const { name } = index
684
- statement += `DROP INDEX IF EXISTS ${name};`
685
- statement += '\n'
686
- }
687
- return statement.trim()
688
- }
689
-
690
- const prepareRenameTable = (tableFrom, tableTo) => {
691
- const namefrom = tableFrom.name
692
- const nameTo = tableTo.name
693
- const statement = `ALTER TABLE ${namefrom} RENAME TO ${nameTo}`
694
- return statement
695
- }
696
-
697
- const prepareDropTable = (table) => {
698
- const { name } = table;
699
- return `DROP TABLE ${name}`
700
- }
701
-
702
- const prepareCreateEnum = (name, values) => {
703
- // console.log(name, values)
704
- let valuesStatement = '('
705
- valuesStatement += Object.values(values).map(it => `'${it}'`).join(', ')
706
- valuesStatement += ')'
707
-
708
- const statement = `CREATE TYPE ${name} AS ENUM${valuesStatement};`
709
- return statement;
710
- }
711
-
712
- // https://blog.yo1.dog/updating-enum-values-in-postgresql-the-safe-and-easy-way/
713
- const prepareAddValuesToEnum = (name, values) => {
714
- let statement = ''
715
- for (const idx in values) {
716
- statement += `ALTER TYPE ${name} ADD VALUE ${values[idx]};`
717
- statement += '\n'
718
- }
719
- return statement.trim();
720
- }
721
-
722
-
723
-
724
-
725
- // test case for enum altering
726
- `
727
- create table users (
728
- id int,
729
- name character varying(128)
730
- );
731
-
732
- create type venum as enum('one', 'two', 'three');
733
- alter table users add column typed venum;
734
-
735
- insert into users(id, name, typed) values (1, 'name1', 'one');
736
- insert into users(id, name, typed) values (2, 'name2', 'two');
737
- insert into users(id, name, typed) values (3, 'name3', 'three');
738
-
739
- alter type venum rename to __venum;
740
- create type venum as enum ('one', 'two', 'three', 'four', 'five');
741
-
742
- ALTER TABLE users ALTER COLUMN typed TYPE venum USING typed::text::venum;
743
-
744
- insert into users(id, name, typed) values (4, 'name4', 'four');
745
- insert into users(id, name, typed) values (5, 'name5', 'five');
746
-
747
- drop type __venum;
748
- `
749
-
750
- /***/ }),
751
-
752
- /***/ "./src/cli/commands/migration/index.tsx":
753
- /*!**********************************************!*\
754
- !*** ./src/cli/commands/migration/index.tsx ***!
755
- \**********************************************/
756
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
757
-
758
-
759
- var __importDefault = (this && this.__importDefault) || function (mod) {
760
- return (mod && mod.__esModule) ? mod : { "default": mod };
761
- };
762
- Object.defineProperty(exports, "__esModule", ({ value: true }));
763
- const commander_1 = __webpack_require__(/*! commander */ "commander");
764
- const migrate_1 = __importDefault(__webpack_require__(/*! ./migrate */ "./src/cli/commands/migration/migrate/index.tsx"));
765
- const cmd = commander_1.program
766
- .command('migrate')
767
- .alias('mg')
768
- .description('Migration')
769
- .action(migrate_1.default);
770
- cmd.command('start').description('Start migration').action(migrate_1.default);
771
-
772
-
773
- /***/ }),
774
-
775
- /***/ "./src/cli/commands/migration/migrate/index.tsx":
776
- /*!******************************************************!*\
777
- !*** ./src/cli/commands/migration/migrate/index.tsx ***!
778
- \******************************************************/
779
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
780
-
781
-
782
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
783
- if (k2 === undefined) k2 = k;
784
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
785
- }) : (function(o, m, k, k2) {
786
- if (k2 === undefined) k2 = k;
787
- o[k2] = m[k];
788
- }));
789
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
790
- Object.defineProperty(o, "default", { enumerable: true, value: v });
791
- }) : function(o, v) {
792
- o["default"] = v;
793
- });
794
- var __importStar = (this && this.__importStar) || function (mod) {
795
- if (mod && mod.__esModule) return mod;
796
- var result = {};
797
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
798
- __setModuleDefault(result, mod);
799
- return result;
800
- };
801
- var __importDefault = (this && this.__importDefault) || function (mod) {
802
- return (mod && mod.__esModule) ? mod : { "default": mod };
803
- };
804
- Object.defineProperty(exports, "__esModule", ({ value: true }));
805
- const components_api_1 = __webpack_require__(/*! cli/components-api */ "./src/cli/components-api/index.tsx");
806
- const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
807
- const differ = __importStar(__webpack_require__(/*! ../../../../differ */ "./src/differ.js"));
808
- const migrationPreparator_1 = __importDefault(__webpack_require__(/*! migrationPreparator */ "./src/migrationPreparator.ts"));
809
- const jsonStatements_1 = __webpack_require__(/*! ../../../../jsonStatements */ "./src/jsonStatements.js");
810
- const sqlgenerator_1 = __webpack_require__(/*! ../../../../sqlgenerator */ "./src/sqlgenerator.js");
811
- const two = (num) => {
812
- return num.toString().padStart(2, '0');
813
- };
814
- const migrate = async () => {
815
- const timeoutE = (ms) => new Promise((resolve) => setTimeout(resolve, ms)).then(() => {
816
- throw new Error('Checking error handling');
817
- });
818
- const timeout = (ms) => new Promise((resolve) => setTimeout(resolve, ms));
819
- const migrationRootFolder = 'drizzle'; // or from config/params
820
- const { prev, cur } = await (0, components_api_1.task)('preparing data schema json snapshot', async ({ setTitle }) => {
821
- return (0, migrationPreparator_1.default)(migrationRootFolder, './data/v2');
822
- });
823
- // const j1 = JSON.parse(fs.readFileSync('./out/v1_1634546745488.json', 'utf8'));
824
- // const j2 = JSON.parse(fs.readFileSync('./out/v2_1634549601361.json', 'utf8'));
825
- const diff = await (0, components_api_1.task)('preparing schemas diff', async ({ setTitle }) => {
826
- return differ.differ(prev, cur);
827
- });
828
- const { created, renamed, deleted } = await (0, components_api_1.promptTablesConflicts)({
829
- newTables: diff.addedTables,
830
- missingTables: diff.deletedTables,
831
- });
832
- const jsonStatements = [];
833
- const jsonCreateTables = created.map(it => {
834
- return (0, jsonStatements_1.prepareCreateTableJson)(it);
835
- });
836
- const jsonCreateIndexesForCreatedTables = created.map(it => {
837
- return (0, jsonStatements_1.prepareCreateIndexesJson)(it.name, it.indexes);
838
- }).flat();
839
- const jsonDropTables = deleted.map(it => {
840
- return (0, jsonStatements_1.prepareDropTableJson)(it);
841
- });
842
- const jsonRenameTables = renamed.map(it => {
843
- return (0, jsonStatements_1.prepareRenameTableJson)(it.old, it.new);
844
- });
845
- // const createNewTables = created.map(it => {
846
- // return prepareCreateTable(it)
847
- // })
848
- // console.log(createNewTables.join('\n').trim())
849
- // const deleteTables = deleted.map(it => {
850
- // return prepareDropTable(it)
851
- // })
852
- // console.log(deleteTables.join('\n').trim())
853
- const renamedWithAlternations = differ.diffForRenamed(renamed);
854
- const allAltered = diff.alteredTablesWithColumns.concat(renamedWithAlternations);
855
- const allAlteredResolved = [];
856
- for (const table of allAltered) {
857
- const result = await (0, components_api_1.promptColumnsConflicts)(table);
858
- const { deleted, added, ...ini } = table;
859
- allAlteredResolved.push({ ...ini, ...result });
860
- }
861
- // console.log(JSON.stringify(allAlteredResolved, null, 2))
862
- // const renameTables = renamed.map(it => {
863
- // return prepareRenameTable(it.from, it.to)
864
- // })
865
- // console.log(renameTables.join('\n').trim())
866
- const jsonAlterTables = allAlteredResolved.map(it => {
867
- return (0, jsonStatements_1.prepareAlterTableColumnsJson)(it);
868
- }).flat();
869
- const jsonCreateIndexesForAllAlteredTables = allAlteredResolved.map(it => {
870
- return (0, jsonStatements_1.prepareCreateIndexesJson)(it.name, it.addedIndexes || {});
871
- }).flat();
872
- const jsonDropIndexesForAllAlteredTables = allAlteredResolved.map(it => {
873
- return (0, jsonStatements_1.prepareDropIndexesJson)(it.name, it.deletedIndexes || {});
874
- }).flat();
875
- // // Enums:
876
- // // - создание енама ✅
877
- // // - переименование енама (пока не делаю)⏳
878
- // // - добавление вэлью к енаму ✅
879
- // // - ренейм вейлью у енама (пока не делаю, это надо запрашивать опять же через слай)⏳
880
- // // - удаление енама -> чекать не используется ли где-то енам и сначала ранить миграции и в самом конце удаление енама⏳
881
- // // - удаление вэлью из енама -> блок ❌
882
- // const enums = result.addedEnums.map(it => {
883
- // return prepareCreateEnum(it.name, it.values)
884
- // })
885
- const createEnums = diff.addedEnums.map(it => {
886
- return (0, jsonStatements_1.prepareCreateEnumJson)(it.name, it.values);
887
- });
888
- //todo: block enum rename, enum value rename and enun deletion for now
889
- const jsonAlterEnumsWithAddedValues = diff.alteredEnums.map(it => {
890
- return (0, jsonStatements_1.prepareAddValuesToEnumJson)(it.name, it.addedValues);
891
- }).flat();
892
- jsonStatements.push(...createEnums);
893
- jsonStatements.push(...jsonAlterEnumsWithAddedValues);
894
- jsonStatements.push(...jsonCreateTables);
895
- jsonStatements.push(...jsonCreateIndexesForCreatedTables);
896
- jsonStatements.push(...jsonDropTables);
897
- jsonStatements.push(...jsonRenameTables);
898
- jsonStatements.push(...jsonAlterTables);
899
- jsonStatements.push(...jsonCreateIndexesForAllAlteredTables);
900
- jsonStatements.push(...jsonDropIndexesForAllAlteredTables);
901
- // console.log(JSON.stringify(jsonStatements, null, 2))
902
- // console.log(jsonStatements)
903
- const sqlStatements = (0, sqlgenerator_1.fromJson)(jsonStatements);
904
- console.log(sqlStatements.join('\n'));
905
- // todo: save results to a new migration folder
906
- const date = new Date();
907
- // const folderName = `${date.getFullYear()}-${two(date.getMonth())}-${two(date.getDate())} ${two(date.getHours())}:${two(date.getMinutes())}:${two(date.getSeconds())}`
908
- const folderName = date.toISOString();
909
- const migrationFolderPath = `./${migrationRootFolder}/${folderName}`;
910
- fs_1.default.mkdirSync(migrationFolderPath);
911
- fs_1.default.writeFileSync(`${migrationFolderPath}/snapshot.json`, JSON.stringify(cur, null, 2));
912
- fs_1.default.writeFileSync(`${migrationFolderPath}/migration.sql`, sqlStatements.join('\n'));
913
- };
914
- exports["default"] = migrate;
915
-
916
-
917
- /***/ }),
918
-
919
- /***/ "./src/cli/components-api/ComponentsList.tsx":
920
- /*!***************************************************!*\
921
- !*** ./src/cli/components-api/ComponentsList.tsx ***!
922
- \***************************************************/
923
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
924
-
925
-
926
- var __importDefault = (this && this.__importDefault) || function (mod) {
927
- return (mod && mod.__esModule) ? mod : { "default": mod };
928
- };
929
- Object.defineProperty(exports, "__esModule", ({ value: true }));
930
- const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
931
- const valtio_1 = __webpack_require__(/*! valtio */ "valtio");
932
- const ComponentsList = ({ componentsList, }) => {
933
- (0, valtio_1.useSnapshot)(componentsList);
934
- return (react_1.default.createElement(react_1.default.Fragment, null, componentsList.map((component, i) => ({ ...component, key: i }))));
935
- };
936
- exports["default"] = ComponentsList;
937
-
938
-
939
- /***/ }),
940
-
941
- /***/ "./src/cli/components-api/CreateApp.tsx":
942
- /*!**********************************************!*\
943
- !*** ./src/cli/components-api/CreateApp.tsx ***!
944
- \**********************************************/
945
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
946
-
947
-
948
- var __importDefault = (this && this.__importDefault) || function (mod) {
949
- return (mod && mod.__esModule) ? mod : { "default": mod };
950
- };
951
- Object.defineProperty(exports, "__esModule", ({ value: true }));
952
- const ink_1 = __webpack_require__(/*! ink */ "ink");
953
- const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
954
- const ComponentsList_1 = __importDefault(__webpack_require__(/*! cli/components-api/ComponentsList */ "./src/cli/components-api/ComponentsList.tsx"));
955
- const createApp = (componentsList) => {
956
- const inkApp = (0, ink_1.render)(react_1.default.createElement(ComponentsList_1.default, { componentsList: componentsList }));
957
- return {
958
- remove() {
959
- inkApp.rerender(null);
960
- inkApp.unmount();
961
- inkApp.clear();
962
- inkApp.cleanup();
963
- },
964
- };
965
- };
966
- exports["default"] = createApp;
967
-
968
-
969
- /***/ }),
970
-
971
- /***/ "./src/cli/components-api/components/PromptColumnsConflicts.tsx":
972
- /*!**********************************************************************!*\
973
- !*** ./src/cli/components-api/components/PromptColumnsConflicts.tsx ***!
974
- \**********************************************************************/
975
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
976
-
977
-
978
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
979
- if (k2 === undefined) k2 = k;
980
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
981
- }) : (function(o, m, k, k2) {
982
- if (k2 === undefined) k2 = k;
983
- o[k2] = m[k];
984
- }));
985
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
986
- Object.defineProperty(o, "default", { enumerable: true, value: v });
987
- }) : function(o, v) {
988
- o["default"] = v;
989
- });
990
- var __importStar = (this && this.__importStar) || function (mod) {
991
- if (mod && mod.__esModule) return mod;
992
- var result = {};
993
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
994
- __setModuleDefault(result, mod);
995
- return result;
996
- };
997
- var __importDefault = (this && this.__importDefault) || function (mod) {
998
- return (mod && mod.__esModule) ? mod : { "default": mod };
999
- };
1000
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1001
- const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
1002
- const ink_1 = __webpack_require__(/*! ink */ "ink");
1003
- const ink_select_input_1 = __importDefault(__webpack_require__(/*! ink-select-input */ "ink-select-input"));
1004
- const ink_table_1 = __importStar(__webpack_require__(/*! ink-table */ "ink-table"));
1005
- const react_2 = __webpack_require__(/*! @xstate/react */ "@xstate/react");
1006
- const formatDataForTable_1 = __importDefault(__webpack_require__(/*! cli/utils/formatDataForTable */ "./src/cli/utils/formatDataForTable.ts"));
1007
- const valuesForPrompts_1 = __webpack_require__(/*! cli/utils/valuesForPrompts */ "./src/cli/utils/valuesForPrompts.ts");
1008
- const resolveColumnsMachine_1 = __importDefault(__webpack_require__(/*! cli/machines/resolveColumnsMachine */ "./src/cli/machines/resolveColumnsMachine.ts"));
1009
- const PromptColumnsConflicts = ({ onDone, tableWithColumns: props, }) => {
1010
- const [current, send] = (0, react_2.useMachine)((0, resolveColumnsMachine_1.default)({ tableWithColumns: props }));
1011
- const { tableName, addedColumns, deletedColumns, missingItemIndex, created, renamed, deleted, } = current.context;
1012
- const selectItemIndex = (item) => {
1013
- send({ type: 'CHOICE_ITEM', itemIndex: item.value });
1014
- };
1015
- const selectNewItemIndex = (item) => {
1016
- send({ type: 'CHOICE_NEW_ITEM', itemIndex: item.value });
1017
- };
1018
- const selectAction = (action) => {
1019
- send({ type: action.value });
1020
- };
1021
- const confirm = (confirmationItem) => {
1022
- send({ type: confirmationItem.value });
1023
- };
1024
- const renderDOM = () => {
1025
- if (current.matches('table')) {
1026
- return (react_1.default.createElement(react_1.default.Fragment, null,
1027
- react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" },
1028
- react_1.default.createElement(ink_1.Box, { display: "flex" },
1029
- react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
1030
- react_1.default.createElement(ink_table_1.Header, null, `Table "${tableName}" missing columns:`),
1031
- react_1.default.createElement(ink_select_input_1.default, { items: deletedColumns.map((column, i) => ({
1032
- key: String(i),
1033
- label: column.name,
1034
- value: i,
1035
- })), onSelect: selectItemIndex })),
1036
- !!addedColumns?.length && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 5 },
1037
- react_1.default.createElement(ink_table_1.Header, null, "New tables:"),
1038
- react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" }, addedColumns.map(({ name }, i) => react_1.default.createElement(ink_1.Text, { key: name + i }, name)))))))));
1039
- }
1040
- if (current.matches('action.actionChoice')) {
1041
- const tempActions = !addedColumns.length
1042
- ? valuesForPrompts_1.actions.filter(({ value }) => value !== valuesForPrompts_1.Action.RENAME)
1043
- : valuesForPrompts_1.actions;
1044
- return (react_1.default.createElement(react_1.default.Fragment, null,
1045
- react_1.default.createElement(ink_table_1.Header, null, `${deletedColumns[missingItemIndex]?.name} is:`),
1046
- react_1.default.createElement(ink_select_input_1.default, { items: tempActions, onSelect: selectAction })));
1047
- }
1048
- if (current.matches('confirmationDelete')) {
1049
- return (react_1.default.createElement(react_1.default.Fragment, null,
1050
- react_1.default.createElement(ink_table_1.Header, null, "!!! Data in table will be lost !!!"),
1051
- react_1.default.createElement(ink_1.Text, null, "Are you sure?"),
1052
- react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
1053
- }
1054
- if (current.matches('confirmationRename')) {
1055
- return (react_1.default.createElement(react_1.default.Fragment, null,
1056
- react_1.default.createElement(ink_table_1.Header, null, "Are you sure?"),
1057
- react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
1058
- }
1059
- if (current.matches('action.rename')) {
1060
- return (react_1.default.createElement(react_1.default.Fragment, null,
1061
- react_1.default.createElement(ink_table_1.Header, null, `${deletedColumns[missingItemIndex]?.name} was renamed to:`),
1062
- react_1.default.createElement(ink_select_input_1.default, { items: addedColumns.map((table, i) => ({
1063
- key: String(i),
1064
- label: table.name,
1065
- value: i,
1066
- })), onSelect: selectNewItemIndex })));
1067
- }
1068
- if (current.matches('done')) {
1069
- onDone({ created, renamed, deleted });
1070
- }
1071
- return (react_1.default.createElement(react_1.default.Fragment, null));
1072
- };
1073
- return (!!deleted.length
1074
- || !!renamed.length
1075
- || !!created.length) ? (react_1.default.createElement(ink_1.Box, { flexDirection: "column", margin: 1 },
1076
- react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 0 },
1077
- react_1.default.createElement(ink_table_1.Header, null, `${tableName} columns:`),
1078
- react_1.default.createElement(ink_table_1.default, { data: (0, formatDataForTable_1.default)([
1079
- {
1080
- title: 'Deleted',
1081
- values: deleted,
1082
- },
1083
- {
1084
- title: 'Renamed',
1085
- values: renamed,
1086
- },
1087
- {
1088
- title: 'Created',
1089
- values: created,
1090
- },
1091
- ]) })),
1092
- renderDOM())) : renderDOM();
1093
- };
1094
- exports["default"] = PromptColumnsConflicts;
1095
-
1096
-
1097
- /***/ }),
1098
-
1099
- /***/ "./src/cli/components-api/components/PromptTablesConflicts.tsx":
1100
- /*!*********************************************************************!*\
1101
- !*** ./src/cli/components-api/components/PromptTablesConflicts.tsx ***!
1102
- \*********************************************************************/
1103
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1104
-
1105
-
1106
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
1107
- if (k2 === undefined) k2 = k;
1108
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
1109
- }) : (function(o, m, k, k2) {
1110
- if (k2 === undefined) k2 = k;
1111
- o[k2] = m[k];
1112
- }));
1113
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
1114
- Object.defineProperty(o, "default", { enumerable: true, value: v });
1115
- }) : function(o, v) {
1116
- o["default"] = v;
1117
- });
1118
- var __importStar = (this && this.__importStar) || function (mod) {
1119
- if (mod && mod.__esModule) return mod;
1120
- var result = {};
1121
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
1122
- __setModuleDefault(result, mod);
1123
- return result;
1124
- };
1125
- var __importDefault = (this && this.__importDefault) || function (mod) {
1126
- return (mod && mod.__esModule) ? mod : { "default": mod };
1127
- };
1128
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1129
- const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
1130
- const ink_1 = __webpack_require__(/*! ink */ "ink");
1131
- const ink_select_input_1 = __importDefault(__webpack_require__(/*! ink-select-input */ "ink-select-input"));
1132
- const ink_table_1 = __importStar(__webpack_require__(/*! ink-table */ "ink-table"));
1133
- const react_2 = __webpack_require__(/*! @xstate/react */ "@xstate/react");
1134
- const resolveTablesMachine_1 = __importDefault(__webpack_require__(/*! cli/machines/resolveTablesMachine */ "./src/cli/machines/resolveTablesMachine.ts"));
1135
- const formatDataForTable_1 = __importDefault(__webpack_require__(/*! cli/utils/formatDataForTable */ "./src/cli/utils/formatDataForTable.ts"));
1136
- const valuesForPrompts_1 = __webpack_require__(/*! cli/utils/valuesForPrompts */ "./src/cli/utils/valuesForPrompts.ts");
1137
- const PromptTablesConflicts = ({ onDone, newTables: newProps, missingTables: missingProps, }) => {
1138
- const [current, send] = (0, react_2.useMachine)((0, resolveTablesMachine_1.default)({
1139
- missingTables: missingProps,
1140
- newTables: newProps,
1141
- }));
1142
- const { missingItemIndex, newTables, missingTables, createdTables, renamedTables, deletedTables, } = current.context;
1143
- const selectItemIndex = (item) => {
1144
- send({ type: 'CHOICE_ITEM', itemIndex: item.value });
1145
- };
1146
- const selectNewItemIndex = (item) => {
1147
- send({ type: 'CHOICE_NEW_ITEM', itemIndex: item.value });
1148
- };
1149
- const selectAction = (action) => {
1150
- send({ type: action.value });
1151
- };
1152
- const confirm = (confirmationItem) => {
1153
- send({ type: confirmationItem.value });
1154
- };
1155
- const renderDOM = () => {
1156
- if (current.matches('table')) {
1157
- return (react_1.default.createElement(react_1.default.Fragment, null,
1158
- react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" },
1159
- react_1.default.createElement(ink_1.Box, { display: "flex" },
1160
- react_1.default.createElement(ink_1.Box, { flexDirection: "column" },
1161
- react_1.default.createElement(ink_table_1.Header, null, "Missing tables:"),
1162
- react_1.default.createElement(ink_select_input_1.default, { items: missingTables.map((table, i) => ({
1163
- key: String(i),
1164
- label: table.name,
1165
- value: i,
1166
- })), onSelect: selectItemIndex })),
1167
- !!newTables?.length && (react_1.default.createElement(ink_1.Box, { flexDirection: "column", paddingLeft: 5 },
1168
- react_1.default.createElement(ink_table_1.Header, null, "New tables:"),
1169
- react_1.default.createElement(ink_1.Box, { display: "flex", flexDirection: "column" }, newTables.map(({ name }, i) => react_1.default.createElement(ink_1.Text, { key: name + i }, name)))))))));
1170
- }
1171
- if (current.matches('action.actionChoice')) {
1172
- const tempActions = !newTables.length
1173
- ? valuesForPrompts_1.actions.filter(({ value }) => value !== valuesForPrompts_1.Action.RENAME)
1174
- : valuesForPrompts_1.actions;
1175
- return (react_1.default.createElement(react_1.default.Fragment, null,
1176
- react_1.default.createElement(ink_table_1.Header, null, `${missingTables[missingItemIndex]?.name} is:`),
1177
- react_1.default.createElement(ink_select_input_1.default, { items: tempActions, onSelect: selectAction })));
1178
- }
1179
- if (current.matches('confirmationDelete')) {
1180
- return (react_1.default.createElement(react_1.default.Fragment, null,
1181
- react_1.default.createElement(ink_table_1.Header, null, "!!! Data in table will be lost !!!"),
1182
- react_1.default.createElement(ink_1.Text, null, "Are you sure?"),
1183
- react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
1184
- }
1185
- if (current.matches('confirmationRename')) {
1186
- return (react_1.default.createElement(react_1.default.Fragment, null,
1187
- react_1.default.createElement(ink_table_1.Header, null, "Are you sure?"),
1188
- react_1.default.createElement(ink_select_input_1.default, { items: valuesForPrompts_1.confirmations, onSelect: confirm })));
1189
- }
1190
- if (current.matches('action.rename')) {
1191
- return (react_1.default.createElement(react_1.default.Fragment, null,
1192
- react_1.default.createElement(ink_table_1.Header, null, `${missingTables[missingItemIndex]?.name} was renamed to:`),
1193
- react_1.default.createElement(ink_select_input_1.default, { items: newTables.map((table, i) => ({
1194
- key: String(i),
1195
- label: table.name,
1196
- value: i,
1197
- })), onSelect: selectNewItemIndex })));
1198
- }
1199
- if (current.matches('done')) {
1200
- onDone({
1201
- created: createdTables,
1202
- renamed: renamedTables,
1203
- deleted: deletedTables,
1204
- });
1205
- }
1206
- return (react_1.default.createElement(react_1.default.Fragment, null));
1207
- };
1208
- return (!!deletedTables.length
1209
- || !!renamedTables.length
1210
- || !!createdTables.length) ? (react_1.default.createElement(ink_1.Box, { flexDirection: "column", margin: 1 },
1211
- react_1.default.createElement(ink_1.Box, { flexDirection: "column", marginBottom: 0 },
1212
- react_1.default.createElement(ink_table_1.Header, null, "Tables: "),
1213
- react_1.default.createElement(ink_table_1.default, { data: (0, formatDataForTable_1.default)([
1214
- {
1215
- title: 'Deleted',
1216
- values: deletedTables,
1217
- },
1218
- {
1219
- title: 'Renamed',
1220
- values: renamedTables,
1221
- },
1222
- {
1223
- title: 'Created',
1224
- values: createdTables,
1225
- },
1226
- ]) })),
1227
- renderDOM())) : renderDOM();
1228
- };
1229
- exports["default"] = PromptTablesConflicts;
1230
-
1231
-
1232
- /***/ }),
1233
-
1234
- /***/ "./src/cli/components-api/components/Task.tsx":
1235
- /*!****************************************************!*\
1236
- !*** ./src/cli/components-api/components/Task.tsx ***!
1237
- \****************************************************/
1238
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1239
-
1240
-
1241
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
1242
- if (k2 === undefined) k2 = k;
1243
- Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } });
1244
- }) : (function(o, m, k, k2) {
1245
- if (k2 === undefined) k2 = k;
1246
- o[k2] = m[k];
1247
- }));
1248
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
1249
- Object.defineProperty(o, "default", { enumerable: true, value: v });
1250
- }) : function(o, v) {
1251
- o["default"] = v;
1252
- });
1253
- var __importStar = (this && this.__importStar) || function (mod) {
1254
- if (mod && mod.__esModule) return mod;
1255
- var result = {};
1256
- if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
1257
- __setModuleDefault(result, mod);
1258
- return result;
1259
- };
1260
- var __importDefault = (this && this.__importDefault) || function (mod) {
1261
- return (mod && mod.__esModule) ? mod : { "default": mod };
1262
- };
1263
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1264
- const react_1 = __importStar(__webpack_require__(/*! react */ "react"));
1265
- const ink_1 = __webpack_require__(/*! ink */ "ink");
1266
- const ink_spinner_1 = __importDefault(__webpack_require__(/*! ink-spinner */ "ink-spinner"));
1267
- var StepState;
1268
- (function (StepState) {
1269
- StepState[StepState["IN_PROGRESS"] = 0] = "IN_PROGRESS";
1270
- StepState[StepState["SUCCESS"] = 1] = "SUCCESS";
1271
- StepState[StepState["FAIL"] = 2] = "FAIL";
1272
- })(StepState || (StepState = {}));
1273
- const Task = (props) => {
1274
- const { func, onDone, titleStr, } = props;
1275
- const [title, setTitle] = (0, react_1.useState)(titleStr);
1276
- const [state, setState] = (0, react_1.useState)(StepState.IN_PROGRESS);
1277
- const [error, setError] = (0, react_1.useState)(null);
1278
- (0, react_1.useEffect)(() => {
1279
- (async () => {
1280
- try {
1281
- const result = await func({ setTitle, setError });
1282
- setState(StepState.SUCCESS);
1283
- onDone(result);
1284
- }
1285
- catch (e) {
1286
- setError(e);
1287
- setState(StepState.FAIL);
1288
- }
1289
- })();
1290
- }, []);
1291
- return (react_1.default.createElement(ink_1.Box, { flexDirection: "row" },
1292
- react_1.default.createElement(ink_1.Box, { marginRight: 1 },
1293
- state === StepState.IN_PROGRESS ? (react_1.default.createElement(ink_1.Text, null,
1294
- "[",
1295
- react_1.default.createElement(ink_spinner_1.default, { type: "dots" }),
1296
- "]")) : state === StepState.SUCCESS ? (react_1.default.createElement(ink_1.Text, null,
1297
- "[",
1298
- react_1.default.createElement(ink_1.Text, { color: "green" }, "\u2713"),
1299
- "]")) : (react_1.default.createElement(ink_1.Text, null,
1300
- "[",
1301
- react_1.default.createElement(ink_1.Text, { color: "red" }, "\u00D7"),
1302
- "]")),
1303
- state === StepState.FAIL ? (react_1.default.createElement(ink_1.Text, null,
1304
- title,
1305
- react_1.default.createElement(ink_1.Newline, null),
1306
- react_1.default.createElement(ink_1.Text, { color: "red" }, error.message))) : (react_1.default.createElement(react_1.default.Fragment, null,
1307
- react_1.default.createElement(ink_1.Text, null, title))))));
1308
- };
1309
- exports["default"] = Task;
1310
-
1311
-
1312
- /***/ }),
1313
-
1314
- /***/ "./src/cli/components-api/index.tsx":
1315
- /*!******************************************!*\
1316
- !*** ./src/cli/components-api/index.tsx ***!
1317
- \******************************************/
1318
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1319
-
1320
-
1321
- var __importDefault = (this && this.__importDefault) || function (mod) {
1322
- return (mod && mod.__esModule) ? mod : { "default": mod };
1323
- };
1324
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1325
- exports.promptColumnsConflicts = exports.promptTablesConflicts = exports.task = void 0;
1326
- const react_1 = __importDefault(__webpack_require__(/*! react */ "react"));
1327
- const valtio_1 = __webpack_require__(/*! valtio */ "valtio");
1328
- const Task_1 = __importDefault(__webpack_require__(/*! cli/components-api/components/Task */ "./src/cli/components-api/components/Task.tsx"));
1329
- const CreateApp_1 = __importDefault(__webpack_require__(/*! cli/components-api/CreateApp */ "./src/cli/components-api/CreateApp.tsx"));
1330
- const PromptTablesConflicts_1 = __importDefault(__webpack_require__(/*! cli/components-api/components/PromptTablesConflicts */ "./src/cli/components-api/components/PromptTablesConflicts.tsx"));
1331
- const PromptColumnsConflicts_1 = __importDefault(__webpack_require__(/*! cli/components-api/components/PromptColumnsConflicts */ "./src/cli/components-api/components/PromptColumnsConflicts.tsx"));
1332
- const componentsList = (0, valtio_1.proxy)([]);
1333
- let app;
1334
- const prepareApp = () => {
1335
- if (!app) {
1336
- app = (0, CreateApp_1.default)(componentsList);
1337
- componentsList.length = 0;
1338
- }
1339
- };
1340
- const task = (titleStr, func) => new Promise((resolve) => {
1341
- prepareApp();
1342
- componentsList.push(react_1.default.createElement(Task_1.default, { titleStr: titleStr, func: func, onDone: (val) => resolve(val) }));
1343
- });
1344
- exports.task = task;
1345
- const promptTablesConflicts = ({ missingTables, newTables }) => new Promise((resolve) => {
1346
- prepareApp();
1347
- componentsList.push(react_1.default.createElement(PromptTablesConflicts_1.default, { onDone: (val) => resolve(val), missingTables: missingTables, newTables: newTables }));
1348
- });
1349
- exports.promptTablesConflicts = promptTablesConflicts;
1350
- const promptColumnsConflicts = (tableWithColumns) => new Promise((resolve) => {
1351
- prepareApp();
1352
- componentsList.push(react_1.default.createElement(PromptColumnsConflicts_1.default, { onDone: (val) => resolve(val), tableWithColumns: tableWithColumns }));
1353
- });
1354
- exports.promptColumnsConflicts = promptColumnsConflicts;
1355
-
1356
-
1357
- /***/ }),
1358
-
1359
- /***/ "./src/cli/machines/resolveColumnsMachine.ts":
1360
- /*!***************************************************!*\
1361
- !*** ./src/cli/machines/resolveColumnsMachine.ts ***!
1362
- \***************************************************/
1363
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1364
-
1365
-
1366
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1367
- const xstate_1 = __webpack_require__(/*! xstate */ "xstate");
1368
- const createResolveColumnsMachine = (props) => ((0, xstate_1.createMachine)({
1369
- id: 'resolveColumns',
1370
- initial: 'table',
1371
- context: {
1372
- tableName: props.tableWithColumns.name,
1373
- addedColumns: props.tableWithColumns.added,
1374
- deletedColumns: props.tableWithColumns.deleted,
1375
- missingItemIndex: 0,
1376
- newItemIndex: 0,
1377
- created: [],
1378
- renamed: [],
1379
- deleted: [],
1380
- },
1381
- states: {
1382
- table: {
1383
- entry: (0, xstate_1.send)({ type: 'NEXT' }),
1384
- on: {
1385
- NEXT: [
1386
- {
1387
- target: 'done',
1388
- cond: 'isMissingColumnsResolved',
1389
- actions: ['resolveRemaining'],
1390
- },
1391
- {
1392
- target: 'done',
1393
- cond: 'isNewColumnsResolved',
1394
- actions: ['resolveMissing'],
1395
- },
1396
- ],
1397
- CHOICE_ITEM: { target: 'action', actions: ['choseItem'] },
1398
- },
1399
- },
1400
- action: {
1401
- initial: 'actionChoice',
1402
- states: {
1403
- actionChoice: {
1404
- on: { DELETE: '#resolveColumns.confirmationDelete', RENAME: 'rename' },
1405
- },
1406
- rename: {
1407
- on: {
1408
- CHOICE_NEW_ITEM: { target: '#resolveColumns.confirmationRename', actions: ['choseNewItem'] },
1409
- },
1410
- },
1411
- },
1412
- },
1413
- confirmationDelete: {
1414
- on: {
1415
- CANCEL: 'action.actionChoice',
1416
- CONFIRM: [
1417
- { target: 'final', actions: ['delete'] },
1418
- ],
1419
- },
1420
- },
1421
- confirmationRename: {
1422
- on: {
1423
- CANCEL: 'action.actionChoice',
1424
- CONFIRM: [
1425
- { target: 'final', actions: ['rename'] },
1426
- ],
1427
- },
1428
- },
1429
- final: {
1430
- entry: (0, xstate_1.send)({ type: 'NEXT' }),
1431
- on: {
1432
- NEXT: [
1433
- {
1434
- target: 'done',
1435
- cond: 'isMissingColumnsResolved',
1436
- actions: ['resolveRemaining'],
1437
- },
1438
- {
1439
- target: 'table',
1440
- },
1441
- ],
1442
- },
1443
- },
1444
- done: {},
1445
- },
1446
- }, {
1447
- guards: {
1448
- isMissingColumnsResolved: ({ deletedColumns }) => !deletedColumns.length,
1449
- isNewColumnsResolved: ({ addedColumns }) => !addedColumns.length,
1450
- },
1451
- actions: {
1452
- choseItem: (0, xstate_1.assign)({
1453
- missingItemIndex: (context, event) => (event.type === 'CHOICE_ITEM' ? event.itemIndex : 0),
1454
- }),
1455
- choseNewItem: (0, xstate_1.assign)({
1456
- newItemIndex: (context, event) => (event.type === 'CHOICE_NEW_ITEM' ? event.itemIndex : 0),
1457
- }),
1458
- delete: (0, xstate_1.assign)({
1459
- deleted: ({ missingItemIndex, deleted, deletedColumns, }) => [...deleted, deletedColumns[missingItemIndex]],
1460
- deletedColumns: ({ missingItemIndex, deletedColumns, }) => deletedColumns.filter((_, index) => index !== missingItemIndex),
1461
- }),
1462
- rename: (0, xstate_1.assign)({
1463
- renamed: ({ missingItemIndex, newItemIndex, renamed, addedColumns, deletedColumns, }) => [
1464
- ...renamed,
1465
- { old: deletedColumns[missingItemIndex], new: addedColumns[newItemIndex] },
1466
- ],
1467
- deletedColumns: ({ missingItemIndex, deletedColumns, }) => deletedColumns.filter((_, index) => index !== missingItemIndex),
1468
- addedColumns: ({ newItemIndex, addedColumns, }) => addedColumns.filter((_, index) => index !== newItemIndex),
1469
- }),
1470
- resolveRemaining: (0, xstate_1.assign)({
1471
- created: ({ addedColumns, created, }) => [...created, ...addedColumns],
1472
- addedColumns: (context) => [],
1473
- }),
1474
- resolveMissing: (0, xstate_1.assign)({
1475
- deleted: ({ deletedColumns, deleted, }) => [...deleted, ...deletedColumns],
1476
- deletedColumns: (context) => [],
1477
- }),
1478
- },
1479
- }));
1480
- exports["default"] = createResolveColumnsMachine;
1481
-
1482
-
1483
- /***/ }),
1484
-
1485
- /***/ "./src/cli/machines/resolveTablesMachine.ts":
1486
- /*!**************************************************!*\
1487
- !*** ./src/cli/machines/resolveTablesMachine.ts ***!
1488
- \**************************************************/
1489
- /***/ ((__unused_webpack_module, exports, __webpack_require__) => {
1490
-
1491
-
1492
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1493
- const xstate_1 = __webpack_require__(/*! xstate */ "xstate");
1494
- const createResolveTablesMachine = (props) => ((0, xstate_1.createMachine)({
1495
- id: 'resolveTables',
1496
- initial: 'table',
1497
- context: {
1498
- ...props,
1499
- missingItemIndex: 0,
1500
- newItemIndex: 0,
1501
- createdTables: [],
1502
- renamedTables: [],
1503
- deletedTables: [],
1504
- },
1505
- states: {
1506
- table: {
1507
- entry: (0, xstate_1.send)({ type: 'NEXT' }),
1508
- on: {
1509
- NEXT: [
1510
- {
1511
- target: 'done',
1512
- cond: 'isMissingTablesResolved',
1513
- actions: ['resolveRemaining'],
1514
- },
1515
- {
1516
- target: 'done',
1517
- cond: 'isNewTablesResolved',
1518
- actions: ['resolveMissing'],
1519
- },
1520
- ],
1521
- CHOICE_ITEM: { target: 'action', actions: ['choseItem'] },
1522
- },
1523
- },
1524
- action: {
1525
- initial: 'actionChoice',
1526
- states: {
1527
- actionChoice: {
1528
- on: { DELETE: '#resolveTables.confirmationDelete', RENAME: 'rename' },
1529
- },
1530
- rename: {
1531
- on: {
1532
- CHOICE_NEW_ITEM: { target: '#resolveTables.confirmationRename', actions: ['choseNewItem'] },
1533
- },
1534
- },
1535
- },
1536
- },
1537
- confirmationDelete: {
1538
- on: {
1539
- CANCEL: 'action.actionChoice',
1540
- CONFIRM: [
1541
- { target: 'final', actions: ['delete'] },
1542
- ],
1543
- },
1544
- },
1545
- confirmationRename: {
1546
- on: {
1547
- CANCEL: 'action.actionChoice',
1548
- CONFIRM: [
1549
- { target: 'final', actions: ['rename'] },
1550
- ],
1551
- },
1552
- },
1553
- final: {
1554
- entry: (0, xstate_1.send)({ type: 'NEXT' }),
1555
- on: {
1556
- NEXT: [
1557
- {
1558
- target: 'done',
1559
- cond: 'isMissingTablesResolved',
1560
- actions: ['resolveRemaining'],
1561
- },
1562
- {
1563
- target: 'table',
1564
- },
1565
- ],
1566
- },
1567
- },
1568
- done: {},
1569
- },
1570
- }, {
1571
- guards: {
1572
- isMissingTablesResolved: ({ missingTables }) => !missingTables.length,
1573
- isNewTablesResolved: ({ newTables }) => !newTables.length,
1574
- },
1575
- actions: {
1576
- choseItem: (0, xstate_1.assign)({
1577
- missingItemIndex: (context, event) => (event.type === 'CHOICE_ITEM' ? event.itemIndex : 0),
1578
- }),
1579
- choseNewItem: (0, xstate_1.assign)({
1580
- newItemIndex: (context, event) => (event.type === 'CHOICE_NEW_ITEM' ? event.itemIndex : 0),
1581
- }),
1582
- delete: (0, xstate_1.assign)({
1583
- deletedTables: ({ missingItemIndex, deletedTables, missingTables, }) => [...deletedTables, missingTables[missingItemIndex]],
1584
- missingTables: ({ missingItemIndex, missingTables, }) => missingTables.filter((_, index) => index !== missingItemIndex),
1585
- }),
1586
- rename: (0, xstate_1.assign)({
1587
- renamedTables: ({ missingItemIndex, newItemIndex, renamedTables, newTables, missingTables, }) => [
1588
- ...renamedTables,
1589
- { old: missingTables[missingItemIndex], new: newTables[newItemIndex] },
1590
- ],
1591
- missingTables: ({ missingItemIndex, missingTables, }) => missingTables.filter((_, index) => index !== missingItemIndex),
1592
- newTables: ({ newItemIndex, newTables, }) => newTables.filter((_, index) => index !== newItemIndex),
1593
- }),
1594
- resolveRemaining: (0, xstate_1.assign)({
1595
- createdTables: ({ newTables, createdTables, }) => [...createdTables, ...newTables],
1596
- newTables: (context) => [],
1597
- }),
1598
- resolveMissing: (0, xstate_1.assign)({
1599
- deletedTables: ({ missingTables, deletedTables, }) => [...deletedTables, ...missingTables],
1600
- missingTables: (context) => [],
1601
- }),
1602
- },
1603
- }));
1604
- exports["default"] = createResolveTablesMachine;
1605
-
1606
-
1607
- /***/ }),
1608
-
1609
- /***/ "./src/cli/utils/formatDataForTable.ts":
1610
- /*!*********************************************!*\
1611
- !*** ./src/cli/utils/formatDataForTable.ts ***!
1612
- \*********************************************/
1613
- /***/ ((__unused_webpack_module, exports) => {
1614
-
1615
-
1616
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1617
- exports["default"] = (data) => {
1618
- const array = [];
1619
- array.length = data.reduce((acc, { values }) => {
1620
- if (acc < values.length) {
1621
- return values.length;
1622
- }
1623
- return acc;
1624
- }, 0);
1625
- array.fill({ '': '' });
1626
- return array.map((_, i) => {
1627
- const temp = {};
1628
- data.forEach((item, ind) => {
1629
- temp[data[ind].title] = item.values[i]?.old?.name
1630
- ? `${item.values[i]?.old?.name} -> ${item.values[i]?.new?.name}`
1631
- : item.values[i]?.name || '';
1632
- });
1633
- return temp;
1634
- });
1635
- };
1636
-
1637
-
1638
- /***/ }),
1639
-
1640
- /***/ "./src/cli/utils/valuesForPrompts.ts":
1641
- /*!*******************************************!*\
1642
- !*** ./src/cli/utils/valuesForPrompts.ts ***!
1643
- \*******************************************/
1644
- /***/ ((__unused_webpack_module, exports) => {
1645
-
1646
-
1647
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1648
- exports.confirmations = exports.actions = exports.Confirmation = exports.Action = void 0;
1649
- var Action;
1650
- (function (Action) {
1651
- Action["RENAME"] = "RENAME";
1652
- Action["DELETE"] = "DELETE";
1653
- })(Action = exports.Action || (exports.Action = {}));
1654
- var Confirmation;
1655
- (function (Confirmation) {
1656
- Confirmation["CANCEL"] = "CANCEL";
1657
- Confirmation["CONFIRM"] = "CONFIRM";
1658
- })(Confirmation = exports.Confirmation || (exports.Confirmation = {}));
1659
- exports.actions = [
1660
- {
1661
- key: Action.RENAME,
1662
- label: 'Renamed',
1663
- value: Action.RENAME,
1664
- },
1665
- {
1666
- key: Action.DELETE,
1667
- label: 'Deleted',
1668
- value: Action.DELETE,
1669
- },
1670
- ];
1671
- exports.confirmations = [
1672
- {
1673
- key: Confirmation.CONFIRM,
1674
- label: 'Yes',
1675
- value: Confirmation.CONFIRM,
1676
- },
1677
- {
1678
- key: Confirmation.CANCEL,
1679
- label: 'No',
1680
- value: Confirmation.CANCEL,
1681
- },
1682
- ];
1683
-
1684
-
1685
- /***/ }),
1686
-
1687
- /***/ "./src/migrationPreparator.ts":
1688
- /*!************************************!*\
1689
- !*** ./src/migrationPreparator.ts ***!
1690
- \************************************/
1691
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1692
-
1693
-
1694
- var __importDefault = (this && this.__importDefault) || function (mod) {
1695
- return (mod && mod.__esModule) ? mod : { "default": mod };
1696
- };
1697
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1698
- const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
1699
- const serilizer_1 = __importDefault(__webpack_require__(/*! serilizer */ "./src/serilizer/index.ts"));
1700
- // TODO: export as a function w
1701
- const dry = {
1702
- version: "1",
1703
- tables: {},
1704
- enums: {}
1705
- };
1706
- const prepareMigration = (migrationRootFolderName = 'drizzle', dataFolderPath) => {
1707
- const root = migrationRootFolderName;
1708
- const files = fs_1.default.readdirSync('./');
1709
- const drizzleFolder = files.find((it) => {
1710
- return it === root;
1711
- });
1712
- if (!drizzleFolder) {
1713
- fs_1.default.mkdirSync(root);
1714
- }
1715
- const migrationFolders = fs_1.default.readdirSync(`./${root}`);
1716
- let prevSnapshot;
1717
- if (migrationFolders.length === 0) {
1718
- prevSnapshot = dry;
1719
- }
1720
- else {
1721
- migrationFolders.sort();
1722
- const lastSnapshotFolder = migrationFolders[migrationFolders.length - 1];
1723
- console.log(lastSnapshotFolder);
1724
- prevSnapshot = JSON.parse(fs_1.default.readFileSync(`./${root}/${lastSnapshotFolder}/snapshot.json`).toString());
1725
- }
1726
- const tbls = `${dataFolderPath}/tables/`;
1727
- const tps = `${dataFolderPath}/types/`;
1728
- const result = (0, serilizer_1.default)(tbls, tps);
1729
- return { prev: prevSnapshot, cur: result };
1730
- };
1731
- exports["default"] = prepareMigration;
1732
-
1733
-
1734
- /***/ }),
1735
-
1736
- /***/ "./src/serilizer/factory.ts":
1737
- /*!**********************************!*\
1738
- !*** ./src/serilizer/factory.ts ***!
1739
- \**********************************/
1740
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1741
-
1742
-
1743
- var __importDefault = (this && this.__importDefault) || function (mod) {
1744
- return (mod && mod.__esModule) ? mod : { "default": mod };
1745
- };
1746
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1747
- const typescript_1 = __importDefault(__webpack_require__(/*! typescript */ "typescript"));
1748
- const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
1749
- const printer = typescript_1.default.createPrinter();
1750
- const prepareFabricFile = (tablesFolder, typesFolder) => {
1751
- const staticImports = [
1752
- typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamedImports([
1753
- typescript_1.default.createImportSpecifier(undefined, typescript_1.default.createIdentifier("AbstractTable")),
1754
- typescript_1.default.createImportSpecifier(undefined, typescript_1.default.createIdentifier("DB")),
1755
- ])), typescript_1.default.createStringLiteral("drizzle-orm")),
1756
- typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(typescript_1.default.createIdentifier("Enum"), undefined), typescript_1.default.createStringLiteral("drizzle-orm/types/type")),
1757
- typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamedImports([
1758
- typescript_1.default.createImportSpecifier(undefined, typescript_1.default.createIdentifier("Pool")),
1759
- ])), typescript_1.default.createStringLiteral("pg")),
1760
- typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(typescript_1.default.createIdentifier("Serializer"), undefined), typescript_1.default.createStringLiteral("./serializer")),
1761
- ];
1762
- const dynamicImports = [];
1763
- const tablesFilenames = fs_1.default.readdirSync(tablesFolder);
1764
- for (let i = 0; i < tablesFilenames.length; i++) {
1765
- const filename = tablesFilenames[i];
1766
- const importPath = `${tablesFolder}${filename.split(".")[0]}`;
1767
- dynamicImports.push(typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamespaceImport(typescript_1.default.createIdentifier(`i${i}`))), typescript_1.default.createStringLiteral(importPath)));
1768
- }
1769
- const typesFilenames = fs_1.default.readdirSync(typesFolder);
1770
- for (let i = 0; i < typesFilenames.length; i++) {
1771
- const filename = typesFilenames[i];
1772
- const importPath = `${typesFolder}${filename.split(".")[0]}`;
1773
- dynamicImports.push(typescript_1.default.createImportDeclaration(undefined, undefined, typescript_1.default.createImportClause(undefined, typescript_1.default.createNamespaceImport(typescript_1.default.createIdentifier(`t${i}`))), typescript_1.default.createStringLiteral(importPath)));
1774
- }
1775
- const variablesStatements = [
1776
- typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1777
- typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("db"), undefined, typescript_1.default.createNew(typescript_1.default.createIdentifier("DB"), undefined, [
1778
- typescript_1.default.createNew(typescript_1.default.createIdentifier("Pool"), undefined, []),
1779
- ])),
1780
- ], typescript_1.default.NodeFlags.Const)),
1781
- typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1782
- typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("serializer"), undefined, typescript_1.default.createNew(typescript_1.default.createIdentifier("Serializer"), undefined, [])),
1783
- ], typescript_1.default.NodeFlags.Const)),
1784
- ];
1785
- const blockStatements = [];
1786
- // const tables = []
1787
- blockStatements.push(typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1788
- typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("tables"), undefined, typescript_1.default.createArrayLiteral([], false)),
1789
- ], typescript_1.default.NodeFlags.Const)));
1790
- for (let i = 0; i < tablesFilenames.length; i++) {
1791
- // const t1 = (new i1.default(db) as unknown as AbstractTable<any>);
1792
- // tables.push(t1)
1793
- const blockStatement = [
1794
- typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1795
- typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("table" + i), undefined, typescript_1.default.createParen(typescript_1.default.createAsExpression(typescript_1.default.createAsExpression(typescript_1.default.createNew(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("i" + i), typescript_1.default.createIdentifier("default")), undefined, [typescript_1.default.createIdentifier("db")]), typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword)), typescript_1.default.createTypeReferenceNode(typescript_1.default.createIdentifier("AbstractTable"), [
1796
- typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword),
1797
- ])))),
1798
- ], typescript_1.default.NodeFlags.Const)),
1799
- typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("tables"), typescript_1.default.createIdentifier("push")), undefined, [typescript_1.default.createIdentifier("table" + i)])),
1800
- ];
1801
- blockStatements.push(...blockStatement);
1802
- }
1803
- // const enums = []
1804
- blockStatements.push(typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1805
- typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("enums"), undefined, typescript_1.default.createArrayLiteral([], false)),
1806
- ], typescript_1.default.NodeFlags.Const)));
1807
- // Object.values(t0).forEach((t) => {
1808
- // enums.push(t as Enum<any>);
1809
- // });
1810
- if (typesFilenames.length > 0) {
1811
- blockStatements.push(typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("Object"), typescript_1.default.createIdentifier("values")), undefined, [typescript_1.default.createIdentifier("t0")]), typescript_1.default.createIdentifier("forEach")), undefined, [
1812
- typescript_1.default.createArrowFunction(undefined, undefined, [
1813
- typescript_1.default.createParameter(undefined, undefined, undefined, typescript_1.default.createIdentifier("t"), undefined, undefined, undefined),
1814
- ], undefined, typescript_1.default.createToken(typescript_1.default.SyntaxKind.EqualsGreaterThanToken), typescript_1.default.createBlock([
1815
- typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("enums"), typescript_1.default.createIdentifier("push")), undefined, [
1816
- typescript_1.default.createAsExpression(typescript_1.default.createAsExpression(typescript_1.default.createIdentifier("t"), typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.UnknownKeyword)), typescript_1.default.createTypeReferenceNode(typescript_1.default.createIdentifier("Enum"), [
1817
- typescript_1.default.createKeywordTypeNode(typescript_1.default.SyntaxKind.AnyKeyword),
1818
- ])),
1819
- ])),
1820
- ], true)),
1821
- ])));
1822
- }
1823
- // return serializer.generate(tables, enums)
1824
- blockStatements.push(typescript_1.default.createReturn(typescript_1.default.createCall(typescript_1.default.createPropertyAccess(typescript_1.default.createIdentifier("serializer"), typescript_1.default.createIdentifier("generate")), undefined, [
1825
- typescript_1.default.createIdentifier("tables"),
1826
- typescript_1.default.createIdentifier("enums"),
1827
- ])));
1828
- const funcStatement = [
1829
- typescript_1.default.createVariableStatement(undefined, typescript_1.default.createVariableDeclarationList([
1830
- typescript_1.default.createVariableDeclaration(typescript_1.default.createIdentifier("testFun"), undefined, typescript_1.default.createArrowFunction(undefined, undefined, [], undefined, typescript_1.default.createToken(typescript_1.default.SyntaxKind.EqualsGreaterThanToken),
1831
- // function body
1832
- typescript_1.default.createBlock(blockStatements, true))),
1833
- ], typescript_1.default.NodeFlags.Const)),
1834
- ];
1835
- const invocationStatement = [
1836
- typescript_1.default.createExpressionStatement(typescript_1.default.createCall(typescript_1.default.createIdentifier("testFun"), undefined, [])),
1837
- ];
1838
- const outFile = typescript_1.default.createSourceFile("outfile.ts", "", typescript_1.default.ScriptTarget.ES2015, true, typescript_1.default.ScriptKind.TS);
1839
- const source = [];
1840
- source.push(...staticImports);
1841
- source.push(...dynamicImports);
1842
- source.push(...variablesStatements);
1843
- source.push(...funcStatement);
1844
- source.push(...invocationStatement);
1845
- const newFile = typescript_1.default.factory.updateSourceFile(outFile, source);
1846
- return printer.printFile(newFile);
1847
- };
1848
- exports["default"] = prepareFabricFile;
1849
-
1850
-
1851
- /***/ }),
1852
-
1853
- /***/ "./src/serilizer/index.ts":
1854
- /*!********************************!*\
1855
- !*** ./src/serilizer/index.ts ***!
1856
- \********************************/
1857
- /***/ (function(__unused_webpack_module, exports, __webpack_require__) {
1858
-
1859
-
1860
- var __importDefault = (this && this.__importDefault) || function (mod) {
1861
- return (mod && mod.__esModule) ? mod : { "default": mod };
1862
- };
1863
- Object.defineProperty(exports, "__esModule", ({ value: true }));
1864
- const fs_1 = __importDefault(__webpack_require__(/*! fs */ "fs"));
1865
- const string_decoder_1 = __webpack_require__(/*! string_decoder */ "string_decoder");
1866
- const factory_1 = __importDefault(__webpack_require__(/*! ./factory */ "./src/serilizer/factory.ts"));
1867
- const esbuild = __webpack_require__(/*! esbuild */ "esbuild");
1868
- const serialize = (pathToTables, pathToTypes) => {
1869
- const decoder = new string_decoder_1.StringDecoder();
1870
- // const preparedFarbic = prepareFabricFile("./examples/tables/", './examples/types/')
1871
- const preparedFarbic = (0, factory_1.default)(pathToTables, pathToTypes);
1872
- const ts = preparedFarbic;
1873
- fs_1.default.writeFileSync("__out.ts", ts, "utf-8");
1874
- const result = esbuild.buildSync({
1875
- entryPoints: ["__out.ts"],
1876
- bundle: true,
1877
- platform: "node",
1878
- write: false,
1879
- external: ["pg-native"],
1880
- });
1881
- fs_1.default.rmSync("__out.ts");
1882
- return eval(decoder.write(result.outputFiles[0].contents));
1883
- };
1884
- exports["default"] = serialize;
1885
-
1886
-
1887
- /***/ }),
1888
-
1889
- /***/ "@xstate/react":
1890
- /*!********************************!*\
1891
- !*** external "@xstate/react" ***!
1892
- \********************************/
1893
- /***/ ((module) => {
1894
-
1895
- module.exports = require("@xstate/react");
1896
-
1897
- /***/ }),
1898
-
1899
- /***/ "commander":
1900
- /*!****************************!*\
1901
- !*** external "commander" ***!
1902
- \****************************/
1903
- /***/ ((module) => {
1904
-
1905
- module.exports = require("commander");
1906
-
1907
- /***/ }),
1908
-
1909
- /***/ "esbuild":
1910
- /*!**************************!*\
1911
- !*** external "esbuild" ***!
1912
- \**************************/
1913
- /***/ ((module) => {
1914
-
1915
- module.exports = require("esbuild");
1916
-
1917
- /***/ }),
1918
-
1919
- /***/ "ink":
1920
- /*!**********************!*\
1921
- !*** external "ink" ***!
1922
- \**********************/
1923
- /***/ ((module) => {
1924
-
1925
- module.exports = require("ink");
1926
-
1927
- /***/ }),
1928
-
1929
- /***/ "ink-select-input":
1930
- /*!***********************************!*\
1931
- !*** external "ink-select-input" ***!
1932
- \***********************************/
1933
- /***/ ((module) => {
1934
-
1935
- module.exports = require("ink-select-input");
1936
-
1937
- /***/ }),
1938
-
1939
- /***/ "ink-spinner":
1940
- /*!******************************!*\
1941
- !*** external "ink-spinner" ***!
1942
- \******************************/
1943
- /***/ ((module) => {
1944
-
1945
- module.exports = require("ink-spinner");
1946
-
1947
- /***/ }),
1948
-
1949
- /***/ "ink-table":
1950
- /*!****************************!*\
1951
- !*** external "ink-table" ***!
1952
- \****************************/
1953
- /***/ ((module) => {
1954
-
1955
- module.exports = require("ink-table");
1956
-
1957
- /***/ }),
1958
-
1959
- /***/ "json-diff":
1960
- /*!****************************!*\
1961
- !*** external "json-diff" ***!
1962
- \****************************/
1963
- /***/ ((module) => {
1964
-
1965
- module.exports = require("json-diff");
1966
-
1967
- /***/ }),
1968
-
1969
- /***/ "pretty-error/start":
1970
- /*!*************************************!*\
1971
- !*** external "pretty-error/start" ***!
1972
- \*************************************/
1973
- /***/ ((module) => {
1974
-
1975
- module.exports = require("pretty-error/start");
1976
-
1977
- /***/ }),
1978
-
1979
- /***/ "react":
1980
- /*!************************!*\
1981
- !*** external "react" ***!
1982
- \************************/
1983
- /***/ ((module) => {
1984
-
1985
- module.exports = require("react");
1986
-
1987
- /***/ }),
1988
-
1989
- /***/ "source-map-support/register":
1990
- /*!**********************************************!*\
1991
- !*** external "source-map-support/register" ***!
1992
- \**********************************************/
1993
- /***/ ((module) => {
1994
-
1995
- module.exports = require("source-map-support/register");
1996
-
1997
- /***/ }),
1998
-
1999
- /***/ "string_decoder":
2000
- /*!*********************************!*\
2001
- !*** external "string_decoder" ***!
2002
- \*********************************/
2003
- /***/ ((module) => {
2004
-
2005
- module.exports = require("string_decoder");
2006
-
2007
- /***/ }),
2008
-
2009
- /***/ "typescript":
2010
- /*!*****************************!*\
2011
- !*** external "typescript" ***!
2012
- \*****************************/
2013
- /***/ ((module) => {
2014
-
2015
- module.exports = require("typescript");
2016
-
2017
- /***/ }),
2018
-
2019
- /***/ "valtio":
2020
- /*!*************************!*\
2021
- !*** external "valtio" ***!
2022
- \*************************/
2023
- /***/ ((module) => {
2024
-
2025
- module.exports = require("valtio");
2026
-
2027
- /***/ }),
2028
-
2029
- /***/ "xstate":
2030
- /*!*************************!*\
2031
- !*** external "xstate" ***!
2032
- \*************************/
2033
- /***/ ((module) => {
2034
-
2035
- module.exports = require("xstate");
2036
-
2037
- /***/ }),
2038
-
2039
- /***/ "fs":
2040
- /*!*********************!*\
2041
- !*** external "fs" ***!
2042
- \*********************/
2043
- /***/ ((module) => {
2044
-
2045
- module.exports = require("fs");
2046
-
2047
- /***/ })
2048
-
2049
- /******/ });
2050
- /************************************************************************/
2051
- /******/ // The module cache
2052
- /******/ var __webpack_module_cache__ = {};
2053
- /******/
2054
- /******/ // The require function
2055
- /******/ function __webpack_require__(moduleId) {
2056
- /******/ // Check if module is in cache
2057
- /******/ var cachedModule = __webpack_module_cache__[moduleId];
2058
- /******/ if (cachedModule !== undefined) {
2059
- /******/ return cachedModule.exports;
2060
- /******/ }
2061
- /******/ // Create a new module (and put it into the cache)
2062
- /******/ var module = __webpack_module_cache__[moduleId] = {
2063
- /******/ // no module.id needed
2064
- /******/ // no module.loaded needed
2065
- /******/ exports: {}
2066
- /******/ };
2067
- /******/
2068
- /******/ // Execute the module function
2069
- /******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);
2070
- /******/
2071
- /******/ // Return the exports of the module
2072
- /******/ return module.exports;
2073
- /******/ }
2074
- /******/
2075
- /************************************************************************/
2076
- /******/ /* webpack/runtime/compat get default export */
2077
- /******/ (() => {
2078
- /******/ // getDefaultExport function for compatibility with non-harmony modules
2079
- /******/ __webpack_require__.n = (module) => {
2080
- /******/ var getter = module && module.__esModule ?
2081
- /******/ () => (module['default']) :
2082
- /******/ () => (module);
2083
- /******/ __webpack_require__.d(getter, { a: getter });
2084
- /******/ return getter;
2085
- /******/ };
2086
- /******/ })();
2087
- /******/
2088
- /******/ /* webpack/runtime/define property getters */
2089
- /******/ (() => {
2090
- /******/ // define getter functions for harmony exports
2091
- /******/ __webpack_require__.d = (exports, definition) => {
2092
- /******/ for(var key in definition) {
2093
- /******/ if(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {
2094
- /******/ Object.defineProperty(exports, key, { enumerable: true, get: definition[key] });
2095
- /******/ }
2096
- /******/ }
2097
- /******/ };
2098
- /******/ })();
2099
- /******/
2100
- /******/ /* webpack/runtime/hasOwnProperty shorthand */
2101
- /******/ (() => {
2102
- /******/ __webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))
2103
- /******/ })();
2104
- /******/
2105
- /******/ /* webpack/runtime/make namespace object */
2106
- /******/ (() => {
2107
- /******/ // define __esModule on exports
2108
- /******/ __webpack_require__.r = (exports) => {
2109
- /******/ if(typeof Symbol !== 'undefined' && Symbol.toStringTag) {
2110
- /******/ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2111
- /******/ }
2112
- /******/ Object.defineProperty(exports, '__esModule', { value: true });
2113
- /******/ };
2114
- /******/ })();
2115
- /******/
2116
- /************************************************************************/
2117
- var __webpack_exports__ = {};
2118
- // This entry need to be wrapped in an IIFE because it need to be isolated against other modules in the chunk.
2119
- (() => {
2120
- var exports = __webpack_exports__;
2121
- /*!***************************!*\
2122
- !*** ./src/cli/index.tsx ***!
2123
- \***************************/
2124
-
2125
- Object.defineProperty(exports, "__esModule", ({ value: true }));
2126
- const commander_1 = __webpack_require__(/*! commander */ "commander");
2127
- __webpack_require__(/*! source-map-support/register */ "source-map-support/register");
2128
- __webpack_require__(/*! pretty-error/start */ "pretty-error/start");
2129
- __webpack_require__(/*! ./commands/migration */ "./src/cli/commands/migration/index.tsx");
2130
- commander_1.program.parse();
2131
-
2132
- })();
2133
-
2134
- /******/ })()
2135
- ;
2136
- //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZHJpenpsZS5qcyIsIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUVnQzs7O0FBR3pCO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQSwwQkFBMEI7QUFDMUI7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDQSx1QkFBdUIsK0NBQUk7QUFDM0I7O0FBRUE7QUFDQSxLQUFLOztBQUVMO0FBQ0E7QUFDTztBQUNQLHVCQUF1QiwrQ0FBSTs7QUFFM0I7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLDZCQUE2QjtBQUM3QixpQkFBaUI7QUFDakI7QUFDQSxTQUFTO0FBQ1Q7O0FBRUE7O0FBRUE7QUFDQTtBQUNBO0FBQ0EseUJBQXlCLDZCQUE2QjtBQUN0RDtBQUNBLHFCQUFxQjtBQUNyQixTQUFTO0FBQ1Q7QUFDQTtBQUNBOztBQUVBLHlCQUF5Qiw2QkFBNkI7QUFDdEQ7QUFDQSxxQkFBcUI7QUFDckIsU0FBUztBQUNUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTOztBQUVUOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsbUNBQW1DOztBQUVuQztBQUNBLGlCQUFpQjtBQUNqQixLQUFLO0FBQ0w7QUFDQSxpQkFBaUI7QUFDakIsS0FBSztBQUNMO0FBQ0E7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTOztBQUVULHFFQUFxRTtBQUNyRTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiOztBQUVBLGlFQUFpRTtBQUNqRTtBQUNBO0FBQ0EsaUJBQWlCO0FBQ2pCLEtBQUs7QUFDTCx1Q0FBdUM7QUFDdkM7QUFDQTtBQUNBO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTtBQUNiO0FBQ0EsYUFBYTtBQUNiOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDdElPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQUVPO0FBQ1AsWUFBWSxnQkFBZ0I7QUFDNUI7QUFDQTtBQUNBLHFCQUFxQjtBQUNyQixTQUFTOztBQUVUO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDTztBQUNQO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFTztBQUNQO0FBQ0E7O0FBRUE7QUFDQTtBQUNBOzs7QUFHQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7O0FBRUE7QUFDQSxvQkFBb0IsUUFBUTs7QUFFNUI7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsYUFBYTtBQUNiOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQSxhQUFhO0FBQ2I7O0FBRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLGFBQWE7QUFDYjtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBLEtBQUs7QUFDTDtBQUNPO0FBQ1A7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0EsS0FBSztBQUNMOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzlLeUM7O0FBRXpDO0FBQ0E7QUFDQTtBQUNBOztBQUVBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyw4REFBaUI7QUFDL0I7O0FBRUE7QUFDQSxnQkFBZ0IscUJBQXFCO0FBQ3JDO0FBQ0E7QUFDQSx5QkFBeUI7QUFDekIsYUFBYTs7QUFFYjs7QUFFQSxxQ0FBcUMsV0FBVztBQUNoRDtBQUNBO0FBQ0E7QUFDQTtBQUNBLHVFQUF1RSxvQkFBb0I7QUFDM0YsbUNBQW1DLGFBQWEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCO0FBQzdIO0FBQ0Esd0JBQXdCO0FBQ3hCO0FBQ0E7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxpRUFBb0I7QUFDbEM7O0FBRUE7QUFDQSxnQkFBZ0IsbUJBQW1CO0FBQ25DO0FBQ0EsZ0RBQWdELEdBQUc7QUFDbkQ7O0FBRUEsOEJBQThCLFVBQVUsU0FBUyxpQkFBaUI7QUFDbEU7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyxvRUFBdUI7QUFDckM7O0FBRUE7QUFDQSxnQkFBZ0Isc0JBQXNCO0FBQ3RDLDZCQUE2QixVQUFVLFlBQVksV0FBVztBQUM5RDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLDREQUFlO0FBQzdCOztBQUVBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUIsNkJBQTZCLFVBQVU7QUFDdkM7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyw4REFBaUI7QUFDL0I7O0FBRUE7QUFDQSxnQkFBZ0IsV0FBVztBQUMzQiw4QkFBOEIsTUFBTSxZQUFZLEdBQUc7QUFDbkQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyx1RUFBMEI7QUFDeEM7O0FBRUE7QUFDQSxnQkFBZ0Isd0JBQXdCO0FBQ3hDLDhCQUE4QixXQUFXLHdCQUF3QixZQUFZO0FBQzdFO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsc0VBQXlCO0FBQ3ZDOztBQUVBO0FBQ0EsZ0JBQWdCLG9CQUFvQjtBQUNwQyxnQkFBZ0Isb0NBQW9DOztBQUVwRCxvQ0FBb0MsMkJBQTJCLGFBQWEsT0FBTztBQUNuRixvQ0FBb0MsMkJBQTJCO0FBQy9ELDhCQUE4QixXQUFXLGFBQWEsTUFBTSxFQUFFLEtBQUssRUFBRSxpQkFBaUIsRUFBRSxpQkFBaUIsYUFBYTtBQUN0SDtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLCtFQUFrQztBQUNoRDs7QUFFQTtBQUNBLGdCQUFnQixxQ0FBcUM7QUFDckQsOEJBQThCLFdBQVcsZUFBZSxZQUFZLGdCQUFnQixhQUFhO0FBQ2pHO0FBQ0E7O0FBRUE7QUFDQTtBQUNBLGNBQWMsa0ZBQXFDO0FBQ25EOztBQUVBO0FBQ0EsZ0JBQWdCLHdCQUF3QjtBQUN4Qyw4QkFBOEIsV0FBVyxlQUFlLFlBQVksYUFBYTtBQUNqRjtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLG1GQUFzQztBQUNwRDs7QUFFQTtBQUNBLGdCQUFnQix3QkFBd0I7QUFDeEMsOEJBQThCLFdBQVcsZUFBZSxZQUFZLGNBQWM7QUFDbEY7QUFDQTs7QUFFQTtBQUNBO0FBQ0EsY0FBYyw4REFBaUI7QUFDL0I7O0FBRUE7QUFDQSxnQkFBZ0IsbUNBQW1DO0FBQ25ELCtCQUErQixXQUFXLEtBQUssV0FBVyxHQUFHLFdBQVcsRUFBRTtBQUMxRTtBQUNBOztBQUVBO0FBQ0E7QUFDQSxjQUFjLDREQUFlO0FBQzdCOztBQUVBO0FBQ0EsZ0JBQWdCLFlBQVk7QUFDNUIsdUNBQXVDLFdBQVc7QUFDbEQ7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQTtBQUNBLFNBQVM7QUFDVDs7QUFFQTtBQUNBO0FBQ0E7QUFDQTs7QUFFQTtBQUNBLEtBQUs7QUFDTDs7QUFFTztBQUNQO0FBQ0E7QUFDQSxvQ0FBb0MsV0FBVyx3QkFBd0IsYUFBYTtBQUNwRjtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxnQkFBZ0Isb0NBQW9DOztBQUVwRCxvQ0FBb0MsMEJBQTBCLGFBQWEsT0FBTztBQUNsRixvQ0FBb0MsMEJBQTBCO0FBQzlELG9DQUFvQyxXQUFXLGFBQWEsTUFBTSxFQUFFLE1BQU0sRUFBRSxrQkFBa0IsRUFBRSxpQkFBaUIsYUFBYTtBQUM5SDtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQO0FBQ0E7QUFDQSxnQkFBZ0IsT0FBTzs7QUFFdkI7QUFDQSxvQkFBb0IsUUFBUTtBQUM1Qix3Q0FBd0MsV0FBVyxlQUFlLE1BQU0sZ0JBQWdCLE9BQU87QUFDL0Y7QUFDQTs7QUFFQTtBQUNBLG9CQUFvQixRQUFRO0FBQzVCLHdDQUF3QyxXQUFXLGVBQWUsTUFBTSxjQUFjLE9BQU87QUFDN0Y7QUFDQTs7QUFFQTtBQUNBLHdDQUF3QyxXQUFXLGVBQWUsTUFBTSxjQUFjLDRCQUE0QjtBQUNsSDtBQUNBOztBQUVBO0FBQ0E7QUFDQSx3Q0FBd0MsV0FBVyxlQUFlLE1BQU0sYUFBYTtBQUNyRjtBQUNBOztBQUVBO0FBQ0Esb0JBQW9CLFFBQVE7QUFDNUI7QUFDQSx3Q0FBd0MsV0FBVyxlQUFlLE1BQU0sRUFBRSxlQUFlO0FBQ3pGO0FBQ0E7O0FBRUE7QUFDQSx3Q0FBd0MsV0FBVyxlQUFlLE1BQU0sYUFBYTtBQUNyRjtBQUNBOztBQUVBO0FBQ0Esd0NBQXdDLFdBQVcsZUFBZSxNQUFNLGNBQWM7QUFDdEY7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFFTztBQUNQLFlBQVksZ0JBQWdCO0FBQzVCO0FBQ0E7QUFDQSxxQkFBcUI7QUFDckIsU0FBUzs7QUFFVDs7QUFFQSxpQ0FBaUMsTUFBTTtBQUN2QztBQUNBO0FBQ0E7QUFDQTtBQUNBLG1FQUFtRSxvQkFBb0I7QUFDdkYsK0JBQStCLGFBQWEsRUFBRSxhQUFhLEVBQUUscUJBQXFCLEVBQUUsa0JBQWtCLEVBQUUsaUJBQWlCO0FBQ3pIO0FBQ0Esb0JBQW9CO0FBQ3BCO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsZ0JBQWdCLGdCQUFnQjtBQUNoQyxxQ0FBcUMsTUFBTSxLQUFLLE9BQU8sR0FBRyxtQkFBbUIsRUFBRTtBQUMvRTtBQUNBOztBQUVBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EsZ0JBQWdCLE9BQU87QUFDdkIsNkNBQTZDLE1BQU07QUFDbkQ7QUFDQTtBQUNBO0FBQ0E7O0FBRU87QUFDUDtBQUNBO0FBQ0EscUNBQXFDLFVBQVUsWUFBWSxPQUFPO0FBQ2xFO0FBQ0E7O0FBRU87QUFDUCxZQUFZLE9BQU87QUFDbkIseUJBQXlCLEtBQUs7QUFDOUI7O0FBRU87QUFDUDtBQUNBO0FBQ0EsMkRBQTJELEdBQUc7QUFDOUQ7O0FBRUEscUNBQXFDLE1BQU0sU0FBUyxpQkFBaUI7QUFDckU7QUFDQTs7QUFFQTtBQUNPO0FBQ1A7QUFDQTtBQUNBLG1DQUFtQyxNQUFNLFlBQVksYUFBYTtBQUNsRTtBQUNBO0FBQ0E7QUFDQTs7Ozs7QUFLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTtBQUNBO0FBQ0E7O0FBRUE7QUFDQTs7QUFFQTs7QUFFQTtBQUNBOztBQUVBO0FBQ0E7Ozs7Ozs7Ozs7Ozs7OztBQ3BYQSxzRUFBb0M7QUFFcEMsMEhBQWdDO0FBRWhDLE1BQU0sR0FBRyxHQUFHLG1CQUFPO0tBQ2hCLE9BQU8sQ0FBQyxTQUFTLENBQUM7S0FDbEIsS0FBSyxDQUFDLElBQUksQ0FBQztLQUNYLFdBQVcsQ0FBQyxXQUFXLENBQUM7S0FDeEIsTUFBTSxDQUFDLGlCQUFPLENBQUMsQ0FBQztBQUNuQixHQUFHLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxDQUFDLFdBQVcsQ0FBQyxpQkFBaUIsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxpQkFBTyxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0FDVHBFLDZHQUF5RjtBQUN6RixrRUFBb0I7QUFDcEIsOEZBQTZDO0FBQzdDLDhIQUFtRDtBQUVuRCwwR0FBcVA7QUFDclAsb0dBQW9EO0FBdUJwRCxNQUFNLEdBQUcsR0FBRyxDQUFDLEdBQVcsRUFBRSxFQUFFO0lBQzFCLE9BQU8sR0FBRyxDQUFDLFFBQVEsRUFBRSxDQUFDLFFBQVEsQ0FBQyxDQUFDLEVBQUUsR0FBRyxDQUFDO0FBQ3hDLENBQUM7QUFFRCxNQUFNLE9BQU8sR0FBRyxLQUFLLElBQUksRUFBRTtJQUN6QixNQUFNLFFBQVEsR0FBRyxDQUFDLEVBQVUsRUFBRSxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLFVBQVUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFO1FBQzNGLE1BQU0sSUFBSSxLQUFLLENBQUMseUJBQXlCLENBQUMsQ0FBQztJQUM3QyxDQUFDLENBQUMsQ0FBQztJQUVILE1BQU0sT0FBTyxHQUFHLENBQUMsRUFBVSxFQUFFLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsVUFBVSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRWxGLE1BQU0sbUJBQW1CLEdBQUcsU0FBUyxFQUFDLHdCQUF3QjtJQUM5RCxNQUFNLEVBQUUsSUFBSSxFQUFFLEdBQUcsRUFBRSxHQUFHLE1BQU0seUJBQUksRUFBQyxxQ0FBcUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxRQUFRLEVBQUUsRUFBRSxFQUFFO1FBQzdGLE9BQU8saUNBQWdCLEVBQUMsbUJBQW1CLEVBQUUsV0FBVyxDQUFDO0lBQzNELENBQUMsQ0FBQyxDQUFDO0lBRUgsaUZBQWlGO0lBQ2pGLGlGQUFpRjtJQUVqRixNQUFNLElBQUksR0FBRyxNQUFNLHlCQUFJLEVBQUMsd0JBQXdCLEVBQUUsS0FBSyxFQUFFLEVBQUUsUUFBUSxFQUFFLEVBQUUsRUFBRTtRQUN2RSxPQUFPLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLENBQUMsQ0FBQyxDQUFDO0lBRUgsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSwwQ0FBcUIsRUFBQztRQUNoRSxTQUFTLEVBQUUsSUFBSSxDQUFDLFdBQVc7UUFDM0IsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO0tBQ2xDLENBQUMsQ0FBQztJQUVILE1BQU0sY0FBYyxHQUFVLEVBQUU7SUFFaEMsTUFBTSxnQkFBZ0IsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3hDLE9BQU8sMkNBQXNCLEVBQUMsRUFBRSxDQUFDO0lBQ25DLENBQUMsQ0FBQztJQUVGLE1BQU0saUNBQWlDLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN6RCxPQUFPLDZDQUF3QixFQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQztJQUN0RCxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7SUFFVCxNQUFNLGNBQWMsR0FBRyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3RDLE9BQU8seUNBQW9CLEVBQUMsRUFBRSxDQUFDO0lBQ2pDLENBQUMsQ0FBQztJQUVGLE1BQU0sZ0JBQWdCLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUN4QyxPQUFPLDJDQUFzQixFQUFDLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLEdBQUcsQ0FBQztJQUMvQyxDQUFDLENBQUM7SUFFRiw4Q0FBOEM7SUFDOUMsa0NBQWtDO0lBQ2xDLEtBQUs7SUFDTCxpREFBaUQ7SUFFakQsMkNBQTJDO0lBQzNDLGdDQUFnQztJQUNoQyxLQUFLO0lBQ0wsOENBQThDO0lBRTlDLE1BQU0sdUJBQXVCLEdBQUcsTUFBTSxDQUFDLGNBQWMsQ0FBQyxPQUFPLENBQUM7SUFDOUQsTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLHdCQUF3QixDQUFDLE1BQU0sQ0FBQyx1QkFBdUIsQ0FBQztJQUVoRixNQUFNLGtCQUFrQixHQUFHLEVBQUU7SUFDN0IsS0FBSyxNQUFNLEtBQUssSUFBSSxVQUFVLEVBQUU7UUFDOUIsTUFBTSxNQUFNLEdBQUcsTUFBTSwyQ0FBc0IsRUFBQyxLQUFLLENBQUMsQ0FBQztRQUVuRCxNQUFNLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxHQUFHLEdBQUcsRUFBRSxHQUFHLEtBQUs7UUFFeEMsa0JBQWtCLENBQUMsSUFBSSxDQUFDLEVBQUUsR0FBRyxHQUFHLEVBQUUsR0FBRyxNQUFNLEVBQUUsQ0FBQztLQUMvQztJQUVELDJEQUEyRDtJQUUzRCwyQ0FBMkM7SUFDM0MsOENBQThDO0lBQzlDLEtBQUs7SUFDTCw4Q0FBOEM7SUFFOUMsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ2xELE9BQU8saURBQTRCLEVBQUMsRUFBRSxDQUFDO0lBQ3pDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtJQUVULE1BQU0sb0NBQW9DLEdBQUcsa0JBQWtCLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQ3ZFLE9BQU8sNkNBQXdCLEVBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsWUFBWSxJQUFJLEVBQUUsQ0FBQztJQUNqRSxDQUFDLENBQUMsQ0FBQyxJQUFJLEVBQUU7SUFFVCxNQUFNLGtDQUFrQyxHQUFHLGtCQUFrQixDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsRUFBRTtRQUNyRSxPQUFPLDJDQUFzQixFQUFDLEVBQUUsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLGNBQWMsSUFBSSxFQUFFLENBQUM7SUFDakUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFO0lBRVQsWUFBWTtJQUNaLHdCQUF3QjtJQUN4Qiw2Q0FBNkM7SUFDN0Msa0NBQWtDO0lBQ2xDLHdGQUF3RjtJQUN4Rix5SEFBeUg7SUFDekgseUNBQXlDO0lBQ3pDLDhDQUE4QztJQUM5QyxpREFBaUQ7SUFDakQsS0FBSztJQUVMLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQzNDLE9BQU8sMENBQXFCLEVBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsTUFBTSxDQUFDO0lBQ2xELENBQUMsQ0FBQztJQUVGLHNFQUFzRTtJQUN0RSxNQUFNLDZCQUE2QixHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxFQUFFO1FBQy9ELE9BQU8sK0NBQTBCLEVBQUMsRUFBRSxDQUFDLElBQUksRUFBRSxFQUFFLENBQUMsV0FBVyxDQUFDO0lBQzVELENBQUMsQ0FBQyxDQUFDLElBQUksRUFBRTtJQUVULGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxXQUFXLENBQUM7SUFDbkMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLDZCQUE2QixDQUFDO0lBQ3JELGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxnQkFBZ0IsQ0FBQztJQUN4QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsaUNBQWlDLENBQUM7SUFDekQsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLGNBQWMsQ0FBQztJQUN0QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7SUFDeEMsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLGVBQWUsQ0FBQztJQUN2QyxjQUFjLENBQUMsSUFBSSxDQUFDLEdBQUcsb0NBQW9DLENBQUM7SUFDNUQsY0FBYyxDQUFDLElBQUksQ0FBQyxHQUFHLGtDQUFrQyxDQUFDO0lBRTFELHVEQUF1RDtJQUN2RCw4QkFBOEI7SUFFOUIsTUFBTSxhQUFhLEdBQUcsMkJBQVEsRUFBQyxjQUFjLENBQUM7SUFDOUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBRXJDLCtDQUErQztJQUMvQyxNQUFNLElBQUksR0FBRyxJQUFJLElBQUksRUFBRTtJQUN2Qix3S0FBd0s7SUFDeEssTUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFdBQVcsRUFBRTtJQUNyQyxNQUFNLG1CQUFtQixHQUFHLEtBQUssbUJBQW1CLElBQUksVUFBVSxFQUFFO0lBQ3BFLFlBQUUsQ0FBQyxTQUFTLENBQUMsbUJBQW1CLENBQUM7SUFDakMsWUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLG1CQUFtQixnQkFBZ0IsRUFBRSxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDLENBQUM7SUFDdEYsWUFBRSxDQUFDLGFBQWEsQ0FBQyxHQUFHLG1CQUFtQixnQkFBZ0IsRUFBRSxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0FBRXBGLENBQUMsQ0FBQztBQUVGLHFCQUFlLE9BQU8sQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQ25LdkIsMkVBQTBCO0FBQzFCLDZEQUFxQztBQU1yQyxNQUFNLGNBQWMsR0FBb0IsQ0FBQyxFQUN2QyxjQUFjLEdBQ2YsRUFBRSxFQUFFO0lBQ0gsd0JBQVcsRUFBQyxjQUFjLENBQUMsQ0FBQztJQUU1QixPQUFPLENBQ0wsOERBQ0csY0FBYyxDQUFDLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUMsRUFBRSxHQUFHLFNBQVMsRUFBRSxHQUFHLEVBQUUsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUNoRSxDQUNKLENBQUM7QUFDSixDQUFDLENBQUM7QUFFRixxQkFBZSxjQUFjLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuQjlCLG9EQUE2QjtBQUM3QiwyRUFBMEI7QUFFMUIsc0pBQStEO0FBRS9ELE1BQU0sU0FBUyxHQUFHLENBQUMsY0FBOEMsRUFBRSxFQUFFO0lBQ25FLE1BQU0sTUFBTSxHQUFHLGdCQUFNLEVBQUMsOEJBQUMsd0JBQWMsSUFBQyxjQUFjLEVBQUUsY0FBYyxHQUFJLENBQUMsQ0FBQztJQUUxRSxPQUFPO1FBQ0wsTUFBTTtZQUNKLE1BQU0sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDdEIsTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ2pCLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNmLE1BQU0sQ0FBQyxPQUFPLEVBQUUsQ0FBQztRQUNuQixDQUFDO0tBQ0YsQ0FBQztBQUNKLENBQUMsQ0FBQztBQUVGLHFCQUFlLFNBQVMsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQnpCLDJFQUEwQjtBQUMxQixvREFBZ0M7QUFDaEMsNEdBQTJDO0FBQzNDLG9GQUEwQztBQUMxQywwRUFBMkM7QUFJM0MsK0lBQThEO0FBQzlELHdIQUtvQztBQUNwQyw4SkFBa0c7QUFPbEcsTUFBTSxzQkFBc0IsR0FBb0IsQ0FBQyxFQUMvQyxNQUFNLEVBQ04sZ0JBQWdCLEVBQUUsS0FBSyxHQUN4QixFQUFFLEVBQUU7SUFDSCxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLHNCQUFVLEVBQ2hDLG1DQUEyQixFQUFDLEVBQUUsZ0JBQWdCLEVBQUUsS0FBSyxFQUFFLENBQUMsQ0FDekQsQ0FBQztJQUVGLE1BQU0sRUFDSixTQUFTLEVBQ1QsWUFBWSxFQUNaLGNBQWMsRUFDZCxnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLE9BQU8sRUFDUCxPQUFPLEdBQ1IsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBRXBCLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBa0IsRUFBRSxFQUFFO1FBQzdDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFrQixFQUFFLEVBQUU7UUFDaEQsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQW9CLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxnQkFBb0MsRUFBRSxFQUFFO1FBQ3ZELElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNyQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxDQUNMO2dCQUNFLDhCQUFDLFNBQUcsSUFBQyxPQUFPLEVBQUMsTUFBTSxFQUFDLGFBQWEsRUFBQyxRQUFRO29CQUN4Qyw4QkFBQyxTQUFHLElBQUMsT0FBTyxFQUFDLE1BQU07d0JBQ2pCLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUTs0QkFDekIsOEJBQUMsa0JBQU0sUUFBRSxVQUFVLFNBQVMsb0JBQW9CLENBQVU7NEJBQzFELDhCQUFDLDBCQUFXLElBQ1YsS0FBSyxFQUFFLGNBQWUsQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO29DQUNqRCxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQztvQ0FDZCxLQUFLLEVBQUUsTUFBTSxDQUFDLElBQUk7b0NBQ2xCLEtBQUssRUFBRSxDQUFDO2lDQUNULENBQUMsQ0FBQyxFQUNILFFBQVEsRUFBRSxlQUFlLEdBQ3pCLENBQ0U7d0JBQ0wsQ0FBQyxDQUFDLFlBQVksRUFBRSxNQUFNLElBQUksQ0FDekIsOEJBQUMsU0FBRyxJQUFDLGFBQWEsRUFBQyxRQUFRLEVBQUMsV0FBVyxFQUFFLENBQUM7NEJBQ3hDLDhCQUFDLGtCQUFNLHNCQUFxQjs0QkFDNUIsOEJBQUMsU0FBRyxJQUFDLE9BQU8sRUFBQyxNQUFNLEVBQUMsYUFBYSxFQUFDLFFBQVEsSUFDdkMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEVBQUUsSUFBSSxFQUFFLEVBQUUsQ0FBQyxFQUFFLEVBQUUsQ0FBQyw4QkFBQyxVQUFJLElBQUMsR0FBRyxFQUFFLElBQUksR0FBRyxDQUFDLElBQUcsSUFBSSxDQUFRLENBQUMsQ0FDbEUsQ0FDRixDQUNQLENBQ0csQ0FDRixDQUNMLENBQ0osQ0FBQztTQUNIO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLHFCQUFxQixDQUFDLEVBQUU7WUFDMUMsTUFBTSxXQUFXLEdBQUcsQ0FBQyxZQUFhLENBQUMsTUFBTTtnQkFDdkMsQ0FBQyxDQUFDLDBCQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLHlCQUFNLENBQUMsTUFBTSxDQUFDO2dCQUN4RCxDQUFDLENBQUMsMEJBQU8sQ0FBQztZQUVaLE9BQU8sQ0FDTDtnQkFDRSw4QkFBQyxrQkFBTSxRQUFFLEdBQUcsY0FBZSxDQUFDLGdCQUFnQixDQUFDLEVBQUUsSUFBSSxNQUFNLENBQVU7Z0JBQ25FLDhCQUFDLDBCQUFXLElBQUMsS0FBSyxFQUFFLFdBQVcsRUFBRSxRQUFRLEVBQUUsWUFBWSxHQUFJLENBQzFELENBQ0osQ0FBQztTQUNIO1FBRUQsSUFBSSxPQUFPLENBQUMsT0FBTyxDQUFDLG9CQUFvQixDQUFDLEVBQUU7WUFDekMsT0FBTyxDQUNMO2dCQUNFLDhCQUFDLGtCQUFNLDZDQUE0QztnQkFDbkQsOEJBQUMsVUFBSSx3QkFBcUI7Z0JBQzFCLDhCQUFDLDBCQUFXLElBQUMsS0FBSyxFQUFFLGdDQUFhLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBSSxDQUN2RCxDQUNKLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sQ0FDTDtnQkFDRSw4QkFBQyxrQkFBTSx3QkFBdUI7Z0JBQzlCLDhCQUFDLDBCQUFXLElBQUMsS0FBSyxFQUFFLGdDQUFhLEVBQUUsUUFBUSxFQUFFLE9BQU8sR0FBSSxDQUN2RCxDQUNKLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxlQUFlLENBQUMsRUFBRTtZQUNwQyxPQUFPLENBQ0w7Z0JBQ0UsOEJBQUMsa0JBQU0sUUFBRSxHQUFHLGNBQWUsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksa0JBQWtCLENBQVU7Z0JBQy9FLDhCQUFDLDBCQUFXLElBQ1YsS0FBSyxFQUFFLFlBQWEsQ0FBQyxHQUFHLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxDQUFDO3dCQUM5QyxHQUFHLEVBQUUsTUFBTSxDQUFDLENBQUMsQ0FBQzt3QkFDZCxLQUFLLEVBQUUsS0FBSyxDQUFDLElBQUk7d0JBQ2pCLEtBQUssRUFBRSxDQUFDO3FCQUNULENBQUMsQ0FBQyxFQUNILFFBQVEsRUFBRSxrQkFBa0IsR0FDNUIsQ0FDRCxDQUNKLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUMzQixNQUFNLENBQUMsRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLENBQUM7U0FDdkM7UUFFRCxPQUFPLENBQUMsNkRBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxDQUFDLENBQUMsT0FBTyxDQUFDLE1BQU07V0FDakIsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxNQUFNO1dBQ2hCLENBQUMsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3JCLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLDhCQUFDLGtCQUFNLFFBQUUsR0FBRyxTQUFTLFdBQVcsQ0FBVTtZQUMxQyw4QkFBQyxtQkFBSyxJQUNKLElBQUksRUFBRSxnQ0FBa0IsRUFBQztvQkFDdkI7d0JBQ0UsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtvQkFDRDt3QkFDRSxLQUFLLEVBQUUsU0FBUzt3QkFDaEIsTUFBTSxFQUFFLE9BQU87cUJBQ2hCO29CQUNEO3dCQUNFLEtBQUssRUFBRSxTQUFTO3dCQUNoQixNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0YsQ0FBQyxHQUNGLENBQ0U7UUFDTCxTQUFTLEVBQUUsQ0FDUixDQUNULENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLHFCQUFlLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQzFLdEMsMkVBQTBCO0FBQzFCLG9EQUFnQztBQUNoQyw0R0FBMkM7QUFDM0Msb0ZBQTBDO0FBQzFDLDBFQUEyQztBQUkzQywySkFBMkU7QUFDM0UsK0lBQThEO0FBQzlELHdIQUtvQztBQVdwQyxNQUFNLHFCQUFxQixHQUF5QixDQUFDLEVBQ25ELE1BQU0sRUFDTixTQUFTLEVBQUUsUUFBUSxFQUNuQixhQUFhLEVBQUUsWUFBWSxHQUM1QixFQUFFLEVBQUU7SUFDSCxNQUFNLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxHQUFHLHNCQUFVLEVBQUMsa0NBQTBCLEVBQUM7UUFDNUQsYUFBYSxFQUFFLFlBQVk7UUFDM0IsU0FBUyxFQUFFLFFBQVE7S0FDcEIsQ0FBQyxDQUFDLENBQUM7SUFFSixNQUFNLEVBQ0osZ0JBQWdCLEVBQ2hCLFNBQVMsRUFDVCxhQUFhLEVBQ2IsYUFBYSxFQUNiLGFBQWEsRUFDYixhQUFhLEdBQ2QsR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO0lBRXBCLE1BQU0sZUFBZSxHQUFHLENBQUMsSUFBa0IsRUFBRSxFQUFFO1FBQzdDLElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3ZELENBQUMsQ0FBQztJQUVGLE1BQU0sa0JBQWtCLEdBQUcsQ0FBQyxJQUFrQixFQUFFLEVBQUU7UUFDaEQsSUFBSSxDQUFDLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxJQUFJLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQztJQUMzRCxDQUFDLENBQUM7SUFFRixNQUFNLFlBQVksR0FBRyxDQUFDLE1BQW9CLEVBQUUsRUFBRTtRQUM1QyxJQUFJLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDLENBQUM7SUFDL0IsQ0FBQyxDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQUcsQ0FBQyxnQkFBb0MsRUFBRSxFQUFFO1FBQ3ZELElBQUksQ0FBQyxFQUFFLElBQUksRUFBRSxnQkFBZ0IsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxDQUFDO0lBQ3pDLENBQUMsQ0FBQztJQUVGLE1BQU0sU0FBUyxHQUFHLEdBQUcsRUFBRTtRQUNyQixJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxDQUFDLEVBQUU7WUFDNUIsT0FBTyxDQUNMO2dCQUNFLDhCQUFDLFNBQUcsSUFBQyxPQUFPLEVBQUMsTUFBTSxFQUFDLGFBQWEsRUFBQyxRQUFRO29CQUN4Qyw4QkFBQyxTQUFHLElBQUMsT0FBTyxFQUFDLE1BQU07d0JBQ2pCLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUTs0QkFDekIsOEJBQUMsa0JBQU0sMEJBQXlCOzRCQUNoQyw4QkFBQywwQkFBVyxJQUNWLEtBQUssRUFBRSxhQUFjLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQztvQ0FDL0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7b0NBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO29DQUNqQixLQUFLLEVBQUUsQ0FBQztpQ0FDVCxDQUFDLENBQUMsRUFDSCxRQUFRLEVBQUUsZUFBZSxHQUN6QixDQUNFO3dCQUNMLENBQUMsQ0FBQyxTQUFTLEVBQUUsTUFBTSxJQUFJLENBQ3RCLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFdBQVcsRUFBRSxDQUFDOzRCQUN4Qyw4QkFBQyxrQkFBTSxzQkFBcUI7NEJBQzVCLDhCQUFDLFNBQUcsSUFBQyxPQUFPLEVBQUMsTUFBTSxFQUFDLGFBQWEsRUFBQyxRQUFRLElBQ3ZDLFNBQVMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxFQUFFLElBQUksRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLENBQUMsOEJBQUMsVUFBSSxJQUFDLEdBQUcsRUFBRSxJQUFJLEdBQUcsQ0FBQyxJQUFHLElBQUksQ0FBUSxDQUFDLENBQy9ELENBQ0YsQ0FDUCxDQUNHLENBQ0YsQ0FDTCxDQUNKLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxFQUFFO1lBQzFDLE1BQU0sV0FBVyxHQUFHLENBQUMsU0FBVSxDQUFDLE1BQU07Z0JBQ3BDLENBQUMsQ0FBQywwQkFBTyxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyx5QkFBTSxDQUFDLE1BQU0sQ0FBQztnQkFDeEQsQ0FBQyxDQUFDLDBCQUFPLENBQUM7WUFFWixPQUFPLENBQ0w7Z0JBQ0UsOEJBQUMsa0JBQU0sUUFBRSxHQUFHLGFBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxFQUFFLElBQUksTUFBTSxDQUFVO2dCQUNsRSw4QkFBQywwQkFBVyxJQUFDLEtBQUssRUFBRSxXQUFXLEVBQUUsUUFBUSxFQUFFLFlBQVksR0FBSSxDQUMxRCxDQUNKLENBQUM7U0FDSDtRQUVELElBQUksT0FBTyxDQUFDLE9BQU8sQ0FBQyxvQkFBb0IsQ0FBQyxFQUFFO1lBQ3pDLE9BQU8sQ0FDTDtnQkFDRSw4QkFBQyxrQkFBTSw2Q0FBNEM7Z0JBQ25ELDhCQUFDLFVBQUksd0JBQXFCO2dCQUMxQiw4QkFBQywwQkFBVyxJQUFDLEtBQUssRUFBRSxnQ0FBYSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUksQ0FDdkQsQ0FDSixDQUFDO1NBQ0g7UUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsb0JBQW9CLENBQUMsRUFBRTtZQUN6QyxPQUFPLENBQ0w7Z0JBQ0UsOEJBQUMsa0JBQU0sd0JBQXVCO2dCQUM5Qiw4QkFBQywwQkFBVyxJQUFDLEtBQUssRUFBRSxnQ0FBYSxFQUFFLFFBQVEsRUFBRSxPQUFPLEdBQUksQ0FDdkQsQ0FDSixDQUFDO1NBQ0g7UUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUU7WUFDcEMsT0FBTyxDQUNMO2dCQUNFLDhCQUFDLGtCQUFNLFFBQUUsR0FBRyxhQUFjLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxJQUFJLGtCQUFrQixDQUFVO2dCQUM5RSw4QkFBQywwQkFBVyxJQUNWLEtBQUssRUFBRSxTQUFVLENBQUMsR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQVMsRUFBRSxFQUFFLENBQUMsQ0FBQzt3QkFDM0MsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7d0JBQ2QsS0FBSyxFQUFFLEtBQUssQ0FBQyxJQUFJO3dCQUNqQixLQUFLLEVBQUUsQ0FBQztxQkFDVCxDQUFDLENBQUMsRUFDSCxRQUFRLEVBQUUsa0JBQWtCLEdBQzVCLENBQ0QsQ0FDSixDQUFDO1NBQ0g7UUFFRCxJQUFJLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUU7WUFDM0IsTUFBTSxDQUFDO2dCQUNMLE9BQU8sRUFBRSxhQUFhO2dCQUN0QixPQUFPLEVBQUUsYUFBYTtnQkFDdEIsT0FBTyxFQUFFLGFBQWE7YUFDdkIsQ0FBQyxDQUFDO1NBQ0o7UUFFRCxPQUFPLENBQUMsNkRBQUssQ0FBQyxDQUFDO0lBQ2pCLENBQUMsQ0FBQztJQUVGLE9BQU8sQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07V0FDdkIsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxNQUFNO1dBQ3RCLENBQUMsQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQzNCLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLE1BQU0sRUFBRSxDQUFDO1FBQ25DLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsUUFBUSxFQUFDLFlBQVksRUFBRSxDQUFDO1lBQ3pDLDhCQUFDLGtCQUFNLG1CQUFrQjtZQUN6Qiw4QkFBQyxtQkFBSyxJQUNKLElBQUksRUFBRSxnQ0FBa0IsRUFBQztvQkFDdkI7d0JBQ0UsS0FBSyxFQUFFLFNBQVM7d0JBQ2hCLE1BQU0sRUFBRSxhQUFhO3FCQUN0QjtvQkFDRDt3QkFDRSxLQUFLLEVBQUUsU0FBUzt3QkFDaEIsTUFBTSxFQUFFLGFBQWE7cUJBQ3RCO29CQUNEO3dCQUNFLEtBQUssRUFBRSxTQUFTO3dCQUNoQixNQUFNLEVBQUUsYUFBYTtxQkFDdEI7aUJBQ0YsQ0FBQyxHQUNGLENBQ0U7UUFDTCxTQUFTLEVBQUUsQ0FDUixDQUNULENBQUMsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO0FBQ3BCLENBQUMsQ0FBQztBQUVGLHFCQUFlLHFCQUFxQixDQUFDOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztBQ25MckMsd0VBQW1EO0FBQ25ELG9EQUF5QztBQUN6Qyw2RkFBa0M7QUFHbEMsSUFBSyxTQUlKO0FBSkQsV0FBSyxTQUFTO0lBQ1osdURBQVc7SUFDWCwrQ0FBTztJQUNQLHlDQUFJO0FBQ04sQ0FBQyxFQUpJLFNBQVMsS0FBVCxTQUFTLFFBSWI7QUFhRCxNQUFNLElBQUksR0FBeUIsQ0FBb0IsS0FBZSxFQUFFLEVBQUU7SUFDeEUsTUFBTSxFQUNKLElBQUksRUFDSixNQUFNLEVBQ04sUUFBUSxHQUNULEdBQUcsS0FBSyxDQUFDO0lBQ1YsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxvQkFBUSxFQUFTLFFBQVEsQ0FBQyxDQUFDO0lBQ3JELE1BQU0sQ0FBQyxLQUFLLEVBQUUsUUFBUSxDQUFDLEdBQUcsb0JBQVEsRUFBWSxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUM7SUFDckUsTUFBTSxDQUFDLEtBQUssRUFBRSxRQUFRLENBQUMsR0FBRyxvQkFBUSxFQUFNLElBQUksQ0FBQyxDQUFDO0lBRTlDLHFCQUFTLEVBQUMsR0FBRyxFQUFFO1FBQ2IsQ0FBQyxLQUFLLElBQUksRUFBRTtZQUNWLElBQUk7Z0JBQ0YsTUFBTSxNQUFNLEdBQUcsTUFBTSxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsUUFBUSxFQUFFLENBQUMsQ0FBQztnQkFDbEQsUUFBUSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDNUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ2hCO1lBQUMsT0FBTyxDQUFDLEVBQUU7Z0JBQ1YsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUNaLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDMUI7UUFDSCxDQUFDLENBQUMsRUFBRSxDQUFDO0lBQ1AsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBRVAsT0FBTyxDQUNMLDhCQUFDLFNBQUcsSUFBQyxhQUFhLEVBQUMsS0FBSztRQUN0Qiw4QkFBQyxTQUFHLElBQUMsV0FBVyxFQUFFLENBQUM7WUFDaEIsS0FBSyxLQUFLLFNBQVMsQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQ2pDLDhCQUFDLFVBQUk7O2dCQUVILDhCQUFDLHFCQUFPLElBQUMsSUFBSSxFQUFDLE1BQU0sR0FBRztvQkFFbEIsQ0FDUixDQUFDLENBQUMsQ0FBQyxLQUFLLEtBQUssU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FDaEMsOEJBQUMsVUFBSTs7Z0JBRUgsOEJBQUMsVUFBSSxJQUFDLEtBQUssRUFBQyxPQUFPLGFBQVM7b0JBRXZCLENBQ1IsQ0FBQyxDQUFDLENBQUMsQ0FDRiw4QkFBQyxVQUFJOztnQkFFSCw4QkFBQyxVQUFJLElBQUMsS0FBSyxFQUFDLEtBQUssYUFBUztvQkFFckIsQ0FDUjtZQUVBLEtBQUssS0FBSyxTQUFTLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUMxQiw4QkFBQyxVQUFJO2dCQUNGLEtBQUs7Z0JBQ04sOEJBQUMsYUFBTyxPQUFHO2dCQUNYLDhCQUFDLFVBQUksSUFBQyxLQUFLLEVBQUMsS0FBSyxJQUFFLEtBQU0sQ0FBQyxPQUFPLENBQVEsQ0FDcEMsQ0FDUixDQUFDLENBQUMsQ0FBQyxDQUNGO2dCQUNFLDhCQUFDLFVBQUksUUFBRSxLQUFLLENBQVEsQ0FDbkIsQ0FDSixDQUNHLENBQ0YsQ0FDUCxDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYscUJBQWUsSUFBSSxDQUFDOzs7Ozs7Ozs7Ozs7Ozs7OztBQ3BGcEIsMkVBQTBCO0FBQzFCLDZEQUErQjtBQU8vQiw4SUFBeUU7QUFDekUsdUlBQXFEO0FBRXJELGlNQUFxSDtBQUNySCxvTUFBMEY7QUFFMUYsTUFBTSxjQUFjLEdBQUcsa0JBQUssRUFBaUMsRUFBRSxDQUFDLENBQUM7QUFDakUsSUFBSSxHQUFpQyxDQUFDO0FBT3RDLE1BQU0sVUFBVSxHQUFHLEdBQUcsRUFBRTtJQUN0QixJQUFJLENBQUMsR0FBRyxFQUFFO1FBQ1IsR0FBRyxHQUFHLHVCQUFTLEVBQUMsY0FBYyxDQUFDLENBQUM7UUFDaEMsY0FBYyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUM7S0FDM0I7QUFDSCxDQUFDLENBQUM7QUFFSyxNQUFNLElBQUksR0FBRyxDQUNsQixRQUFnQixFQUNoQixJQUFpQyxFQUNqQyxFQUFFLENBQUMsSUFBSSxPQUFPLENBQUksQ0FDaEIsT0FBTyxFQUNQLEVBQUU7SUFDRixVQUFVLEVBQUUsQ0FBQztJQUViLGNBQWMsQ0FBQyxJQUFJLENBQ2pCLDhCQUFDLGNBQUksSUFDSCxRQUFRLEVBQUUsUUFBUSxFQUNsQixJQUFJLEVBQUUsSUFBSSxFQUNWLE1BQU0sRUFBRSxDQUFDLEdBQU0sRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxHQUNoQyxDQUNILENBQUM7QUFDSixDQUFDLENBQUMsQ0FBQztBQWZRLFlBQUksUUFlWjtBQUVFLE1BQU0scUJBQXFCLEdBQUcsQ0FDbkMsRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUE4QixFQUN4RCxFQUFFLENBQUMsSUFBSSxPQUFPLENBQXNCLENBQ3BDLE9BQU8sRUFDUCxFQUFFO0lBQ0YsVUFBVSxFQUFFLENBQUM7SUFFYixjQUFjLENBQUMsSUFBSSxDQUNqQiw4QkFBQywrQkFBcUIsSUFDcEIsTUFBTSxFQUFFLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxPQUFPLENBQUMsR0FBRyxDQUFDLEVBQzdCLGFBQWEsRUFBRSxhQUFhLEVBQzVCLFNBQVMsRUFBRSxTQUFTLEdBQ3BCLENBQ0gsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBZFUsNkJBQXFCLHlCQWMvQjtBQUVJLE1BQU0sc0JBQXNCLEdBQUcsQ0FDcEMsZ0JBQWlDLEVBQ2pDLEVBQUUsQ0FBQyxJQUFJLE9BQU8sQ0FBMkIsQ0FDekMsT0FBTyxFQUNQLEVBQUU7SUFDRixVQUFVLEVBQUUsQ0FBQztJQUViLGNBQWMsQ0FBQyxJQUFJLENBQ2pCLDhCQUFDLGdDQUFzQixJQUNyQixNQUFNLEVBQUUsQ0FBQyxHQUFHLEVBQUUsRUFBRSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsRUFDN0IsZ0JBQWdCLEVBQUUsZ0JBQWdCLEdBQ2xDLENBQ0gsQ0FBQztBQUNKLENBQUMsQ0FBQyxDQUFDO0FBYlUsOEJBQXNCLDBCQWFoQzs7Ozs7Ozs7Ozs7OztBQzNFSCw2REFBcUQ7QUFpQ3JELE1BQU0sMkJBQTJCLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLENBQ3BELDBCQUFhLEVBQWlCO0lBQzVCLEVBQUUsRUFBRSxnQkFBZ0I7SUFDcEIsT0FBTyxFQUFFLE9BQU87SUFDaEIsT0FBTyxFQUFFO1FBQ1AsU0FBUyxFQUFFLEtBQUssQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJO1FBQ3RDLFlBQVksRUFBRSxLQUFLLENBQUMsZ0JBQWdCLENBQUMsS0FBSztRQUMxQyxjQUFjLEVBQUUsS0FBSyxDQUFDLGdCQUFnQixDQUFDLE9BQU87UUFDOUMsZ0JBQWdCLEVBQUUsQ0FBQztRQUNuQixZQUFZLEVBQUUsQ0FBQztRQUNmLE9BQU8sRUFBRSxFQUFFO1FBQ1gsT0FBTyxFQUFFLEVBQUU7UUFDWCxPQUFPLEVBQUUsRUFBRTtLQUNaO0lBQ0QsTUFBTSxFQUFFO1FBQ04sS0FBSyxFQUFFO1lBQ0wsS0FBSyxFQUFFLGlCQUFJLEVBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLENBQUM7WUFDN0IsRUFBRSxFQUFFO2dCQUNGLElBQUksRUFBRTtvQkFDSjt3QkFDRSxNQUFNLEVBQUUsTUFBTTt3QkFDZCxJQUFJLEVBQUUsMEJBQTBCO3dCQUNoQyxPQUFPLEVBQUUsQ0FBQyxrQkFBa0IsQ0FBQztxQkFDOUI7b0JBQ0Q7d0JBQ0UsTUFBTSxFQUFFLE1BQU07d0JBQ2QsSUFBSSxFQUFFLHNCQUFzQjt3QkFDNUIsT0FBTyxFQUFFLENBQUMsZ0JBQWdCLENBQUM7cUJBQzVCO2lCQUNGO2dCQUNELFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUUsT0FBTyxFQUFFLENBQUMsV0FBVyxDQUFDLEVBQUU7YUFDMUQ7U0FDRjtRQUNELE1BQU0sRUFBRTtZQUNOLE9BQU8sRUFBRSxjQUFjO1lBQ3ZCLE1BQU0sRUFBRTtnQkFDTixZQUFZLEVBQUU7b0JBQ1osRUFBRSxFQUFFLEVBQUUsTUFBTSxFQUFFLG9DQUFvQyxFQUFFLE1BQU0sRUFBRSxRQUFRLEVBQUU7aUJBQ3ZFO2dCQUNELE1BQU0sRUFBRTtvQkFDTixFQUFFLEVBQUU7d0JBQ0YsZUFBZSxFQUFFLEVBQUUsTUFBTSxFQUFFLG9DQUFvQyxFQUFFLE9BQU8sRUFBRSxDQUFDLGNBQWMsQ0FBQyxFQUFFO3FCQUM3RjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxrQkFBa0IsRUFBRTtZQUNsQixFQUFFLEVBQUU7Z0JBQ0YsTUFBTSxFQUFFLHFCQUFxQjtnQkFDN0IsT0FBTyxFQUFFO29CQUNQLEVBQUUsTUFBTSxFQUFFLE9BQU8sRUFBRSxPQUFPLEVBQUUsQ0FBQyxRQUFRLENBQUMsRUFBRTtpQkFDekM7YUFDRjtTQUNGO1FBQ0Qsa0JBQWtCLEVBQUU7WUFDbEIsRUFBRSxFQUFFO2dCQUNGLE1BQU0sRUFBRSxxQkFBcUI7Z0JBQzdCLE9BQU8sRUFBRTtvQkFDUCxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7aUJBQ3pDO2FBQ0Y7U0FDRjtRQUNELEtBQUssRUFBRTtZQUNMLEtBQUssRUFBRSxpQkFBSSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzdCLEVBQUUsRUFBRTtnQkFDRixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsTUFBTSxFQUFFLE1BQU07d0JBQ2QsSUFBSSxFQUFFLDBCQUEwQjt3QkFDaEMsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7cUJBQzlCO29CQUNEO3dCQUNFLE1BQU0sRUFBRSxPQUFPO3FCQUNoQjtpQkFDRjthQUNGO1NBQ0Y7UUFDRCxJQUFJLEVBQUUsRUFBRTtLQUNUO0NBQ0YsRUFDRDtJQUNFLE1BQU0sRUFBRTtRQUNOLHdCQUF3QixFQUFFLENBQUMsRUFBRSxjQUFjLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQyxjQUFjLENBQUMsTUFBTTtRQUN4RSxvQkFBb0IsRUFBRSxDQUFDLEVBQUUsWUFBWSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsWUFBWSxDQUFDLE1BQU07S0FDakU7SUFDRCxPQUFPLEVBQUU7UUFDUCxTQUFTLEVBQUUsbUJBQU0sRUFBQztZQUNoQixnQkFBZ0IsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztTQUMzRixDQUFDO1FBRUYsWUFBWSxFQUFFLG1CQUFNLEVBQUM7WUFDbkIsWUFBWSxFQUFFLENBQUMsT0FBTyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsSUFBSSxLQUFLLGlCQUFpQixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0YsQ0FBQztRQUVGLE1BQU0sRUFBRSxtQkFBTSxFQUFDO1lBQ2IsT0FBTyxFQUFFLENBQUMsRUFDUixnQkFBZ0IsRUFDaEIsT0FBTyxFQUNQLGNBQWMsR0FDZixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLGNBQWMsQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDO1lBQ3BELGNBQWMsRUFBRSxDQUFDLEVBQ2YsZ0JBQWdCLEVBQ2hCLGNBQWMsR0FDZixFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDO1NBQ3RFLENBQUM7UUFFRixNQUFNLEVBQUUsbUJBQU0sRUFBQztZQUNiLE9BQU8sRUFBRSxDQUFDLEVBQ1IsZ0JBQWdCLEVBQ2hCLFlBQVksRUFDWixPQUFPLEVBQ1AsWUFBWSxFQUNaLGNBQWMsR0FDZixFQUFFLEVBQUUsQ0FBQztnQkFDSixHQUFHLE9BQU87Z0JBQ1YsRUFBRSxHQUFHLEVBQUUsY0FBYyxDQUFDLGdCQUFnQixDQUFDLEVBQUUsR0FBRyxFQUFFLFlBQVksQ0FBQyxZQUFZLENBQUMsRUFBRTthQUMzRTtZQUNELGNBQWMsRUFBRSxDQUFDLEVBQ2YsZ0JBQWdCLEVBQ2hCLGNBQWMsR0FDZixFQUFFLEVBQUUsQ0FBQyxjQUFjLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLGdCQUFnQixDQUFDO1lBQ3JFLFlBQVksRUFBRSxDQUFDLEVBQ2IsWUFBWSxFQUNaLFlBQVksR0FDYixFQUFFLEVBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUMsS0FBSyxLQUFLLFlBQVksQ0FBQztTQUNoRSxDQUFDO1FBRUYsZ0JBQWdCLEVBQUUsbUJBQU0sRUFBQztZQUN2QixPQUFPLEVBQUUsQ0FBQyxFQUNSLFlBQVksRUFDWixPQUFPLEdBQ1IsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLE9BQU8sRUFBRSxHQUFHLFlBQVksQ0FBQztZQUNuQyxZQUFZLEVBQUUsQ0FBQyxPQUFPLEVBQUUsRUFBRSxDQUFDLEVBQUU7U0FDOUIsQ0FBQztRQUVGLGNBQWMsRUFBRSxtQkFBTSxFQUFDO1lBQ3JCLE9BQU8sRUFBRSxDQUFDLEVBQ1IsY0FBYyxFQUNkLE9BQU8sR0FDUixFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsT0FBTyxFQUFFLEdBQUcsY0FBYyxDQUFDO1lBQ3JDLGNBQWMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRTtTQUNoQyxDQUFDO0tBQ0g7Q0FDRixDQUFDLENBQUMsQ0FBQztBQUVOLHFCQUFlLDJCQUEyQixDQUFDOzs7Ozs7Ozs7Ozs7O0FDbEwzQyw2REFBcUQ7QUF5QnJELE1BQU0sMEJBQTBCLEdBQUcsQ0FBQyxLQUFZLEVBQUUsRUFBRSxDQUFDLENBQ25ELDBCQUFhLEVBQWlCO0lBQzVCLEVBQUUsRUFBRSxlQUFlO0lBQ25CLE9BQU8sRUFBRSxPQUFPO0lBQ2hCLE9BQU8sRUFBRTtRQUNQLEdBQUcsS0FBSztRQUNSLGdCQUFnQixFQUFFLENBQUM7UUFDbkIsWUFBWSxFQUFFLENBQUM7UUFDZixhQUFhLEVBQUUsRUFBRTtRQUNqQixhQUFhLEVBQUUsRUFBRTtRQUNqQixhQUFhLEVBQUUsRUFBRTtLQUNsQjtJQUNELE1BQU0sRUFBRTtRQUNOLEtBQUssRUFBRTtZQUNMLEtBQUssRUFBRSxpQkFBSSxFQUFDLEVBQUUsSUFBSSxFQUFFLE1BQU0sRUFBRSxDQUFDO1lBQzdCLEVBQUUsRUFBRTtnQkFDRixJQUFJLEVBQUU7b0JBQ0o7d0JBQ0UsTUFBTSxFQUFFLE1BQU07d0JBQ2QsSUFBSSxFQUFFLHlCQUF5Qjt3QkFDL0IsT0FBTyxFQUFFLENBQUMsa0JBQWtCLENBQUM7cUJBQzlCO29CQUNEO3dCQUNFLE1BQU0sRUFBRSxNQUFNO3dCQUNkLElBQUksRUFBRSxxQkFBcUI7d0JBQzNCLE9BQU8sRUFBRSxDQUFDLGdCQUFnQixDQUFDO3FCQUM1QjtpQkFDRjtnQkFDRCxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFLE9BQU8sRUFBRSxDQUFDLFdBQVcsQ0FBQyxFQUFFO2FBQzFEO1NBQ0Y7UUFDRCxNQUFNLEVBQUU7WUFDTixPQUFPLEVBQUUsY0FBYztZQUN2QixNQUFNLEVBQUU7Z0JBQ04sWUFBWSxFQUFFO29CQUNaLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxtQ0FBbUMsRUFBRSxNQUFNLEVBQUUsUUFBUSxFQUFFO2lCQUN0RTtnQkFDRCxNQUFNLEVBQUU7b0JBQ04sRUFBRSxFQUFFO3dCQUNGLGVBQWUsRUFBRSxFQUFFLE1BQU0sRUFBRSxtQ0FBbUMsRUFBRSxPQUFPLEVBQUUsQ0FBQyxjQUFjLENBQUMsRUFBRTtxQkFDNUY7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0Qsa0JBQWtCLEVBQUU7WUFDbEIsRUFBRSxFQUFFO2dCQUNGLE1BQU0sRUFBRSxxQkFBcUI7Z0JBQzdCLE9BQU8sRUFBRTtvQkFDUCxFQUFFLE1BQU0sRUFBRSxPQUFPLEVBQUUsT0FBTyxFQUFFLENBQUMsUUFBUSxDQUFDLEVBQUU7aUJBQ3pDO2FBQ0Y7U0FDRjtRQUNELGtCQUFrQixFQUFFO1lBQ2xCLEVBQUUsRUFBRTtnQkFDRixNQUFNLEVBQUUscUJBQXFCO2dCQUM3QixPQUFPLEVBQUU7b0JBQ1AsRUFBRSxNQUFNLEVBQUUsT0FBTyxFQUFFLE9BQU8sRUFBRSxDQUFDLFFBQVEsQ0FBQyxFQUFFO2lCQUN6QzthQUNGO1NBQ0Y7UUFDRCxLQUFLLEVBQUU7WUFDTCxLQUFLLEVBQUUsaUJBQUksRUFBQyxFQUFFLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztZQUM3QixFQUFFLEVBQUU7Z0JBQ0YsSUFBSSxFQUFFO29CQUNKO3dCQUNFLE1BQU0sRUFBRSxNQUFNO3dCQUNkLElBQUksRUFBRSx5QkFBeUI7d0JBQy9CLE9BQU8sRUFBRSxDQUFDLGtCQUFrQixDQUFDO3FCQUM5QjtvQkFDRDt3QkFDRSxNQUFNLEVBQUUsT0FBTztxQkFDaEI7aUJBQ0Y7YUFDRjtTQUNGO1FBQ0QsSUFBSSxFQUFFLEVBQUU7S0FDVDtDQUNGLEVBQ0Q7SUFDRSxNQUFNLEVBQUU7UUFDTix1QkFBdUIsRUFBRSxDQUFDLEVBQUUsYUFBYSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUMsYUFBYSxDQUFDLE1BQU07UUFDckUsbUJBQW1CLEVBQUUsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxNQUFNO0tBQzFEO0lBQ0QsT0FBTyxFQUFFO1FBQ1AsU0FBUyxFQUFFLG1CQUFNLEVBQUM7WUFDaEIsZ0JBQWdCLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDM0YsQ0FBQztRQUVGLFlBQVksRUFBRSxtQkFBTSxFQUFDO1lBQ25CLFlBQVksRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksS0FBSyxpQkFBaUIsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO1NBQzNGLENBQUM7UUFFRixNQUFNLEVBQUUsbUJBQU0sRUFBQztZQUNiLGFBQWEsRUFBRSxDQUFDLEVBQ2QsZ0JBQWdCLEVBQ2hCLGFBQWEsRUFDYixhQUFhLEdBQ2QsRUFBRSxFQUFFLENBQUMsQ0FBQyxHQUFHLGFBQWEsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztZQUN6RCxhQUFhLEVBQUUsQ0FBQyxFQUNkLGdCQUFnQixFQUNoQixhQUFhLEdBQ2QsRUFBRSxFQUFFLENBQUMsYUFBYSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLEVBQUUsRUFBRSxDQUFDLEtBQUssS0FBSyxnQkFBZ0IsQ0FBQztTQUNyRSxDQUFDO1FBRUYsTUFBTSxFQUFFLG1CQUFNLEVBQUM7WUFDYixhQUFhLEVBQUUsQ0FBQyxFQUNkLGdCQUFnQixFQUNoQixZQUFZLEVBQ1osYUFBYSxFQUNiLFNBQVMsRUFDVCxhQUFhLEdBQ2QsRUFBRSxFQUFFLENBQUM7Z0JBQ0osR0FBRyxhQUFhO2dCQUNoQixFQUFFLEdBQUcsRUFBRSxhQUFhLENBQUMsZ0JBQWdCLENBQUMsRUFBRSxHQUFHLEVBQUUsU0FBUyxDQUFDLFlBQVksQ0FBQyxFQUFFO2FBQ3ZFO1lBQ0QsYUFBYSxFQUFFLENBQUMsRUFDZCxnQkFBZ0IsRUFDaEIsYUFBYSxHQUNkLEVBQUUsRUFBRSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssZ0JBQWdCLENBQUM7WUFDcEUsU0FBUyxFQUFFLENBQUMsRUFDVixZQUFZLEVBQ1osU0FBUyxHQUNWLEVBQUUsRUFBRSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssWUFBWSxDQUFDO1NBQzdELENBQUM7UUFFRixnQkFBZ0IsRUFBRSxtQkFBTSxFQUFDO1lBQ3ZCLGFBQWEsRUFBRSxDQUFDLEVBQ2QsU0FBUyxFQUNULGFBQWEsR0FDZCxFQUFFLEVBQUUsQ0FBQyxDQUFDLEdBQUcsYUFBYSxFQUFFLEdBQUcsU0FBUyxDQUFDO1lBQ3RDLFNBQVMsRUFBRSxDQUFDLE9BQU8sRUFBRSxFQUFFLENBQUMsRUFBRTtTQUMzQixDQUFDO1FBRUYsY0FBYyxFQUFFLG1CQUFNLEVBQUM7WUFDckIsYUFBYSxFQUFFLENBQUMsRUFDZCxhQUFhLEVBQ2IsYUFBYSxHQUNkLEVBQUUsRUFBRSxDQUFDLENBQUMsR0FBRyxhQUFhLEVBQUUsR0FBRyxhQUFhLENBQUM7WUFDMUMsYUFBYSxFQUFFLENBQUMsT0FBTyxFQUFFLEVBQUUsQ0FBQyxFQUFFO1NBQy9CLENBQUM7S0FDSDtDQUNGLENBQUMsQ0FBQyxDQUFDO0FBRU4scUJBQWUsMEJBQTBCLENBQUM7Ozs7Ozs7Ozs7Ozs7QUNsSzFDLHFCQUFlLENBQ2IsSUFHRyxFQUNXLEVBQUU7SUFDaEIsTUFBTSxLQUFLLEdBQWlCLEVBQUUsQ0FBQztJQUUvQixLQUFLLENBQUMsTUFBTSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxHQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsRUFBRSxFQUFFO1FBQ3JELElBQUksR0FBRyxHQUFHLE1BQU0sQ0FBQyxNQUFNLEVBQUU7WUFDdkIsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDO1NBQ3RCO1FBQ0QsT0FBTyxHQUFHLENBQUM7SUFDYixDQUFDLEVBQ0QsQ0FBQyxDQUFDLENBQUM7SUFFSCxLQUFLLENBQUMsSUFBSSxDQUFDLEVBQUUsRUFBRSxFQUFFLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFFdkIsT0FBTyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQ3hCLE1BQU0sSUFBSSxHQUFHLEVBQWdCLENBQUM7UUFFOUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQVMsRUFBRSxHQUFXLEVBQUUsRUFBRTtZQUN0QyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUk7Z0JBQy9DLENBQUMsQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsR0FBRyxFQUFFLElBQUksT0FBTyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLEdBQUcsRUFBRSxJQUFJLEVBQUU7Z0JBQ2hFLENBQUMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxFQUFFLElBQUksSUFBSSxFQUFFLENBQUM7UUFDakMsQ0FBQyxDQUFDLENBQUM7UUFFSCxPQUFPLElBQWtCLENBQUM7SUFDNUIsQ0FBQyxDQUFDLENBQUM7QUFDTCxDQUFDLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FDbkNGLElBQVksTUFHWDtBQUhELFdBQVksTUFBTTtJQUNoQiwyQkFBaUI7SUFDakIsMkJBQWlCO0FBQ25CLENBQUMsRUFIVyxNQUFNLEdBQU4sY0FBTSxLQUFOLGNBQU0sUUFHakI7QUFFRCxJQUFZLFlBR1g7QUFIRCxXQUFZLFlBQVk7SUFDdEIsaUNBQWlCO0lBQ2pCLG1DQUFtQjtBQUNyQixDQUFDLEVBSFcsWUFBWSxHQUFaLG9CQUFZLEtBQVosb0JBQVksUUFHdkI7QUFFWSxlQUFPLEdBQUc7SUFDckI7UUFDRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDbEIsS0FBSyxFQUFFLFNBQVM7UUFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNO0tBQ3JCO0lBQ0Q7UUFDRSxHQUFHLEVBQUUsTUFBTSxDQUFDLE1BQU07UUFDbEIsS0FBSyxFQUFFLFNBQVM7UUFDaEIsS0FBSyxFQUFFLE1BQU0sQ0FBQyxNQUFNO0tBQ3JCO0NBQ0YsQ0FBQztBQUVXLHFCQUFhLEdBQUc7SUFDM0I7UUFDRSxHQUFHLEVBQUUsWUFBWSxDQUFDLE9BQU87UUFDekIsS0FBSyxFQUFFLEtBQUs7UUFDWixLQUFLLEVBQUUsWUFBWSxDQUFDLE9BQU87S0FDNUI7SUFDRDtRQUNFLEdBQUcsRUFBRSxZQUFZLENBQUMsTUFBTTtRQUN4QixLQUFLLEVBQUUsSUFBSTtRQUNYLEtBQUssRUFBRSxZQUFZLENBQUMsTUFBTTtLQUMzQjtDQUNGLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNsQ0Ysa0VBQW1CO0FBQ25CLHNHQUFpQztBQUVqQywrQkFBK0I7QUFFL0IsTUFBTSxHQUFHLEdBQUc7SUFDUixPQUFPLEVBQUUsR0FBRztJQUNaLE1BQU0sRUFBRSxFQUFFO0lBQ1YsS0FBSyxFQUFFLEVBQUU7Q0FDWjtBQUVELE1BQU0sZ0JBQWdCLEdBQUcsQ0FDckIsMEJBQWtDLFNBQVMsRUFDM0MsY0FBc0IsRUFDQyxFQUFFO0lBQ3pCLE1BQU0sSUFBSSxHQUFHLHVCQUF1QjtJQUNwQyxNQUFNLEtBQUssR0FBRyxZQUFFLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztJQUNsQyxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUFFLEVBQUU7UUFDcEMsT0FBTyxFQUFFLEtBQUssSUFBSTtJQUN0QixDQUFDLENBQUM7SUFFRixJQUFJLENBQUMsYUFBYSxFQUFFO1FBQ2hCLFlBQUUsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDO0tBQ3JCO0lBRUQsTUFBTSxnQkFBZ0IsR0FBRyxZQUFFLENBQUMsV0FBVyxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7SUFFcEQsSUFBSSxZQUFZLENBQUM7SUFFakIsSUFBSSxnQkFBZ0IsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO1FBQy9CLFlBQVksR0FBRyxHQUFHO0tBQ3JCO1NBQU07UUFDSCxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUU7UUFDdkIsTUFBTSxrQkFBa0IsR0FBRyxnQkFBZ0IsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDO1FBQ3hFLE9BQU8sQ0FBQyxHQUFHLENBQUMsa0JBQWtCLENBQUM7UUFDL0IsWUFBWSxHQUFHLElBQUksQ0FBQyxLQUFLLENBQUMsWUFBRSxDQUFDLFlBQVksQ0FBQyxLQUFLLElBQUksSUFBSSxrQkFBa0IsZ0JBQWdCLENBQUMsQ0FBQyxRQUFRLEVBQUUsQ0FBQztLQUN6RztJQUVELE1BQU0sSUFBSSxHQUFHLEdBQUcsY0FBYyxVQUFVO0lBQ3hDLE1BQU0sR0FBRyxHQUFHLEdBQUcsY0FBYyxTQUFTO0lBRXRDLE1BQU0sTUFBTSxHQUFHLHVCQUFTLEVBQUMsSUFBSSxFQUFFLEdBQUcsQ0FBQztJQUVuQyxPQUFPLEVBQUUsSUFBSSxFQUFFLFlBQVksRUFBRSxHQUFHLEVBQUUsTUFBTSxFQUFFO0FBQzlDLENBQUM7QUFFRCxxQkFBZSxnQkFBZ0IsQ0FBQzs7Ozs7Ozs7Ozs7Ozs7OztBQzlDaEMsMEZBQTRCO0FBQzVCLGtFQUFvQjtBQUNwQixNQUFNLE9BQU8sR0FBZSxvQkFBRSxDQUFDLGFBQWEsRUFBRSxDQUFDO0FBRS9DLE1BQU0saUJBQWlCLEdBQUcsQ0FBQyxZQUFvQixFQUFFLFdBQW1CLEVBQUUsRUFBRTtJQUN0RSxNQUFNLGFBQWEsR0FBRztRQUNwQixvQkFBRSxDQUFDLHVCQUF1QixDQUN4QixTQUFTLEVBQ1QsU0FBUyxFQUNULG9CQUFFLENBQUMsa0JBQWtCLENBQ25CLFNBQVMsRUFDVCxvQkFBRSxDQUFDLGtCQUFrQixDQUFDO1lBQ3BCLG9CQUFFLENBQUMscUJBQXFCLENBQ3RCLFNBQVMsRUFDVCxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLGVBQWUsQ0FBQyxDQUNyQztZQUNELG9CQUFFLENBQUMscUJBQXFCLENBQUMsU0FBUyxFQUFFLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLENBQUM7U0FDL0QsQ0FBQyxDQUNILEVBQ0Qsb0JBQUUsQ0FBQyxtQkFBbUIsQ0FBQyxhQUFhLENBQUMsQ0FDdEM7UUFDRCxvQkFBRSxDQUFDLHVCQUF1QixDQUN4QixTQUFTLEVBQ1QsU0FBUyxFQUNULG9CQUFFLENBQUMsa0JBQWtCLENBQUMsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsRUFBRSxTQUFTLENBQUMsRUFDN0Qsb0JBQUUsQ0FBQyxtQkFBbUIsQ0FBQyx3QkFBd0IsQ0FBQyxDQUNqRDtRQUNELG9CQUFFLENBQUMsdUJBQXVCLENBQ3hCLFNBQVMsRUFDVCxTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxrQkFBa0IsQ0FDbkIsU0FBUyxFQUNULG9CQUFFLENBQUMsa0JBQWtCLENBQUM7WUFDcEIsb0JBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxTQUFTLEVBQUUsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FBQztTQUNqRSxDQUFDLENBQ0gsRUFDRCxvQkFBRSxDQUFDLG1CQUFtQixDQUFDLElBQUksQ0FBQyxDQUM3QjtRQUNELG9CQUFFLENBQUMsdUJBQXVCLENBQ3hCLFNBQVMsRUFDVCxTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxrQkFBa0IsQ0FBQyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsQ0FBQyxFQUNuRSxvQkFBRSxDQUFDLG1CQUFtQixDQUFDLGNBQWMsQ0FBQyxDQUN2QztLQUNGLENBQUM7SUFFRixNQUFNLGNBQWMsR0FBRyxFQUFFLENBQUM7SUFDMUIsTUFBTSxlQUFlLEdBQUcsWUFBRSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztJQUNyRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsZUFBZSxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUMvQyxNQUFNLFFBQVEsR0FBRyxlQUFlLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDcEMsTUFBTSxVQUFVLEdBQUcsR0FBRyxZQUFZLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzlELGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQUUsQ0FBQyx1QkFBdUIsQ0FDNUMsU0FBUyxFQUNULFNBQVMsRUFDVCxvQkFBRSxDQUFDLGtCQUFrQixDQUNuQixTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUN2RCxFQUNELG9CQUFFLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQ25DLENBQUMsQ0FBQztLQUNKO0lBQ0QsTUFBTSxjQUFjLEdBQUcsWUFBRSxDQUFDLFdBQVcsQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUNuRCxLQUFLLElBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsY0FBYyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtRQUM5QyxNQUFNLFFBQVEsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDLENBQUM7UUFDbkMsTUFBTSxVQUFVLEdBQUcsR0FBRyxXQUFXLEdBQUcsUUFBUSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDO1FBQzdELGNBQWMsQ0FBQyxJQUFJLENBQUMsb0JBQUUsQ0FBQyx1QkFBdUIsQ0FDNUMsU0FBUyxFQUNULFNBQVMsRUFDVCxvQkFBRSxDQUFDLGtCQUFrQixDQUNuQixTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxxQkFBcUIsQ0FBQyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUN2RCxFQUNELG9CQUFFLENBQUMsbUJBQW1CLENBQUMsVUFBVSxDQUFDLENBQ25DLENBQUMsQ0FBQztLQUNKO0lBRUQsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixvQkFBRSxDQUFDLHVCQUF1QixDQUN4QixTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyw2QkFBNkIsQ0FDOUI7WUFDRSxvQkFBRSxDQUFDLHlCQUF5QixDQUMxQixvQkFBRSxDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxFQUN6QixTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxTQUFTLENBQUMsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsRUFBRSxTQUFTLEVBQUU7Z0JBQ2pELG9CQUFFLENBQUMsU0FBUyxDQUFDLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsTUFBTSxDQUFDLEVBQUUsU0FBUyxFQUFFLEVBQUUsQ0FBQzthQUN6RCxDQUFDLENBQ0g7U0FDRixFQUNELG9CQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDbkIsQ0FDRjtRQUNELG9CQUFFLENBQUMsdUJBQXVCLENBQ3hCLFNBQVMsRUFDVCxvQkFBRSxDQUFDLDZCQUE2QixDQUM5QjtZQUNFLG9CQUFFLENBQUMseUJBQXlCLENBQzFCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEVBQ2pDLFNBQVMsRUFDVCxvQkFBRSxDQUFDLFNBQVMsQ0FBQyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLFlBQVksQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FDL0Q7U0FDRixFQUNELG9CQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDbkIsQ0FDRjtLQUNGLENBQUM7SUFFRixNQUFNLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFFM0Isb0JBQW9CO0lBQ3BCLGVBQWUsQ0FBQyxJQUFJLENBQUMsb0JBQUUsQ0FBQyx1QkFBdUIsQ0FDN0MsU0FBUyxFQUNULG9CQUFFLENBQUMsNkJBQTZCLENBQzlCO1FBQ0Usb0JBQUUsQ0FBQyx5QkFBeUIsQ0FDMUIsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFDN0IsU0FBUyxFQUNULG9CQUFFLENBQUMsa0JBQWtCLENBQUMsRUFBRSxFQUFFLEtBQUssQ0FBQyxDQUNqQztLQUNGLEVBQ0Qsb0JBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUNuQixDQUNGLENBQUMsQ0FBQztJQUVILEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxlQUFlLENBQUMsTUFBTSxFQUFFLENBQUMsRUFBRSxFQUFFO1FBQy9DLG9FQUFvRTtRQUNwRSxrQkFBa0I7UUFDbEIsTUFBTSxjQUFjLEdBQUc7WUFDckIsb0JBQUUsQ0FBQyx1QkFBdUIsQ0FDeEIsU0FBUyxFQUNULG9CQUFFLENBQUMsNkJBQTZCLENBQzlCO2dCQUNFLG9CQUFFLENBQUMseUJBQXlCLENBQzFCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxHQUFHLENBQUMsQ0FBQyxFQUNoQyxTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxXQUFXLENBQ1osb0JBQUUsQ0FBQyxrQkFBa0IsQ0FDbkIsb0JBQUUsQ0FBQyxrQkFBa0IsQ0FDbkIsb0JBQUUsQ0FBQyxTQUFTLENBQ1Ysb0JBQUUsQ0FBQyxvQkFBb0IsQ0FDckIsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQyxDQUFDLEVBQzVCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQy9CLEVBQ0QsU0FBUyxFQUNULENBQUMsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUM1QixFQUNELG9CQUFFLENBQUMscUJBQXFCLENBQ3RCLG9CQUFFLENBQUMsVUFBVSxDQUFDLGNBQWMsQ0FDN0IsQ0FDRixFQUNELG9CQUFFLENBQUMsdUJBQXVCLENBQ3hCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsZUFBZSxDQUFDLEVBQ3BDO29CQUNFLG9CQUFFLENBQUMscUJBQXFCLENBQ3RCLG9CQUFFLENBQUMsVUFBVSxDQUFDLFVBQVUsQ0FDekI7aUJBQ0YsQ0FDRixDQUNGLENBQ0YsQ0FDRjthQUNGLEVBQ0Qsb0JBQUUsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUNuQixDQUNGO1lBQ0Qsb0JBQUUsQ0FBQyx5QkFBeUIsQ0FDMUIsb0JBQUUsQ0FBQyxVQUFVLENBQ1gsb0JBQUUsQ0FBQyxvQkFBb0IsQ0FDckIsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUMsRUFDN0Isb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxNQUFNLENBQUMsQ0FDNUIsRUFDRCxTQUFTLEVBQ1QsQ0FBQyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUNuQyxDQUNGO1NBQ0YsQ0FBQztRQUVGLGVBQWUsQ0FBQyxJQUFJLENBQUMsR0FBRyxjQUFjLENBQUMsQ0FBQztLQUN6QztJQUVELG1CQUFtQjtJQUNuQixlQUFlLENBQUMsSUFBSSxDQUFDLG9CQUFFLENBQUMsdUJBQXVCLENBQzdDLFNBQVMsRUFDVCxvQkFBRSxDQUFDLDZCQUE2QixDQUM5QjtRQUNFLG9CQUFFLENBQUMseUJBQXlCLENBQzFCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsT0FBTyxDQUFDLEVBQzVCLFNBQVMsRUFDVCxvQkFBRSxDQUFDLGtCQUFrQixDQUFDLEVBQUUsRUFBRSxLQUFLLENBQUMsQ0FDakM7S0FDRixFQUNELG9CQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FDbkIsQ0FDRixDQUFDLENBQUM7SUFFSCxxQ0FBcUM7SUFDckMsK0JBQStCO0lBQy9CLE1BQU07SUFDTixJQUFJLGNBQWMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO1FBQzdCLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLG9CQUFFLENBQUMseUJBQXlCLENBQzFCLG9CQUFFLENBQUMsVUFBVSxDQUNYLG9CQUFFLENBQUMsb0JBQW9CLENBQ3JCLG9CQUFFLENBQUMsVUFBVSxDQUNYLG9CQUFFLENBQUMsb0JBQW9CLENBQ3JCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLEVBQzdCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsUUFBUSxDQUFDLENBQzlCLEVBQ0QsU0FBUyxFQUNULENBQUMsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUM1QixFQUNELG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQy9CLEVBQ0QsU0FBUyxFQUNUO1lBQ0Usb0JBQUUsQ0FBQyxtQkFBbUIsQ0FDcEIsU0FBUyxFQUNULFNBQVMsRUFDVDtnQkFDRSxvQkFBRSxDQUFDLGVBQWUsQ0FDaEIsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxHQUFHLENBQUMsRUFDeEIsU0FBUyxFQUNULFNBQVMsRUFDVCxTQUFTLENBQ1Y7YUFDRixFQUNELFNBQVMsRUFDVCxvQkFBRSxDQUFDLFdBQVcsQ0FBQyxvQkFBRSxDQUFDLFVBQVUsQ0FBQyxzQkFBc0IsQ0FBQyxFQUNwRCxvQkFBRSxDQUFDLFdBQVcsQ0FDWjtnQkFDRSxvQkFBRSxDQUFDLHlCQUF5QixDQUMxQixvQkFBRSxDQUFDLFVBQVUsQ0FDWCxvQkFBRSxDQUFDLG9CQUFvQixDQUNyQixvQkFBRSxDQUFDLGdCQUFnQixDQUFDLE9BQU8sQ0FBQyxFQUM1QixvQkFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxDQUM1QixFQUNELFNBQVMsRUFDVDtvQkFDRSxvQkFBRSxDQUFDLGtCQUFrQixDQUNuQixvQkFBRSxDQUFDLGtCQUFrQixDQUNuQixvQkFBRSxDQUFDLGdCQUFnQixDQUFDLEdBQUcsQ0FBQyxFQUN4QixvQkFBRSxDQUFDLHFCQUFxQixDQUN0QixvQkFBRSxDQUFDLFVBQVUsQ0FBQyxjQUFjLENBQzdCLENBQ0YsRUFDRCxvQkFBRSxDQUFDLHVCQUF1QixDQUN4QixvQkFBRSxDQUFDLGdCQUFnQixDQUFDLE1BQU0sQ0FBQyxFQUMzQjt3QkFDRSxvQkFBRSxDQUFDLHFCQUFxQixDQUN0QixvQkFBRSxDQUFDLFVBQVUsQ0FBQyxVQUFVLENBQ3pCO3FCQUNGLENBQ0YsQ0FDRjtpQkFDRixDQUNGLENBQ0Y7YUFDRixFQUNELElBQUksQ0FDTCxDQUNGO1NBQ0YsQ0FDRixDQUNGLENBQ0YsQ0FBQztLQUNIO0lBRUQsNENBQTRDO0lBQzVDLGVBQWUsQ0FBQyxJQUFJLENBQ2xCLG9CQUFFLENBQUMsWUFBWSxDQUNiLG9CQUFFLENBQUMsVUFBVSxDQUNYLG9CQUFFLENBQUMsb0JBQW9CLENBQ3JCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsWUFBWSxDQUFDLEVBQ2pDLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQ2hDLEVBQ0QsU0FBUyxFQUNUO1FBQ0Usb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxRQUFRLENBQUM7UUFDN0Isb0JBQUUsQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFPLENBQUM7S0FDN0IsQ0FDRixDQUNGLENBQ0YsQ0FBQztJQUVGLE1BQU0sYUFBYSxHQUFHO1FBQ3BCLG9CQUFFLENBQUMsdUJBQXVCLENBQ3hCLFNBQVMsRUFDVCxvQkFBRSxDQUFDLDZCQUE2QixDQUM5QjtZQUNFLG9CQUFFLENBQUMseUJBQXlCLENBQzFCLG9CQUFFLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEVBQzlCLFNBQVMsRUFDVCxvQkFBRSxDQUFDLG1CQUFtQixDQUNwQixTQUFTLEVBQ1QsU0FBUyxFQUNULEVBQUUsRUFDRixTQUFTLEVBQ1Qsb0JBQUUsQ0FBQyxXQUFXLENBQUMsb0JBQUUsQ0FBQyxVQUFVLENBQUMsc0JBQXNCLENBQUM7WUFDcEQsZ0JBQWdCO1lBQ2hCLG9CQUFFLENBQUMsV0FBVyxDQUNaLGVBQWUsRUFDZixJQUFJLENBQ0wsQ0FDRixDQUNGO1NBQ0YsRUFDRCxvQkFBRSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQ25CLENBQ0Y7S0FDRixDQUFDO0lBQ0YsTUFBTSxtQkFBbUIsR0FBRztRQUMxQixvQkFBRSxDQUFDLHlCQUF5QixDQUMxQixvQkFBRSxDQUFDLFVBQVUsQ0FBQyxvQkFBRSxDQUFDLGdCQUFnQixDQUFDLFNBQVMsQ0FBQyxFQUFFLFNBQVMsRUFBRSxFQUFFLENBQUMsQ0FDN0Q7S0FDRixDQUFDO0lBRUYsTUFBTSxPQUFPLEdBQWtCLG9CQUFFLENBQUMsZ0JBQWdCLENBQ2hELFlBQVksRUFDWixFQUFFLEVBQ0Ysb0JBQUUsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUN0QixJQUFJLEVBQ0osb0JBQUUsQ0FBQyxVQUFVLENBQUMsRUFBRSxDQUNqQixDQUFDO0lBRUYsTUFBTSxNQUFNLEdBQUcsRUFBRSxDQUFDO0lBQ2xCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxhQUFhLENBQUMsQ0FBQztJQUM5QixNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsY0FBYyxDQUFDLENBQUM7SUFDL0IsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLG1CQUFtQixDQUFDLENBQUM7SUFDcEMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLGFBQWEsQ0FBQyxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxtQkFBbUIsQ0FBQyxDQUFDO0lBRXBDLE1BQU0sT0FBTyxHQUFHLG9CQUFFLENBQUMsT0FBTyxDQUFDLGdCQUFnQixDQUFDLE9BQU8sRUFBRSxNQUFNLENBQUMsQ0FBQztJQUU3RCxPQUFPLE9BQU8sQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUM7QUFDcEMsQ0FBQyxDQUFDO0FBRUYscUJBQWUsaUJBQWlCLENBQUM7Ozs7Ozs7Ozs7Ozs7Ozs7QUNuVmpDLGtFQUFvQjtBQUNwQixxRkFBK0M7QUFDL0Msc0dBQTBDO0FBQzFDLE1BQU0sT0FBTyxHQUFHLG1CQUFPLENBQUMsd0JBQVMsQ0FBQyxDQUFDO0FBRW5DLE1BQU0sU0FBUyxHQUFHLENBQUMsWUFBb0IsRUFBRSxXQUFtQixFQUFVLEVBQUU7SUFDdEUsTUFBTSxPQUFPLEdBQUcsSUFBSSw4QkFBYSxFQUFFLENBQUM7SUFDcEMsc0ZBQXNGO0lBQ3RGLE1BQU0sY0FBYyxHQUFHLHFCQUFpQixFQUFDLFlBQVksRUFBRSxXQUFXLENBQUM7SUFDbkUsTUFBTSxFQUFFLEdBQUcsY0FBYyxDQUFDO0lBRTFCLFlBQUUsQ0FBQyxhQUFhLENBQUMsVUFBVSxFQUFFLEVBQUUsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUMxQyxNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsU0FBUyxDQUFDO1FBQy9CLFdBQVcsRUFBRSxDQUFDLFVBQVUsQ0FBQztRQUN6QixNQUFNLEVBQUUsSUFBSTtRQUNaLFFBQVEsRUFBRSxNQUFNO1FBQ2hCLEtBQUssRUFBRSxLQUFLO1FBQ1osUUFBUSxFQUFFLENBQUMsV0FBVyxDQUFDO0tBQ3hCLENBQUMsQ0FBQztJQUVILFlBQUUsQ0FBQyxNQUFNLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDdEIsT0FBTyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7QUFDN0QsQ0FBQyxDQUFDO0FBRUYscUJBQWUsU0FBUyxDQUFDOzs7Ozs7Ozs7OztBQ3hCekI7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7Ozs7Ozs7QUNBQTs7Ozs7Ozs7OztBQ0FBOzs7Ozs7Ozs7O0FDQUE7Ozs7OztVQ0FBO1VBQ0E7O1VBRUE7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7VUFDQTtVQUNBO1VBQ0E7O1VBRUE7VUFDQTs7VUFFQTtVQUNBO1VBQ0E7Ozs7O1dDdEJBO1dBQ0E7V0FDQTtXQUNBO1dBQ0E7V0FDQSxpQ0FBaUMsV0FBVztXQUM1QztXQUNBOzs7OztXQ1BBO1dBQ0E7V0FDQTtXQUNBO1dBQ0EseUNBQXlDLHdDQUF3QztXQUNqRjtXQUNBO1dBQ0E7Ozs7O1dDUEE7Ozs7O1dDQUE7V0FDQTtXQUNBO1dBQ0EsdURBQXVELGlCQUFpQjtXQUN4RTtXQUNBLGdEQUFnRCxhQUFhO1dBQzdEOzs7Ozs7Ozs7Ozs7O0FDTkEsc0VBQW9DO0FBQ3BDLHNGQUFxQztBQUNyQyxvRUFBNEI7QUFFNUIsMEZBQThCO0FBRTlCLG1CQUFPLENBQUMsS0FBSyxFQUFFLENBQUMiLCJzb3VyY2VzIjpbIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9kaWZmZXIuanMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvanNvblN0YXRlbWVudHMuanMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvc3FsZ2VuZXJhdG9yLmpzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9jb21tYW5kcy9taWdyYXRpb24vaW5kZXgudHN4Iiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9jb21tYW5kcy9taWdyYXRpb24vbWlncmF0ZS9pbmRleC50c3giLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvY2xpL2NvbXBvbmVudHMtYXBpL0NvbXBvbmVudHNMaXN0LnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tcG9uZW50cy1hcGkvQ3JlYXRlQXBwLnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tcG9uZW50cy1hcGkvY29tcG9uZW50cy9Qcm9tcHRDb2x1bW5zQ29uZmxpY3RzLnRzeCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvY29tcG9uZW50cy1hcGkvY29tcG9uZW50cy9Qcm9tcHRUYWJsZXNDb25mbGljdHMudHN4Iiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9jb21wb25lbnRzLWFwaS9jb21wb25lbnRzL1Rhc2sudHN4Iiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL2NsaS9jb21wb25lbnRzLWFwaS9pbmRleC50c3giLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvY2xpL21hY2hpbmVzL3Jlc29sdmVDb2x1bW5zTWFjaGluZS50cyIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvbWFjaGluZXMvcmVzb2x2ZVRhYmxlc01hY2hpbmUudHMiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvLi9zcmMvY2xpL3V0aWxzL2Zvcm1hdERhdGFGb3JUYWJsZS50cyIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvdXRpbHMvdmFsdWVzRm9yUHJvbXB0cy50cyIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9taWdyYXRpb25QcmVwYXJhdG9yLnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL3NlcmlsaXplci9mYWN0b3J5LnRzIiwid2VicGFjazovL2RyaXp6bGUta2l0Ly4vc3JjL3NlcmlsaXplci9pbmRleC50cyIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcIkB4c3RhdGUvcmVhY3RcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcImNvbW1hbmRlclwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwiZXNidWlsZFwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwiaW5rXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJpbmstc2VsZWN0LWlucHV0XCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJpbmstc3Bpbm5lclwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwiaW5rLXRhYmxlXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgY29tbW9uanMgXCJqc29uLWRpZmZcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcInByZXR0eS1lcnJvci9zdGFydFwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwicmVhY3RcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcInNvdXJjZS1tYXAtc3VwcG9ydC9yZWdpc3RlclwiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwic3RyaW5nX2RlY29kZXJcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcInR5cGVzY3JpcHRcIiIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC9leHRlcm5hbCBjb21tb25qcyBcInZhbHRpb1wiIiwid2VicGFjazovL2RyaXp6bGUta2l0L2V4dGVybmFsIGNvbW1vbmpzIFwieHN0YXRlXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvZXh0ZXJuYWwgbm9kZS1jb21tb25qcyBcImZzXCIiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvd2VicGFjay9ib290c3RyYXAiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvd2VicGFjay9ydW50aW1lL2NvbXBhdCBnZXQgZGVmYXVsdCBleHBvcnQiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvd2VicGFjay9ydW50aW1lL2RlZmluZSBwcm9wZXJ0eSBnZXR0ZXJzIiwid2VicGFjazovL2RyaXp6bGUta2l0L3dlYnBhY2svcnVudGltZS9oYXNPd25Qcm9wZXJ0eSBzaG9ydGhhbmQiLCJ3ZWJwYWNrOi8vZHJpenpsZS1raXQvd2VicGFjay9ydW50aW1lL21ha2UgbmFtZXNwYWNlIG9iamVjdCIsIndlYnBhY2s6Ly9kcml6emxlLWtpdC8uL3NyYy9jbGkvaW5kZXgudHN4Il0sInNvdXJjZXNDb250ZW50IjpbIid1c2Utc3RyaWN0JztcblxuaW1wb3J0IHsgZGlmZiB9IGZyb20gJ2pzb24tZGlmZidcblxuXG5leHBvcnQgZnVuY3Rpb24gZGlmZkZvclJlbmFtZWQocGFpcnMpIHtcbiAgICAvLyByYW5hbWUgdGFibGUxIHRvIG5hbWUgb2YgdGFibGUyLCBzbyB3ZSBjYW4gYXBwbHkgZGlmZnNcbiAgICBjb25zdCByZW5hbWVkID0gcGFpcnMubWFwKGl0ID0+IHtcbiAgICAgICAgY29uc3QgZnJvbSA9IGl0LmZyb20gfHwgaXQub2xkXG4gICAgICAgIGNvbnN0IHRvID0gaXQudG8gfHwgaXQubmV3XG4gICAgICAgIGNvbnN0IG5ld0Zyb20gPSB7IC4uLmZyb20sIG5hbWU6IHRvLm5hbWUgfVxuICAgICAgICByZXR1cm4gW25ld0Zyb20sIHRvXVxuICAgIH0pXG5cbiAgICAvLyBmaW5kIGFueSBhbHRlcm5hdGlvbnMgbWFkZSB0byBhIHJlbmFtZWQgdGFibGVcbiAgICBjb25zdCBhbHRlcmVkID0gcmVuYW1lZC5tYXAocGFpciA9PiB7XG4gICAgICAgIGNvbnN0IGRpZmZlZCA9IGRpZmYocGFpclswXSwgcGFpclsxXSk7XG4gICAgICAgIGRpZmZlZC5uYW1lID0gcGFpclswXS5uYW1lXG5cbiAgICAgICAgcmV0dXJuIGZpbmRBbHRlcm5hdGlvbnNJblRhYmxlKGRpZmZlZClcbiAgICB9KVxuXG4gICAgcmV0dXJuIGFsdGVyZWRcbn1cbmV4cG9ydCBmdW5jdGlvbiBkaWZmZXIoanNvbjEsIGpzb24yKSB7XG4gICAgY29uc3QgZGlmZmVyZW5jZSA9IGRpZmYoanNvbjEsIGpzb24yKTtcblxuICAgIGRpZmZlcmVuY2UudGFibGVzID0gZGlmZmVyZW5jZS50YWJsZXMgPyBkaWZmZXJlbmNlLnRhYmxlcyA6IHt9XG4gICAgZGlmZmVyZW5jZS5lbnVtcyA9IGRpZmZlcmVuY2UuZW51bXMgPyBkaWZmZXJlbmNlLmVudW1zIDoge31cblxuICAgIGNvbnN0IHRhYmxlRW50cmllcyA9IE9iamVjdC5lbnRyaWVzKGRpZmZlcmVuY2UudGFibGVzKVxuICAgIGNvbnN0IGFkZGVkVGFibGVzID0gdGFibGVFbnRyaWVzLmZpbHRlcihpdCA9PiBpdFswXS5pbmNsdWRlcygnX19hZGRlZCcpKVxuICAgICAgICAubWFwKGl0ID0+IGl0WzFdKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGl0KVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAuLi5pdCwgaW5kZXhlczogT2JqZWN0LmVudHJpZXMoaXQuaW5kZXhlcykubWFwKGluZGV4RW50cnkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBjb25zdCBpZHggPSBpbmRleEVudHJ5WzFdXG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IG5hbWUgPSBpZHhbJ25hbWUnXVxuICAgICAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpZHhbJ2NvbHVtbnMnXSkubWFwKGl0ID0+IGl0WyduYW1lJ10pXG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIGNvbHVtbnMgfVxuICAgICAgICAgICAgICAgIH0pXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgY29uc3QgZGVsZXRlZFRhYmxlcyA9IHRhYmxlRW50cmllcy5maWx0ZXIoaXQgPT4gaXRbMF0uaW5jbHVkZXMoJ19fZGVsZXRlZCcpKS5tYXAoaXQgPT4gaXRbMV0pXG5cbiAgICBjb25zdCBlbnVtc0VudHJpZXMgPSBPYmplY3QuZW50cmllcyhkaWZmZXJlbmNlLmVudW1zKVxuXG4gICAgY29uc3QgYWRkZWRFbnVtcyA9IGVudW1zRW50cmllcy5maWx0ZXIoaXQgPT4gaXRbMF0uaW5jbHVkZXMoJ19fYWRkZWQnKSlcbiAgICAgICAgLm1hcChpdCA9PiBpdFsxXSlcbiAgICAgICAgLm1hcChpdCA9PiB7XG4gICAgICAgICAgICAvLyB2YWx1ZXM6IHsgdmFsMTogJ3ZhbDEnLCB2YWwyOiAndmFsMicgfSA9PiB2YWx1ZXM6IFsndmFsMScsICd2YWwyJ11cbiAgICAgICAgICAgIGNvbnN0IHZhbHVlcyA9IE9iamVjdC5lbnRyaWVzKGl0LnZhbHVlcykubWFwKHZlID0+IHZlWzFdKVxuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogaXQubmFtZSwgdmFsdWVzOiB2YWx1ZXMgfVxuICAgICAgICB9KVxuICAgIGNvbnN0IGRlbGV0ZWRFbnVtcyA9IGVudW1zRW50cmllcy5maWx0ZXIoaXQgPT4gaXRbMF0uaW5jbHVkZXMoJ19fZGVsZXRlZCcpKVxuICAgICAgICAubWFwKGl0ID0+IGl0WzFdKVxuICAgICAgICAubWFwKGl0ID0+IHtcblxuICAgICAgICAgICAgLy8gdmFsdWVzOiB7IHZhbDE6ICd2YWwxJywgdmFsMjogJ3ZhbDInIH0gPT4gdmFsdWVzOiBbJ3ZhbDEnLCAndmFsMiddXG4gICAgICAgICAgICBjb25zdCB2YWx1ZXMgPSBPYmplY3QuZW50cmllcyhpdC52YWx1ZXMpLm1hcCh2ZSA9PiB2ZVsxXSlcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0Lm5hbWUsIHZhbHVlczogdmFsdWVzIH1cbiAgICAgICAgfSlcbiAgICBjb25zdCBhbHRlcmVkRW51bXMgPSBlbnVtc0VudHJpZXMuZmlsdGVyKGl0ID0+ICEoaXRbMF0uaW5jbHVkZXMoJ19fYWRkZWQnKSB8fCBpdFswXS5pbmNsdWRlcygnX19kZWxldGVkJykpKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHZhbHMgPSBpdFsxXS52YWx1ZXNcbiAgICAgICAgICAgIGNvbnN0IGFkZGVkVmFsdWVzID0gT2JqZWN0LmVudHJpZXModmFscykuZmlsdGVyKHZhbCA9PiB2YWxbMF0uaW5jbHVkZXMoJ19fYWRkZWQnKSkubWFwKHZhbCA9PiB2YWxbMV0pXG4gICAgICAgICAgICBjb25zdCBkZWxldGVkVmFsdWVzID0gT2JqZWN0LmVudHJpZXModmFscykuZmlsdGVyKHZhbCA9PiB2YWxbMF0uaW5jbHVkZXMoJ19fZGVsZXRlZCcpKS5tYXAodmFsID0+IHZhbFsxXSlcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd2YWx1ZXM6ICcsIGl0WzFdLnZhbHVlcylcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0WzBdLCBhZGRlZFZhbHVlcywgZGVsZXRlZFZhbHVlcywgfVxuICAgICAgICB9KVxuXG4gICAgY29uc3QgYWx0ZXJlZFRhYmxlcyA9IE9iamVjdC5rZXlzKGRpZmZlcmVuY2UudGFibGVzKVxuICAgICAgICAuZmlsdGVyKGl0ID0+ICEoaXQuaW5jbHVkZXMoJ19fYWRkZWQnKSB8fCBpdC5pbmNsdWRlcygnX19kZWxldGVkJykpKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IG5hbWU6IGl0LCAuLi5kaWZmZXJlbmNlLnRhYmxlc1tpdF0gfVxuICAgICAgICB9KVxuXG4gICAgY29uc3QgYWx0ZXJlZFRhYmxlc1dpdGhDb2x1bW5zID0gYWx0ZXJlZFRhYmxlcy5tYXAodGFibGUgPT4gZmluZEFsdGVybmF0aW9uc0luVGFibGUodGFibGUpKVxuXG4gICAgcmV0dXJuIHtcbiAgICAgICAgYWRkZWRUYWJsZXMsXG4gICAgICAgIGRlbGV0ZWRUYWJsZXMsXG4gICAgICAgIGFsdGVyZWRUYWJsZXNXaXRoQ29sdW1ucyxcbiAgICAgICAgYWRkZWRFbnVtcyxcbiAgICAgICAgZGVsZXRlZEVudW1zLFxuICAgICAgICBhbHRlcmVkRW51bXMsXG4gICAgfVxufVxuXG5jb25zdCBmaW5kQWx0ZXJuYXRpb25zSW5UYWJsZSA9ICh0YWJsZSkgPT4ge1xuICAgIC8vIG1hcCBlYWNoIHRhYmxlIHRvIGhhdmUgYWx0ZXJlZCwgZGVsZXRlZCBvciByZW5hbWVkIGNvbHVtbnNcbiAgICBjb25zdCBjb2x1bW5zID0gdGFibGUuY29sdW1uczsgLy9pbiBjYXNlIG5vIGNvbHVtbnMgd2VyZSBhbHRlcmVkLCBidXQgaW5kZXhlcyB3ZXJlXG5cbiAgICBjb25zdCBhZGRlZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpLmZpbHRlcihpdCA9PiBpdC5pbmNsdWRlcygnX19hZGRlZCcpKS5tYXAoaXQgPT4ge1xuICAgICAgICByZXR1cm4geyAuLi5jb2x1bW5zW2l0XSB9XG4gICAgfSlcbiAgICBjb25zdCBkZWxldGVkID0gT2JqZWN0LmtleXMoY29sdW1ucykuZmlsdGVyKGl0ID0+IGl0LmluY2x1ZGVzKCdfX2RlbGV0ZWQnKSkubWFwKGl0ID0+IHtcbiAgICAgICAgcmV0dXJuIHsgLi4uY29sdW1uc1tpdF0gfVxuICAgIH0pXG4gICAgY29uc3QgYWx0ZXJlZCA9IE9iamVjdC5rZXlzKGNvbHVtbnMpXG4gICAgICAgIC5maWx0ZXIoaXQgPT4gIShpdC5pbmNsdWRlcygnX19kZWxldGVkJykgfHwgaXQuaW5jbHVkZXMoJ19fYWRkZWQnKSkpXG4gICAgICAgIC5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHsgbmFtZTogaXQsIC4uLmNvbHVtbnNbaXRdIH1cbiAgICAgICAgfSlcblxuICAgIGNvbnN0IGRlbGV0ZWRJbmRleGVzID0gT2JqZWN0LnZhbHVlcyh0YWJsZS5pbmRleGVzX19kZWxldGVkIHx8IHt9KS5tYXAoaXQgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gaXRbJ25hbWUnXVxuICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpdFsnY29sdW1ucyddKS5tYXAoaXQgPT4gaXRbJ25hbWUnXSlcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucyB9XG4gICAgfSkuY29uY2F0KFxuICAgICAgICBPYmplY3Qua2V5cyh0YWJsZS5pbmRleGVzIHx8IHt9KS5maWx0ZXIoaXQgPT4gaXQuaW5jbHVkZXMoJ19fZGVsZXRlZCcpKVxuICAgICAgICAgICAgLm1hcChpdCA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgaWR4ID0gdGFibGUuaW5kZXhlc1tpdF1cbiAgICAgICAgICAgICAgICBjb25zdCBuYW1lID0gaWR4WyduYW1lJ11cbiAgICAgICAgICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpZHhbJ2NvbHVtbnMnXSkubWFwKGl0ID0+IGl0WyduYW1lJ10pXG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucyB9XG4gICAgICAgICAgICB9KVxuICAgICk7XG5cbiAgICBjb25zdCBhZGRlZEluZGV4ZXMgPSBPYmplY3QudmFsdWVzKHRhYmxlLmluZGV4ZXNfX2FkZGVkIHx8IHt9KS5tYXAoaXQgPT4ge1xuICAgICAgICBjb25zdCBuYW1lID0gaXRbJ25hbWUnXVxuICAgICAgICBjb25zdCBjb2x1bW5zID0gT2JqZWN0LnZhbHVlcyhpdFsnY29sdW1ucyddKS5tYXAoaXQgPT4gaXRbJ25hbWUnXSlcbiAgICAgICAgcmV0dXJuIHsgbmFtZSwgY29sdW1ucyB9XG4gICAgfSkuY29uY2F0KFxuICAgICAgICBPYmplY3Qua2V5cyh0YWJsZS5pbmRleGVzIHx8IHt9KS5maWx0ZXIoaXQgPT4gaXQuaW5jbHVkZXMoJ19fYWRkZWQnKSlcbiAgICAgICAgICAgIC5tYXAoaXQgPT4ge1xuICAgICAgICAgICAgICAgIGNvbnN0IGlkeCA9IHRhYmxlLmluZGV4ZXNbaXRdXG4gICAgICAgICAgICAgICAgY29uc3QgbmFtZSA9IGlkeFsnbmFtZSddXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1ucyA9IE9iamVjdC52YWx1ZXMoaWR4Wydjb2x1bW5zJ10pLm1hcChpdCA9PiBpdFsnbmFtZSddKVxuICAgICAgICAgICAgICAgIHJldHVybiB7IG5hbWUsIGNvbHVtbnMgfVxuICAgICAgICAgICAgfSlcbiAgICApO1xuICAgIHJldHVybiB7IG5hbWU6IHRhYmxlLm5hbWUsIGRlbGV0ZWQsIGFkZGVkLCBhbHRlcmVkLCBhZGRlZEluZGV4ZXMsIGRlbGV0ZWRJbmRleGVzIH1cbn0iLCJleHBvcnQgY2xhc3MgVHlwZXMge1xuICAgIHN0YXRpYyBjcmVhdGVUYWJsZSA9ICdjcmVhdGVfdGFibGUnXG4gICAgc3RhdGljIGRyb3BUYWJsZSA9ICdkcm9wX3RhYmxlJ1xuICAgIHN0YXRpYyByZW5hbWVUYWJsZSA9ICdyZW5hbWVfdGFibGUnXG4gICAgc3RhdGljIGFsdGVyVGFibGVEcm9wQ29sdW1uID0gJ2FsdGVyX3RhYmxlX2Ryb3BfY29sdW1uJ1xuICAgIHN0YXRpYyBhbHRlclRhYmxlQWRkQ29sdW1uID0gJ2FsdGVyX3RhYmxlX2FkZF9jb2x1bW4nXG4gICAgc3RhdGljIGFsdGVyVGFibGVBbHRlckNvbHVtblNldFR5cGUgPSAnYWx0ZXJfdGFibGVfYWx0ZXJfY29sdW1uX3NldF90eXBlJ1xuICAgIHN0YXRpYyBhbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXREZWZhdWx0ID0gJ2FsdGVyX3RhYmxlX2FsdGVyX2NvbHVtbl9zZXRfZGVmYXVsdCdcbiAgICBzdGF0aWMgYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcERlZmF1bHQgPSAnYWx0ZXJfdGFibGVfYWx0ZXJfY29sdW1uX2Ryb3BfZGVmYXVsdCdcbiAgICBzdGF0aWMgYWx0ZXJUYWJsZUFsdGVyQ29sdW1uU2V0Tm90TnVsbCA9ICdhbHRlcl90YWJsZV9hbHRlcl9jb2x1bW5fc2V0X25vdG51bGwnXG4gICAgc3RhdGljIGFsdGVyVGFibGVBbHRlckNvbHVtbkRyb3BOb3ROdWxsID0gJ2FsdGVyX3RhYmxlX2FsdGVyX2NvbHVtbl9kcm9wX25vdG51bGwnXG4gICAgc3RhdGljIGNyZWF0ZUluZGV4ID0gJ2NyZWF0ZV9pbmRleCdcbiAgICBzdGF0aWMgZHJvcEluZGV4ID0gJ2Ryb3BfaW5kZXgnXG4gICAgc3RhdGljIGNyZWF0ZVR5cGVFbnVtID0gJ2NyZWF0ZV90eXBlX2VudW0nXG4gICAgc3RhdGljIGFsdGVyVHlwZUFkZFZhbHVlID0gJ2FsdGVyX3R5cGVfYWRkX3ZhbHVlJ1xufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZVRhYmxlSnNvbiA9ICh0YWJsZSkgPT4ge1xuICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucyB9ID0gdGFibGVcbiAgICBjb25zdCBtYXBwZWRDb2x1bW5zID0gT2JqZWN0LmtleXMoY29sdW1ucylcbiAgICAgICAgLm1hcChpdCA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyAuLi5jb2x1bW5zW2l0XSB9XG4gICAgICAgIH0pXG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBUeXBlcy5jcmVhdGVUYWJsZSxcbiAgICAgICAgdGFibGVOYW1lOiBuYW1lLFxuICAgICAgICBjb2x1bW5zOiBtYXBwZWRDb2x1bW5zXG4gICAgfTtcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVEcm9wVGFibGVKc29uID0gKHRhYmxlKSA9PiB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgdHlwZTogVHlwZXMuZHJvcFRhYmxlLFxuICAgICAgICB0YWJsZU5hbWU6IHRhYmxlLm5hbWVcbiAgICB9XG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlUmVuYW1lVGFibGVKc29uID0gKHRhYmxlRnJvbSwgdGFibGVUbykgPT4ge1xuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFR5cGVzLnJlbmFtZVRhYmxlLFxuICAgICAgICBmcm9tOiB0YWJsZUZyb20ubmFtZSxcbiAgICAgICAgdG86IHRhYmxlVG8ubmFtZVxuICAgIH1cbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVDcmVhdGVFbnVtSnNvbiA9IChuYW1lLCB2YWx1ZXMpID0+IHtcbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBUeXBlcy5jcmVhdGVUeXBlRW51bSxcbiAgICAgICAgZW51bU5hbWU6IG5hbWUsXG4gICAgICAgIHZhbHVlc1xuICAgIH1cbn1cblxuLy8gaHR0cHM6Ly9ibG9nLnlvMS5kb2cvdXBkYXRpbmctZW51bS12YWx1ZXMtaW4tcG9zdGdyZXNxbC10aGUtc2FmZS1hbmQtZWFzeS13YXkvXG5leHBvcnQgY29uc3QgcHJlcGFyZUFkZFZhbHVlc1RvRW51bUpzb24gPSAobmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgcmV0dXJuIHZhbHVlcy5tYXAoaXQgPT4ge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUeXBlQWRkVmFsdWUsXG4gICAgICAgICAgICBlbnVtTmFtZTogbmFtZSxcbiAgICAgICAgICAgIGVudW1WYWx1ZTogaXRcbiAgICAgICAgfVxuICAgIH0pXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQWx0ZXJUYWJsZUNvbHVtbnNKc29uID0gKHRhYmxlKSA9PiB7XG4gICAgY29uc3QgdGFibGVOYW1lID0gdGFibGVbJ25hbWUnXTtcbiAgICBjb25zdCBzdGF0ZW1lbnRzID0gW11cblxuICAgIGNvbnN0IGRyb3BDb2x1bW5zID0gX3ByZXBhcmVEcm9wQ29sdW1ucyh0YWJsZU5hbWUsIHRhYmxlLmRlbGV0ZWQpXG4gICAgY29uc3QgYWRkQ29sdW1ucyA9IF9wcmVwYXJlQWRkQ29sdW1ucyh0YWJsZU5hbWUsIHRhYmxlLmFkZGVkKVxuICAgIGNvbnN0IGFsdGVyQ29sdW1ucyA9IF9wcmVwYXJlQWx0ZXJDb2x1bW5zKHRhYmxlTmFtZSwgdGFibGUuYWx0ZXJlZClcblxuXG4gICAgc3RhdGVtZW50cy5wdXNoKC4uLmRyb3BDb2x1bW5zKVxuICAgIHN0YXRlbWVudHMucHVzaCguLi5hZGRDb2x1bW5zKVxuICAgIHN0YXRlbWVudHMucHVzaCguLi5hbHRlckNvbHVtbnMpXG5cbiAgICByZXR1cm4gc3RhdGVtZW50cztcbn1cblxuY29uc3QgX3ByZXBhcmVEcm9wQ29sdW1ucyA9ICh0YWxlTmFtZSwgY29sdW1ucykgPT4ge1xuICAgIHJldHVybiBjb2x1bW5zLm1hcChpdCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUeXBlcy5hbHRlclRhYmxlRHJvcENvbHVtbixcbiAgICAgICAgICAgIHRhYmxlTmFtZTogdGFsZU5hbWUsXG4gICAgICAgICAgICBjb2x1bW5OYW1lOiBpdC5uYW1lXG4gICAgICAgIH1cbiAgICB9KVxufVxuXG5jb25zdCBfcHJlcGFyZUFkZENvbHVtbnMgPSAodGFibGVOYW1lLCBjb2x1bW5zKSA9PiB7XG4gICAgcmV0dXJuIGNvbHVtbnMubWFwKGl0ID0+IHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVBZGRDb2x1bW4sXG4gICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICBjb2x1bW46IGl0XG4gICAgICAgIH1cbiAgICB9KVxufVxuXG5jb25zdCBfcHJlcGFyZUFsdGVyQ29sdW1ucyA9ICh0YWJsZU5hbWUsIGNvbHVtbnMpID0+IHtcbiAgICBsZXQgc3RhdGVtZW50cyA9IFtdXG5cbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IGNvbHVtbk5hbWUgPSBjb2x1bW4ubmFtZTtcblxuICAgICAgICBpZiAoY29sdW1uWyd0eXBlJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX19uZXcgfSA9IGNvbHVtbi50eXBlXG5cbiAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uU2V0VHlwZSxcbiAgICAgICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICAgICAgY29sdW1uTmFtZSxcbiAgICAgICAgICAgICAgICBuZXdEYXRhVHlwZTogX19uZXdcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uWydkZWZhdWx0VmFsdWUnXSB8fCBjb2x1bW5bJ2RlZmF1bHRWYWx1ZV9fYWRkZWQnXSkge1xuICAgICAgICAgICAgY29uc3QgbmV3RGVmYXVsdFZhbHVlID0gY29sdW1uLmRlZmF1bHRWYWx1ZS5fX25ldyB8IGNvbHVtbi5kZWZhdWx0VmFsdWVfX2FkZGVkXG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVBbHRlckNvbHVtblNldERlZmF1bHQsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICAgICAgbmV3RGVmYXVsdDogbmV3RGVmYXVsdFZhbHVlXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtblsnZGVmYXVsdFZhbHVlX19kZWxldGVkJ10pIHtcbiAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcERlZmF1bHQsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWUsXG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbHVtblsnbm90TnVsbF9fYWRkZWQnXSB8fCAoY29sdW1uWydub3ROdWxsJ10gJiYgY29sdW1uWydub3ROdWxsJ11bJ19fbmV3J10pKSB7XG4gICAgICAgICAgICBzdGF0ZW1lbnRzLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6IFR5cGVzLmFsdGVyVGFibGVBbHRlckNvbHVtblNldE5vdE51bGwsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uWydub3ROdWxsX19kZWxldGVkJ10gfHwgKGNvbHVtblsnbm90TnVsbCddICYmICFjb2x1bW5bJ25vdE51bGwnXVsnX19uZXcnXSkpIHtcbiAgICAgICAgICAgIHN0YXRlbWVudHMucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcE5vdE51bGwsXG4gICAgICAgICAgICAgICAgdGFibGVOYW1lLFxuICAgICAgICAgICAgICAgIGNvbHVtbk5hbWVcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gc3RhdGVtZW50c1xufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZUluZGV4ZXNKc29uID0gKHRhYmxlTmFtZSwgaW5kZXhlcykgPT4ge1xuICAgIHJldHVybiBpbmRleGVzLm1hcChpbmRleCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUeXBlcy5jcmVhdGVJbmRleCxcbiAgICAgICAgICAgIHRhYmxlTmFtZSxcbiAgICAgICAgICAgIGluZGV4TmFtZTogaW5kZXgubmFtZSxcbiAgICAgICAgICAgIGluZGV4VmFsdWU6IGluZGV4LmNvbHVtbnMuam9pbignLCAnKVxuICAgICAgICB9XG4gICAgfSlcbn1cbmV4cG9ydCBjb25zdCBwcmVwYXJlRHJvcEluZGV4ZXNKc29uID0gKHRhYmxlTmFtZSwgaW5kZXhlcykgPT4ge1xuICAgIHJldHVybiBpbmRleGVzLm1hcChpbmRleCA9PiB7XG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICB0eXBlOiBUeXBlcy5kcm9wSW5kZXgsXG4gICAgICAgICAgICB0YWJsZU5hbWUsXG4gICAgICAgICAgICBpbmRleE5hbWU6IGluZGV4Lm5hbWUsXG4gICAgICAgIH1cbiAgICB9KVxufVxuIiwiaW1wb3J0IHsgVHlwZXMgfSBmcm9tIFwiLi9qc29uU3RhdGVtZW50c1wiO1xuXG5jbGFzcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKHR5cGUpIHtcbiAgICAgICAgdGhpcy50eXBlID0gdHlwZVxuICAgIH1cblxuICAgIGNhbih0eXBlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnR5cGUgPT09IHR5cGU7XG4gICAgfVxuXG4gICAgY29udmVydChfKSB7XG4gICAgICAgIHRocm93IEVycm9yKCdvdmVycmlkZSB0aGUgY29udmVydCBtb3Rob2QnKVxuICAgIH1cbn1cblxuY2xhc3MgQ3JlYXRlVGFibGVDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5jcmVhdGVUYWJsZSlcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZU5hbWUsIGNvbHVtbnMgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgY29uc3QgbWFwcGVkQ29sdW1ucyA9IE9iamVjdC5rZXlzKGNvbHVtbnMpXG4gICAgICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4geyAuLi5jb2x1bW5zW2l0XSB9XG4gICAgICAgICAgICB9KVxuXG4gICAgICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuXG4gICAgICAgIHN0YXRlbWVudCArPSBgQ1JFQVRFIFRBQkxFICR7dGFibGVOYW1lfSAoXFxuYFxuICAgICAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBtYXBwZWRDb2x1bW5zKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLmxvZyhjb2x1bW4pO1xuICAgICAgICAgICAgY29uc3QgcHJpbWFyeUtleVN0YXRlbWVudCA9IGNvbHVtbi5wcmltYXJ5S2V5ID8gXCJQUklNQVJZIEtFWVwiIDogJydcbiAgICAgICAgICAgIGNvbnN0IG5vdE51bGxTdGF0ZW1lbnQgPSBjb2x1bW4ubm90TnVsbCA/IFwiTk9UIE5VTExcIiA6IFwiXCI7XG4gICAgICAgICAgICBjb25zdCBkZWZhdWx0U3RhdGVtZW50ID0gY29sdW1uLmRlZmF1bHRWYWx1ZSA/IGBERUZBVUxUICcke2NvbHVtbi5kZWZhdWx0VmFsdWV9J2AgOiBcIlwiO1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdcXHQnICsgYCR7Y29sdW1uLm5hbWV9ICR7Y29sdW1uLnR5cGV9ICR7cHJpbWFyeUtleVN0YXRlbWVudH0gJHtkZWZhdWx0U3RhdGVtZW50fSAke25vdE51bGxTdGF0ZW1lbnR9YC5yZXBsYWNlKC8gICsvZywgJyAnKS50cmltKCkgKyAnLFxcbidcbiAgICAgICAgfVxuICAgICAgICBzdGF0ZW1lbnQgKz0gYCk7YFxuICAgICAgICByZXR1cm4gc3RhdGVtZW50O1xuICAgIH1cbn1cblxuY2xhc3MgQ3JlYXRlVHlwZUVudW1Db252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5jcmVhdGVUeXBlRW51bSlcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyBlbnVtTmFtZSwgdmFsdWVzIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIGxldCB2YWx1ZXNTdGF0ZW1lbnQgPSAnKCdcbiAgICAgICAgdmFsdWVzU3RhdGVtZW50ICs9IHZhbHVlcy5tYXAoaXQgPT4gYCcke2l0fSdgKS5qb2luKCcsICcpXG4gICAgICAgIHZhbHVlc1N0YXRlbWVudCArPSAnKSdcblxuICAgICAgICByZXR1cm4gYENSRUFURSBUWVBFICR7ZW51bU5hbWV9IEFTIEVOVU0ke3ZhbHVlc1N0YXRlbWVudH07YFxuICAgIH1cbn1cblxuY2xhc3MgQWx0ZXJUeXBlQWRkVmFsdWVDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5hbHRlclR5cGVBZGRWYWx1ZSlcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyBlbnVtTmFtZSwgZW51bVZhbHVlIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIHJldHVybiBgQUxURVIgVFlQRSAke2VudW1OYW1lfSBBREQgVkFMVUUgJHtlbnVtVmFsdWV9O2BcbiAgICB9XG59XG5cbmNsYXNzIERyb3BUYWJsZUNvbnZlcnRvciBleHRlbmRzIENvbnZlcnRvciB7XG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKFR5cGVzLmRyb3BUYWJsZSlcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZU5hbWUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBEUk9QIFRBQkxFICR7dGFibGVOYW1lfWBcbiAgICB9XG59XG5cbmNsYXNzIFJlbmFtZVRhYmxlQ29udmVydG9yIGV4dGVuZHMgQ29udmVydG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoVHlwZXMucmVuYW1lVGFibGUpXG4gICAgfVxuXG4gICAgY29udmVydChqc29uU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgZnJvbSwgdG8gfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke2Zyb219IFJFTkFNRSBUTyAke3RvfWBcbiAgICB9XG59XG5cbmNsYXNzIEFsdGVyVGFibGVEcm9wQ29sdW1uQ29udmVydG9yIGV4dGVuZHMgQ29udmVydG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoVHlwZXMuYWx0ZXJUYWJsZURyb3BDb2x1bW4pXG4gICAgfVxuXG4gICAgY29udmVydChqc29uU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGVOYW1lLCBjb2x1bW5OYW1lIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIHJldHVybiBgQUxURVIgVEFCTEUgJHt0YWJsZU5hbWV9IERST1AgQ09MVU1OIElGIEVYSVNUUyAke2NvbHVtbk5hbWV9O2BcbiAgICB9XG59XG5cbmNsYXNzIEFsdGVyVGFibGVBZGRDb2x1bW5Db252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5hbHRlclRhYmxlQWRkQ29sdW1uKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IHRhYmxlTmFtZSwgY29sdW1uIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZGVmYXVsdFZhbHVlLCBub3ROdWxsIH0gPSBjb2x1bW47XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXRlbWVudCA9IGAke2RlZmF1bHRWYWx1ZSA/IGAgREVGQVVMVCAke2RlZmF1bHRWYWx1ZX1gIDogJyd9YFxuICAgICAgICBjb25zdCBub3ROdWxsU3RhdGVtZW50ID0gYCR7bm90TnVsbCA/ICcgTk9UIE5VTEwnIDogJyd9YFxuICAgICAgICByZXR1cm4gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBREQgQ09MVU1OICR7bmFtZX0gJHt0eXBlfSR7ZGVmYXVsdFN0YXRlbWVudH0ke25vdE51bGxTdGF0ZW1lbnR9YC50cmltKCkgKyAnOydcbiAgICB9XG59XG5cbmNsYXNzIEFsdGVyVGFibGVBbHRlckNvbHVtblNldFR5cGVDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5hbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXRUeXBlKVxuICAgIH1cblxuICAgIGNvbnZlcnQoanNvblN0YXRlbWVudCkge1xuICAgICAgICBjb25zdCB7IHRhYmxlTmFtZSwgY29sdW1uTmFtZSwgbmV3RGF0YVR5cGUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7Y29sdW1uTmFtZX0gU0VUIERBVEEgVFlQRSAke25ld0RhdGFUeXBlfTtgXG4gICAgfVxufVxuXG5jbGFzcyBBbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXROb3ROdWxsQ29udmVydG9yIGV4dGVuZHMgQ29udmVydG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uU2V0Tm90TnVsbClcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZU5hbWUsIGNvbHVtbk5hbWUgfSA9IGpzb25TdGF0ZW1lbnRcbiAgICAgICAgcmV0dXJuIGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7Y29sdW1uTmFtZX0gU0VUIE5PVCBOVUxMO2BcbiAgICB9XG59XG5cbmNsYXNzIEFsdGVyVGFibGVBbHRlckNvbHVtbkRyb3BOb3ROdWxsQ29udmVydG9yIGV4dGVuZHMgQ29udmVydG9yIHtcbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgc3VwZXIoVHlwZXMuYWx0ZXJUYWJsZUFsdGVyQ29sdW1uRHJvcE5vdE51bGwpXG4gICAgfVxuXG4gICAgY29udmVydChqc29uU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgdGFibGVOYW1lLCBjb2x1bW5OYW1lIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIHJldHVybiBgQUxURVIgVEFCTEUgJHt0YWJsZU5hbWV9IEFMVEVSIENPTFVNTiAke2NvbHVtbk5hbWV9IERST1AgTk9UIE5VTEw7YFxuICAgIH1cbn1cblxuY2xhc3MgQ3JlYXRlSW5kZXhDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5jcmVhdGVJbmRleClcbiAgICB9XG5cbiAgICBjb252ZXJ0KGpzb25TdGF0ZW1lbnQpIHtcbiAgICAgICAgY29uc3QgeyB0YWJsZU5hbWUsIGluZGV4TmFtZSwgaW5kZXhWYWx1ZSB9ID0ganNvblN0YXRlbWVudFxuICAgICAgICByZXR1cm4gYENSRUFURSBJTkRFWCAke2luZGV4TmFtZX0gT04gJHt0YWJsZU5hbWV9ICgke2luZGV4VmFsdWV9KTtgXG4gICAgfVxufVxuXG5jbGFzcyBEcm9wSW5kZXhDb252ZXJ0b3IgZXh0ZW5kcyBDb252ZXJ0b3Ige1xuICAgIGNvbnN0cnVjdG9yKCkge1xuICAgICAgICBzdXBlcihUeXBlcy5kcm9wSW5kZXgpXG4gICAgfVxuXG4gICAgY29udmVydChqc29uU3RhdGVtZW50KSB7XG4gICAgICAgIGNvbnN0IHsgaW5kZXhOYW1lIH0gPSBqc29uU3RhdGVtZW50XG4gICAgICAgIHJldHVybiBgRFJPUCBJTkRFWCBJRiBFWElTVFMgJHtpbmRleE5hbWV9O2BcbiAgICB9XG59XG5cbmNvbnN0IGNvbnZlcnRvcnMgPSBbXVxuY29udmVydG9ycy5wdXNoKG5ldyBDcmVhdGVUYWJsZUNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBDcmVhdGVUeXBlRW51bUNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBEcm9wVGFibGVDb252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgUmVuYW1lVGFibGVDb252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgQWx0ZXJUYWJsZURyb3BDb2x1bW5Db252ZXJ0b3IoKSlcbmNvbnZlcnRvcnMucHVzaChuZXcgQWx0ZXJUYWJsZUFkZENvbHVtbkNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBBbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXRUeXBlQ29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IENyZWF0ZUluZGV4Q29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IERyb3BJbmRleENvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBBbHRlclR5cGVBZGRWYWx1ZUNvbnZlcnRvcigpKVxuY29udmVydG9ycy5wdXNoKG5ldyBBbHRlclRhYmxlQWx0ZXJDb2x1bW5TZXROb3ROdWxsQ29udmVydG9yKCkpXG5jb252ZXJ0b3JzLnB1c2gobmV3IEFsdGVyVGFibGVBbHRlckNvbHVtbkRyb3BOb3ROdWxsQ29udmVydG9yKCkpXG5cbmV4cG9ydCBjb25zdCBmcm9tSnNvbiA9IChzdGF0ZW1lbnRzKSA9PiB7XG4gICAgcmV0dXJuIHN0YXRlbWVudHMubWFwKHN0YXRlbWVudCA9PiB7XG4gICAgICAgIGNvbnN0IGZpbHRlcmVkID0gY29udmVydG9ycy5maWx0ZXIoaXQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGl0LmNhbihzdGF0ZW1lbnQudHlwZSlcbiAgICAgICAgfSlcbiAgICAgICAgY29uc3QgY29udmVydG9yID0gZmlsdGVyZWQubGVuZ3RoID09PSAxID8gZmlsdGVyZWRbMF0gOiB1bmRlZmluZWRcblxuICAgICAgICBpZiAoIWNvbnZlcnRvcikge1xuICAgICAgICAgICAgY29uc29sZS5sb2coJ25vIGNvbnZlcnRvcjonLCBzdGF0ZW1lbnQudHlwZSlcbiAgICAgICAgICAgIHJldHVybiAnZHJ5IHJ1bidcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb252ZXJ0b3IuY29udmVydChzdGF0ZW1lbnQpXG4gICAgfSlcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVEZWxldGVDb2x1bW5zID0gKHRhYmxlTmFtZSwgY29sdW1ucykgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gRFJPUCBDT0xVTU4gSUYgRVhJU1RTICR7Y29sdW1uLm5hbWV9O2BcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgfVxuICAgIHJldHVybiBzdGF0ZW1lbnQudHJpbSgpXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQ3JlYXRlQ29sdW1ucyA9ICh0YWJsZU5hbWUsIGNvbHVtbnMpID0+IHtcbiAgICBsZXQgc3RhdGVtZW50ID0gJydcbiAgICBmb3IgKGNvbnN0IGNvbHVtbiBvZiBjb2x1bW5zKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgdHlwZSwgZGVmYXVsdFZhbHVlLCBub3ROdWxsIH0gPSBjb2x1bW47XG5cbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXRlbWVudCA9IGAke2RlZmF1bHRWYWx1ZSA/IGBERUZBVUxUICR7ZGVmYXVsdFZhbHVlfWAgOiAnJ31gXG4gICAgICAgIGNvbnN0IG5vdE51bGxTdGF0ZW1lbnQgPSBgJHtub3ROdWxsID8gJ05PVCBOVUxMJyA6ICcnfWBcbiAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUREIENPTFVNTiAke25hbWV9ICR7dHlwZX0gJHtkZWZhdWx0U3RhdGVtZW50fSAke25vdE51bGxTdGF0ZW1lbnR9YC50cmltKCkgKyAnOydcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgfVxuICAgIHJldHVybiBzdGF0ZW1lbnQudHJpbSgpXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlQWx0ZXJDb2x1bW5zID0gKHRhYmxlTmFtZSwgY29sdW1ucykgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIGNvbHVtbnMpIHtcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBjb2x1bW47XG5cbiAgICAgICAgaWYgKGNvbHVtblsndHlwZSddKSB7XG4gICAgICAgICAgICBjb25zdCB7IF9fbmV3IH0gPSBjb2x1bW4udHlwZVxuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gU0VUIERBVEEgVFlQRSAke19fbmV3fTtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ2RlZmF1bHRWYWx1ZSddKSB7XG4gICAgICAgICAgICBjb25zdCB7IF9fbmV3IH0gPSBjb2x1bW4uZGVmYXVsdFZhbHVlXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBTFRFUiBDT0xVTU4gJHtuYW1lfSBTRVQgREVGQVVMVCAke19fbmV3fTtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ2RlZmF1bHRWYWx1ZV9fYWRkZWQnXSkge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gU0VUIERFRkFVTFQgJHtjb2x1bW4uZGVmYXVsdFZhbHVlX19hZGRlZH07YFxuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uWydkZWZhdWx0VmFsdWVfX2RlbGV0ZWQnXSkge1xuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coYGRlZmF1bHQgdmFsdWUgZGVsZXRlZGApXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gYEFMVEVSIFRBQkxFICR7dGFibGVOYW1lfSBBTFRFUiBDT0xVTU4gJHtuYW1lfSBEUk9QIERFRkFVTFQ7YFxuICAgICAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29sdW1uWydub3ROdWxsJ10pIHtcbiAgICAgICAgICAgIGNvbnN0IHsgX19uZXcgfSA9IGNvbHVtbi5ub3ROdWxsXG4gICAgICAgICAgICBjb25zdCBkcm9wU3RhdGVtZW50ID0gX19uZXcgPyAnU0VUIE5PVCBOVUxMJyA6ICdEUk9QIE5PVCBOVUxMJ1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gJHtkcm9wU3RhdGVtZW50fTtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ25vdE51bGxfX2FkZGVkJ10pIHtcbiAgICAgICAgICAgIHN0YXRlbWVudCArPSBgQUxURVIgVEFCTEUgJHt0YWJsZU5hbWV9IEFMVEVSIENPTFVNTiAke25hbWV9IFNFVCBOT1QgTlVMTDtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb2x1bW5bJ25vdE51bGxfX2RlbGV0ZWQnXSkge1xuICAgICAgICAgICAgc3RhdGVtZW50ICs9IGBBTFRFUiBUQUJMRSAke3RhYmxlTmFtZX0gQUxURVIgQ09MVU1OICR7bmFtZX0gRFJPUCBOT1QgTlVMTDtgXG4gICAgICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gc3RhdGVtZW50LnRyaW0oKVxufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZVRhYmxlID0gKHRhYmxlKSA9PiB7XG4gICAgY29uc3QgeyBuYW1lLCBjb2x1bW5zIH0gPSB0YWJsZVxuICAgIGNvbnN0IG1hcHBlZENvbHVtbnMgPSBPYmplY3Qua2V5cyhjb2x1bW5zKVxuICAgICAgICAubWFwKGl0ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IC4uLmNvbHVtbnNbaXRdIH1cbiAgICAgICAgfSlcblxuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuXG4gICAgc3RhdGVtZW50ICs9IGBDUkVBVEUgVEFCTEUgJHtuYW1lfSAoXFxuYFxuICAgIGZvciAoY29uc3QgY29sdW1uIG9mIG1hcHBlZENvbHVtbnMpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coY29sdW1uKTtcbiAgICAgICAgY29uc3QgcHJpbWFyeUtleVN0YXRlbWVudCA9IGNvbHVtbi5wcmltYXJ5S2V5ID8gXCJQUklNQVJZIEtFWVwiIDogJydcbiAgICAgICAgY29uc3Qgbm90TnVsbFN0YXRlbWVudCA9IGNvbHVtbi5ub3ROdWxsID8gXCJOT1QgTlVMTFwiIDogXCJcIjtcbiAgICAgICAgY29uc3QgZGVmYXVsdFN0YXRlbWVudCA9IGNvbHVtbi5kZWZhdWx0VmFsdWUgPyBgREVGQVVMVCAnJHtjb2x1bW4uZGVmYXVsdFZhbHVlfSdgIDogXCJcIjtcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXHQnICsgYCR7Y29sdW1uLm5hbWV9ICR7Y29sdW1uLnR5cGV9ICR7cHJpbWFyeUtleVN0YXRlbWVudH0gJHtkZWZhdWx0U3RhdGVtZW50fSAke25vdE51bGxTdGF0ZW1lbnR9YC5yZXBsYWNlKC8gICsvZywgJyAnKS50cmltKCkgKyAnLFxcbidcbiAgICB9XG4gICAgc3RhdGVtZW50ICs9IGApO2BcbiAgICByZXR1cm4gc3RhdGVtZW50O1xufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZUluZGV4ID0gKHRhYmxlLCBpbmRleGVzKSA9PiB7XG4gICAgbGV0IHN0YXRlbWVudCA9ICcnXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSwgY29sdW1ucyB9ID0gaW5kZXhcbiAgICAgICAgc3RhdGVtZW50ICs9IGBDUkVBVEUgSU5ERVggJHtuYW1lfSBPTiAke3RhYmxlfSAoJHtjb2x1bW5zLmpvaW4oJywgJyl9KTtgXG4gICAgICAgIHN0YXRlbWVudCArPSAnXFxuJ1xuICAgIH1cblxuICAgIHJldHVybiBzdGF0ZW1lbnQudHJpbSgpXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlRHJvcEluZGV4ID0gKHRhYmxlLCBpbmRleGVzKSA9PiB7XG4gICAgbGV0IHN0YXRlbWVudCA9ICcnXG4gICAgZm9yIChjb25zdCBpbmRleCBvZiBpbmRleGVzKSB7XG4gICAgICAgIGNvbnN0IHsgbmFtZSB9ID0gaW5kZXhcbiAgICAgICAgc3RhdGVtZW50ICs9IGBEUk9QIElOREVYIElGIEVYSVNUUyAke25hbWV9O2BcbiAgICAgICAgc3RhdGVtZW50ICs9ICdcXG4nXG4gICAgfVxuICAgIHJldHVybiBzdGF0ZW1lbnQudHJpbSgpXG59XG5cbmV4cG9ydCBjb25zdCBwcmVwYXJlUmVuYW1lVGFibGUgPSAodGFibGVGcm9tLCB0YWJsZVRvKSA9PiB7XG4gICAgY29uc3QgbmFtZWZyb20gPSB0YWJsZUZyb20ubmFtZVxuICAgIGNvbnN0IG5hbWVUbyA9IHRhYmxlVG8ubmFtZVxuICAgIGNvbnN0IHN0YXRlbWVudCA9IGBBTFRFUiBUQUJMRSAke25hbWVmcm9tfSBSRU5BTUUgVE8gJHtuYW1lVG99YFxuICAgIHJldHVybiBzdGF0ZW1lbnRcbn1cblxuZXhwb3J0IGNvbnN0IHByZXBhcmVEcm9wVGFibGUgPSAodGFibGUpID0+IHtcbiAgICBjb25zdCB7IG5hbWUgfSA9IHRhYmxlO1xuICAgIHJldHVybiBgRFJPUCBUQUJMRSAke25hbWV9YFxufVxuXG5leHBvcnQgY29uc3QgcHJlcGFyZUNyZWF0ZUVudW0gPSAobmFtZSwgdmFsdWVzKSA9PiB7XG4gICAgLy8gY29uc29sZS5sb2cobmFtZSwgdmFsdWVzKVxuICAgIGxldCB2YWx1ZXNTdGF0ZW1lbnQgPSAnKCdcbiAgICB2YWx1ZXNTdGF0ZW1lbnQgKz0gT2JqZWN0LnZhbHVlcyh2YWx1ZXMpLm1hcChpdCA9PiBgJyR7aXR9J2ApLmpvaW4oJywgJylcbiAgICB2YWx1ZXNTdGF0ZW1lbnQgKz0gJyknXG5cbiAgICBjb25zdCBzdGF0ZW1lbnQgPSBgQ1JFQVRFIFRZUEUgJHtuYW1lfSBBUyBFTlVNJHt2YWx1ZXNTdGF0ZW1lbnR9O2BcbiAgICByZXR1cm4gc3RhdGVtZW50O1xufVxuXG4vLyBodHRwczovL2Jsb2cueW8xLmRvZy91cGRhdGluZy1lbnVtLXZhbHVlcy1pbi1wb3N0Z3Jlc3FsLXRoZS1zYWZlLWFuZC1lYXN5LXdheS9cbmV4cG9ydCBjb25zdCBwcmVwYXJlQWRkVmFsdWVzVG9FbnVtID0gKG5hbWUsIHZhbHVlcykgPT4ge1xuICAgIGxldCBzdGF0ZW1lbnQgPSAnJ1xuICAgIGZvciAoY29uc3QgaWR4IGluIHZhbHVlcykge1xuICAgICAgICBzdGF0ZW1lbnQgKz0gYEFMVEVSIFRZUEUgJHtuYW1lfSBBREQgVkFMVUUgJHt2YWx1ZXNbaWR4XX07YFxuICAgICAgICBzdGF0ZW1lbnQgKz0gJ1xcbidcbiAgICB9XG4gICAgcmV0dXJuIHN0YXRlbWVudC50cmltKCk7XG59XG5cblxuXG5cbi8vIHRlc3QgY2FzZSBmb3IgZW51bSBhbHRlcmluZ1xuYFxuY3JlYXRlIHRhYmxlIHVzZXJzIChcblx0aWQgaW50LFxuICAgIG5hbWUgY2hhcmFjdGVyIHZhcnlpbmcoMTI4KVxuKTtcblxuY3JlYXRlIHR5cGUgdmVudW0gYXMgZW51bSgnb25lJywgJ3R3bycsICd0aHJlZScpO1xuYWx0ZXIgdGFibGUgdXNlcnMgYWRkIGNvbHVtbiB0eXBlZCB2ZW51bTtcblxuaW5zZXJ0IGludG8gdXNlcnMoaWQsIG5hbWUsIHR5cGVkKSB2YWx1ZXMgKDEsICduYW1lMScsICdvbmUnKTtcbmluc2VydCBpbnRvIHVzZXJzKGlkLCBuYW1lLCB0eXBlZCkgdmFsdWVzICgyLCAnbmFtZTInLCAndHdvJyk7XG5pbnNlcnQgaW50byB1c2VycyhpZCwgbmFtZSwgdHlwZWQpIHZhbHVlcyAoMywgJ25hbWUzJywgJ3RocmVlJyk7XG5cbmFsdGVyIHR5cGUgdmVudW0gcmVuYW1lIHRvIF9fdmVudW07XG5jcmVhdGUgdHlwZSB2ZW51bSBhcyBlbnVtICgnb25lJywgJ3R3bycsICd0aHJlZScsICdmb3VyJywgJ2ZpdmUnKTtcblxuQUxURVIgVEFCTEUgdXNlcnMgQUxURVIgQ09MVU1OIHR5cGVkIFRZUEUgdmVudW0gVVNJTkcgdHlwZWQ6OnRleHQ6OnZlbnVtO1xuXG5pbnNlcnQgaW50byB1c2VycyhpZCwgbmFtZSwgdHlwZWQpIHZhbHVlcyAoNCwgJ25hbWU0JywgJ2ZvdXInKTtcbmluc2VydCBpbnRvIHVzZXJzKGlkLCBuYW1lLCB0eXBlZCkgdmFsdWVzICg1LCAnbmFtZTUnLCAnZml2ZScpO1xuXG5kcm9wIHR5cGUgX192ZW51bTtcbmAiLCJpbXBvcnQgeyBwcm9ncmFtIH0gZnJvbSAnY29tbWFuZGVyJztcblxuaW1wb3J0IG1pZ3JhdGUgZnJvbSAnLi9taWdyYXRlJztcblxuY29uc3QgY21kID0gcHJvZ3JhbVxuICAuY29tbWFuZCgnbWlncmF0ZScpXG4gIC5hbGlhcygnbWcnKVxuICAuZGVzY3JpcHRpb24oJ01pZ3JhdGlvbicpXG4gIC5hY3Rpb24obWlncmF0ZSk7XG5jbWQuY29tbWFuZCgnc3RhcnQnKS5kZXNjcmlwdGlvbignU3RhcnQgbWlncmF0aW9uJykuYWN0aW9uKG1pZ3JhdGUpO1xuIiwiaW1wb3J0IHsgdGFzaywgcHJvbXB0VGFibGVzQ29uZmxpY3RzLCBwcm9tcHRDb2x1bW5zQ29uZmxpY3RzIH0gZnJvbSAnY2xpL2NvbXBvbmVudHMtYXBpJztcbmltcG9ydCBmcyBmcm9tICdmcyc7XG5pbXBvcnQgKiBhcyBkaWZmZXIgZnJvbSAnLi4vLi4vLi4vLi4vZGlmZmVyJztcbmltcG9ydCBwcmVwYXJlTWlncmF0aW9uIGZyb20gJ21pZ3JhdGlvblByZXBhcmF0b3InO1xuXG5pbXBvcnQgeyBwcmVwYXJlQWRkVmFsdWVzVG9FbnVtSnNvbiwgcHJlcGFyZUFsdGVyVGFibGVDb2x1bW5zSnNvbiwgcHJlcGFyZUNyZWF0ZUVudW1Kc29uLCBwcmVwYXJlQ3JlYXRlSW5kZXhlc0pzb24sIHByZXBhcmVDcmVhdGVUYWJsZUpzb24sIHByZXBhcmVEcm9wSW5kZXhlc0pzb24sIHByZXBhcmVEcm9wVGFibGVKc29uLCBwcmVwYXJlUmVuYW1lVGFibGVKc29uIH0gZnJvbSAnLi4vLi4vLi4vLi4vanNvblN0YXRlbWVudHMnO1xuaW1wb3J0IHsgZnJvbUpzb24gfSBmcm9tICcuLi8uLi8uLi8uLi9zcWxnZW5lcmF0b3InO1xuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlc1Jlc3VsdERhdGE8VD4ge1xuICBjcmVhdGVkOiBUW10sXG4gIHJlbmFtZWQ6IFJlbmFtZWRPYmplY3Q8VD5bXSxcbiAgZGVsZXRlZDogVFtdLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIENvbHVtbnNSZXN1bHREYXRhPFQgZXh0ZW5kcyBOYW1lZD4ge1xuICBjcmVhdGVkOiBUW10sXG4gIHJlbmFtZWQ6IFJlbmFtZWRPYmplY3Q8VD5bXSxcbiAgZGVsZXRlZDogVFtdLFxufVxuXG5leHBvcnQgaW50ZXJmYWNlIE5hbWVkIHtcbiAgbmFtZTogc3RyaW5nXG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgUmVuYW1lZE9iamVjdDxUPiB7XG4gIG9sZDogVCxcbiAgbmV3OiBUXG59XG5cbmNvbnN0IHR3byA9IChudW06IG51bWJlcikgPT4ge1xuICByZXR1cm4gbnVtLnRvU3RyaW5nKCkucGFkU3RhcnQoMiwgJzAnKVxufVxuXG5jb25zdCBtaWdyYXRlID0gYXN5bmMgKCkgPT4ge1xuICBjb25zdCB0aW1lb3V0RSA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpLnRoZW4oKCkgPT4ge1xuICAgIHRocm93IG5ldyBFcnJvcignQ2hlY2tpbmcgZXJyb3IgaGFuZGxpbmcnKTtcbiAgfSk7XG5cbiAgY29uc3QgdGltZW91dCA9IChtczogbnVtYmVyKSA9PiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4gc2V0VGltZW91dChyZXNvbHZlLCBtcykpO1xuXG4gIGNvbnN0IG1pZ3JhdGlvblJvb3RGb2xkZXIgPSAnZHJpenpsZScgLy8gb3IgZnJvbSBjb25maWcvcGFyYW1zXG4gIGNvbnN0IHsgcHJldiwgY3VyIH0gPSBhd2FpdCB0YXNrKCdwcmVwYXJpbmcgZGF0YSBzY2hlbWEganNvbiBzbmFwc2hvdCcsIGFzeW5jICh7IHNldFRpdGxlIH0pID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZU1pZ3JhdGlvbihtaWdyYXRpb25Sb290Rm9sZGVyLCAnLi9kYXRhL3YyJylcbiAgfSk7XG5cbiAgLy8gY29uc3QgajEgPSBKU09OLnBhcnNlKGZzLnJlYWRGaWxlU3luYygnLi9vdXQvdjFfMTYzNDU0Njc0NTQ4OC5qc29uJywgJ3V0ZjgnKSk7XG4gIC8vIGNvbnN0IGoyID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoJy4vb3V0L3YyXzE2MzQ1NDk2MDEzNjEuanNvbicsICd1dGY4JykpO1xuXG4gIGNvbnN0IGRpZmYgPSBhd2FpdCB0YXNrKCdwcmVwYXJpbmcgc2NoZW1hcyBkaWZmJywgYXN5bmMgKHsgc2V0VGl0bGUgfSkgPT4ge1xuICAgIHJldHVybiBkaWZmZXIuZGlmZmVyKHByZXYsIGN1cik7XG4gIH0pO1xuXG4gIGNvbnN0IHsgY3JlYXRlZCwgcmVuYW1lZCwgZGVsZXRlZCB9ID0gYXdhaXQgcHJvbXB0VGFibGVzQ29uZmxpY3RzKHtcbiAgICBuZXdUYWJsZXM6IGRpZmYuYWRkZWRUYWJsZXMsXG4gICAgbWlzc2luZ1RhYmxlczogZGlmZi5kZWxldGVkVGFibGVzLFxuICB9KTtcblxuICBjb25zdCBqc29uU3RhdGVtZW50czogYW55W10gPSBbXVxuXG4gIGNvbnN0IGpzb25DcmVhdGVUYWJsZXMgPSBjcmVhdGVkLm1hcChpdCA9PiB7XG4gICAgcmV0dXJuIHByZXBhcmVDcmVhdGVUYWJsZUpzb24oaXQpXG4gIH0pXG5cbiAgY29uc3QganNvbkNyZWF0ZUluZGV4ZXNGb3JDcmVhdGVkVGFibGVzID0gY3JlYXRlZC5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQ3JlYXRlSW5kZXhlc0pzb24oaXQubmFtZSwgaXQuaW5kZXhlcylcbiAgfSkuZmxhdCgpXG5cbiAgY29uc3QganNvbkRyb3BUYWJsZXMgPSBkZWxldGVkLm1hcChpdCA9PiB7XG4gICAgcmV0dXJuIHByZXBhcmVEcm9wVGFibGVKc29uKGl0KVxuICB9KVxuXG4gIGNvbnN0IGpzb25SZW5hbWVUYWJsZXMgPSByZW5hbWVkLm1hcChpdCA9PiB7XG4gICAgcmV0dXJuIHByZXBhcmVSZW5hbWVUYWJsZUpzb24oaXQub2xkLCBpdC5uZXcpXG4gIH0pXG5cbiAgLy8gY29uc3QgY3JlYXRlTmV3VGFibGVzID0gY3JlYXRlZC5tYXAoaXQgPT4ge1xuICAvLyAgIHJldHVybiBwcmVwYXJlQ3JlYXRlVGFibGUoaXQpXG4gIC8vIH0pXG4gIC8vIGNvbnNvbGUubG9nKGNyZWF0ZU5ld1RhYmxlcy5qb2luKCdcXG4nKS50cmltKCkpXG5cbiAgLy8gY29uc3QgZGVsZXRlVGFibGVzID0gZGVsZXRlZC5tYXAoaXQgPT4ge1xuICAvLyAgIHJldHVybiBwcmVwYXJlRHJvcFRhYmxlKGl0KVxuICAvLyB9KVxuICAvLyBjb25zb2xlLmxvZyhkZWxldGVUYWJsZXMuam9pbignXFxuJykudHJpbSgpKVxuXG4gIGNvbnN0IHJlbmFtZWRXaXRoQWx0ZXJuYXRpb25zID0gZGlmZmVyLmRpZmZGb3JSZW5hbWVkKHJlbmFtZWQpXG4gIGNvbnN0IGFsbEFsdGVyZWQgPSBkaWZmLmFsdGVyZWRUYWJsZXNXaXRoQ29sdW1ucy5jb25jYXQocmVuYW1lZFdpdGhBbHRlcm5hdGlvbnMpXG5cbiAgY29uc3QgYWxsQWx0ZXJlZFJlc29sdmVkID0gW11cbiAgZm9yIChjb25zdCB0YWJsZSBvZiBhbGxBbHRlcmVkKSB7XG4gICAgY29uc3QgcmVzdWx0ID0gYXdhaXQgcHJvbXB0Q29sdW1uc0NvbmZsaWN0cyh0YWJsZSk7XG5cbiAgICBjb25zdCB7IGRlbGV0ZWQsIGFkZGVkLCAuLi5pbmkgfSA9IHRhYmxlXG5cbiAgICBhbGxBbHRlcmVkUmVzb2x2ZWQucHVzaCh7IC4uLmluaSwgLi4ucmVzdWx0IH0pXG4gIH1cblxuICAvLyBjb25zb2xlLmxvZyhKU09OLnN0cmluZ2lmeShhbGxBbHRlcmVkUmVzb2x2ZWQsIG51bGwsIDIpKVxuXG4gIC8vIGNvbnN0IHJlbmFtZVRhYmxlcyA9IHJlbmFtZWQubWFwKGl0ID0+IHtcbiAgLy8gICByZXR1cm4gcHJlcGFyZVJlbmFtZVRhYmxlKGl0LmZyb20sIGl0LnRvKVxuICAvLyB9KVxuICAvLyBjb25zb2xlLmxvZyhyZW5hbWVUYWJsZXMuam9pbignXFxuJykudHJpbSgpKVxuXG4gIGNvbnN0IGpzb25BbHRlclRhYmxlcyA9IGFsbEFsdGVyZWRSZXNvbHZlZC5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlQWx0ZXJUYWJsZUNvbHVtbnNKc29uKGl0KVxuICB9KS5mbGF0KClcblxuICBjb25zdCBqc29uQ3JlYXRlSW5kZXhlc0ZvckFsbEFsdGVyZWRUYWJsZXMgPSBhbGxBbHRlcmVkUmVzb2x2ZWQubWFwKGl0ID0+IHtcbiAgICByZXR1cm4gcHJlcGFyZUNyZWF0ZUluZGV4ZXNKc29uKGl0Lm5hbWUsIGl0LmFkZGVkSW5kZXhlcyB8fCB7fSlcbiAgfSkuZmxhdCgpXG5cbiAgY29uc3QganNvbkRyb3BJbmRleGVzRm9yQWxsQWx0ZXJlZFRhYmxlcyA9IGFsbEFsdGVyZWRSZXNvbHZlZC5tYXAoaXQgPT4ge1xuICAgIHJldHVybiBwcmVwYXJlRHJvcEluZGV4ZXNKc29uKGl0Lm5hbWUsIGl0LmRlbGV0ZWRJbmRleGVzIHx8IHt9KVxuICB9KS5mbGF0KClcblxuICAvLyAvLyBFbnVtczpcbiAgLy8gLy8gLSDRgdC+0LfQtNCw0L3QuNC1INC10L3QsNC80LAg4pyFXG4gIC8vIC8vIC0g0L/QtdGA0LXQuNC80LXQvdC+0LLQsNC90LjQtSDQtdC90LDQvNCwICjQv9C+0LrQsCDQvdC1INC00LXQu9Cw0Y4p4o+zXG4gIC8vIC8vIC0g0LTQvtCx0LDQstC70LXQvdC40LUg0LLRjdC70YzRjiDQuiDQtdC90LDQvNGDIOKchVxuICAvLyAvLyAtINGA0LXQvdC10LnQvCDQstC10LnQu9GM0Y4g0YMg0LXQvdCw0LzQsCAo0L/QvtC60LAg0L3QtSDQtNC10LvQsNGOLCDRjdGC0L4g0L3QsNC00L4g0LfQsNC/0YDQsNGI0LjQstCw0YLRjCDQvtC/0Y/RgtGMINC20LUg0YfQtdGA0LXQtyDRgdC70LDQuSnij7NcbiAgLy8gLy8gLSDRg9C00LDQu9C10L3QuNC1INC10L3QsNC80LAgLT4g0YfQtdC60LDRgtGMINC90LUg0LjRgdC/0L7Qu9GM0LfRg9C10YLRgdGPINC70Lgg0LPQtNC1LdGC0L4g0LXQvdCw0Lwg0Lgg0YHQvdCw0YfQsNC70LAg0YDQsNC90LjRgtGMINC80LjQs9GA0LDRhtC40Lgg0Lgg0LIg0YHQsNC80L7QvCDQutC+0L3RhtC1INGD0LTQsNC70LXQvdC40LUg0LXQvdCw0LzQsOKPs1xuICAvLyAvLyAtINGD0LTQsNC70LXQvdC40LUg0LLRjdC70YzRjiDQuNC3INC10L3QsNC80LAgLT4g0LHQu9C+0Log4p2MXG4gIC8vIGNvbnN0IGVudW1zID0gcmVzdWx0LmFkZGVkRW51bXMubWFwKGl0ID0+IHtcbiAgLy8gICByZXR1cm4gcHJlcGFyZUNyZWF0ZUVudW0oaXQubmFtZSwgaXQudmFsdWVzKVxuICAvLyB9KVxuXG4gIGNvbnN0IGNyZWF0ZUVudW1zID0gZGlmZi5hZGRlZEVudW1zLm1hcChpdCA9PiB7XG4gICAgcmV0dXJuIHByZXBhcmVDcmVhdGVFbnVtSnNvbihpdC5uYW1lLCBpdC52YWx1ZXMpXG4gIH0pXG5cbiAgLy90b2RvOiBibG9jayBlbnVtIHJlbmFtZSwgZW51bSB2YWx1ZSByZW5hbWUgYW5kIGVudW4gZGVsZXRpb24gZm9yIG5vd1xuICBjb25zdCBqc29uQWx0ZXJFbnVtc1dpdGhBZGRlZFZhbHVlcyA9IGRpZmYuYWx0ZXJlZEVudW1zLm1hcChpdCA9PiB7XG4gICAgcmV0dXJuIHByZXBhcmVBZGRWYWx1ZXNUb0VudW1Kc29uKGl0Lm5hbWUsIGl0LmFkZGVkVmFsdWVzKVxuICB9KS5mbGF0KClcblxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmNyZWF0ZUVudW1zKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25BbHRlckVudW1zV2l0aEFkZGVkVmFsdWVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25DcmVhdGVUYWJsZXMpXG4gIGpzb25TdGF0ZW1lbnRzLnB1c2goLi4uanNvbkNyZWF0ZUluZGV4ZXNGb3JDcmVhdGVkVGFibGVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25Ecm9wVGFibGVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25SZW5hbWVUYWJsZXMpXG4gIGpzb25TdGF0ZW1lbnRzLnB1c2goLi4uanNvbkFsdGVyVGFibGVzKVxuICBqc29uU3RhdGVtZW50cy5wdXNoKC4uLmpzb25DcmVhdGVJbmRleGVzRm9yQWxsQWx0ZXJlZFRhYmxlcylcbiAganNvblN0YXRlbWVudHMucHVzaCguLi5qc29uRHJvcEluZGV4ZXNGb3JBbGxBbHRlcmVkVGFibGVzKVxuXG4gIC8vIGNvbnNvbGUubG9nKEpTT04uc3RyaW5naWZ5KGpzb25TdGF0ZW1lbnRzLCBudWxsLCAyKSlcbiAgLy8gY29uc29sZS5sb2coanNvblN0YXRlbWVudHMpXG5cbiAgY29uc3Qgc3FsU3RhdGVtZW50cyA9IGZyb21Kc29uKGpzb25TdGF0ZW1lbnRzKVxuICBjb25zb2xlLmxvZyhzcWxTdGF0ZW1lbnRzLmpvaW4oJ1xcbicpKVxuXG4gIC8vIHRvZG86IHNhdmUgcmVzdWx0cyB0byBhIG5ldyBtaWdyYXRpb24gZm9sZGVyXG4gIGNvbnN0IGRhdGUgPSBuZXcgRGF0ZSgpXG4gIC8vIGNvbnN0IGZvbGRlck5hbWUgPSBgJHtkYXRlLmdldEZ1bGxZZWFyKCl9LSR7dHdvKGRhdGUuZ2V0TW9udGgoKSl9LSR7dHdvKGRhdGUuZ2V0RGF0ZSgpKX0gJHt0d28oZGF0ZS5nZXRIb3VycygpKX06JHt0d28oZGF0ZS5nZXRNaW51dGVzKCkpfToke3R3byhkYXRlLmdldFNlY29uZHMoKSl9YFxuICBjb25zdCBmb2xkZXJOYW1lID0gZGF0ZS50b0lTT1N0cmluZygpXG4gIGNvbnN0IG1pZ3JhdGlvbkZvbGRlclBhdGggPSBgLi8ke21pZ3JhdGlvblJvb3RGb2xkZXJ9LyR7Zm9sZGVyTmFtZX1gXG4gIGZzLm1rZGlyU3luYyhtaWdyYXRpb25Gb2xkZXJQYXRoKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke21pZ3JhdGlvbkZvbGRlclBhdGh9L3NuYXBzaG90Lmpzb25gLCBKU09OLnN0cmluZ2lmeShjdXIsIG51bGwsIDIpKVxuICBmcy53cml0ZUZpbGVTeW5jKGAke21pZ3JhdGlvbkZvbGRlclBhdGh9L21pZ3JhdGlvbi5zcWxgLCBzcWxTdGF0ZW1lbnRzLmpvaW4oJ1xcbicpKVxuXG59O1xuXG5leHBvcnQgZGVmYXVsdCBtaWdyYXRlO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHVzZVNuYXBzaG90IH0gZnJvbSAndmFsdGlvJztcblxuaW50ZXJmYWNlIFByb3BzIHtcbiAgY29tcG9uZW50c0xpc3Q6IFJlYWN0LlJlYWN0RWxlbWVudDxhbnksIGFueT5bXTtcbn1cblxuY29uc3QgQ29tcG9uZW50c0xpc3Q6IFJlYWN0LkZDPFByb3BzPiA9ICh7XG4gIGNvbXBvbmVudHNMaXN0LFxufSkgPT4ge1xuICB1c2VTbmFwc2hvdChjb21wb25lbnRzTGlzdCk7XG5cbiAgcmV0dXJuIChcbiAgICA8PlxuICAgICAge2NvbXBvbmVudHNMaXN0Lm1hcCgoY29tcG9uZW50LCBpKSA9PiAoeyAuLi5jb21wb25lbnQsIGtleTogaSB9KSl9XG4gICAgPC8+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBDb21wb25lbnRzTGlzdDtcbiIsImltcG9ydCB7IHJlbmRlciB9IGZyb20gJ2luayc7XG5pbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuXG5pbXBvcnQgQ29tcG9uZW50c0xpc3QgZnJvbSAnY2xpL2NvbXBvbmVudHMtYXBpL0NvbXBvbmVudHNMaXN0JztcblxuY29uc3QgY3JlYXRlQXBwID0gKGNvbXBvbmVudHNMaXN0OiBSZWFjdC5SZWFjdEVsZW1lbnQ8YW55LCBhbnk+W10pID0+IHtcbiAgY29uc3QgaW5rQXBwID0gcmVuZGVyKDxDb21wb25lbnRzTGlzdCBjb21wb25lbnRzTGlzdD17Y29tcG9uZW50c0xpc3R9IC8+KTtcblxuICByZXR1cm4ge1xuICAgIHJlbW92ZSgpIHtcbiAgICAgIGlua0FwcC5yZXJlbmRlcihudWxsKTtcbiAgICAgIGlua0FwcC51bm1vdW50KCk7XG4gICAgICBpbmtBcHAuY2xlYXIoKTtcbiAgICAgIGlua0FwcC5jbGVhbnVwKCk7XG4gICAgfSxcbiAgfTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZUFwcDtcbiIsImltcG9ydCBSZWFjdCBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCb3gsIFRleHQgfSBmcm9tICdpbmsnO1xuaW1wb3J0IFNlbGVjdElucHV0IGZyb20gJ2luay1zZWxlY3QtaW5wdXQnO1xuaW1wb3J0IFRhYmxlLCB7IEhlYWRlciB9IGZyb20gJ2luay10YWJsZSc7XG5pbXBvcnQgeyB1c2VNYWNoaW5lIH0gZnJvbSAnQHhzdGF0ZS9yZWFjdCc7XG5pbXBvcnQgeyBJdGVtIH0gZnJvbSAnaW5rLXNlbGVjdC1pbnB1dC9idWlsZC9TZWxlY3RJbnB1dCc7XG5cbmltcG9ydCB7IENvbHVtbnNSZXN1bHREYXRhLCBOYW1lZCB9IGZyb20gJ2NsaS9jb21tYW5kcy9taWdyYXRpb24vbWlncmF0ZSc7XG5pbXBvcnQgZm9ybWF0RGF0YUZvclRhYmxlIGZyb20gJ2NsaS91dGlscy9mb3JtYXREYXRhRm9yVGFibGUnO1xuaW1wb3J0IHtcbiAgQWN0aW9uLFxuICBDb25maXJtYXRpb24sXG4gIGFjdGlvbnMsXG4gIGNvbmZpcm1hdGlvbnMsXG59IGZyb20gJ2NsaS91dGlscy92YWx1ZXNGb3JQcm9tcHRzJztcbmltcG9ydCBjcmVhdGVSZXNvbHZlQ29sdW1uc01hY2hpbmUsIHsgVGFibGVXaXRoQ29sdW1uIH0gZnJvbSAnY2xpL21hY2hpbmVzL3Jlc29sdmVDb2x1bW5zTWFjaGluZSc7XG5cbmludGVyZmFjZSBQcm9wcyB7XG4gIG9uRG9uZTogKHZhbHVlOiBDb2x1bW5zUmVzdWx0RGF0YTxOYW1lZD4pID0+IHZvaWRcbiAgdGFibGVXaXRoQ29sdW1uczogVGFibGVXaXRoQ29sdW1uLFxufVxuXG5jb25zdCBQcm9tcHRDb2x1bW5zQ29uZmxpY3RzOiBSZWFjdC5GQzxQcm9wcz4gPSAoe1xuICBvbkRvbmUsXG4gIHRhYmxlV2l0aENvbHVtbnM6IHByb3BzLFxufSkgPT4ge1xuICBjb25zdCBbY3VycmVudCwgc2VuZF0gPSB1c2VNYWNoaW5lKFxuICAgIGNyZWF0ZVJlc29sdmVDb2x1bW5zTWFjaGluZSh7IHRhYmxlV2l0aENvbHVtbnM6IHByb3BzIH0pLFxuICApO1xuXG4gIGNvbnN0IHtcbiAgICB0YWJsZU5hbWUsXG4gICAgYWRkZWRDb2x1bW5zLFxuICAgIGRlbGV0ZWRDb2x1bW5zLFxuICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgY3JlYXRlZCxcbiAgICByZW5hbWVkLFxuICAgIGRlbGV0ZWQsXG4gIH0gPSBjdXJyZW50LmNvbnRleHQ7XG5cbiAgY29uc3Qgc2VsZWN0SXRlbUluZGV4ID0gKGl0ZW06IEl0ZW08bnVtYmVyPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiAnQ0hPSUNFX0lURU0nLCBpdGVtSW5kZXg6IGl0ZW0udmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZWN0TmV3SXRlbUluZGV4ID0gKGl0ZW06IEl0ZW08bnVtYmVyPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiAnQ0hPSUNFX05FV19JVEVNJywgaXRlbUluZGV4OiBpdGVtLnZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHNlbGVjdEFjdGlvbiA9IChhY3Rpb246IEl0ZW08QWN0aW9uPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiBhY3Rpb24udmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3QgY29uZmlybSA9IChjb25maXJtYXRpb25JdGVtOiBJdGVtPENvbmZpcm1hdGlvbj4pID0+IHtcbiAgICBzZW5kKHsgdHlwZTogY29uZmlybWF0aW9uSXRlbS52YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCByZW5kZXJET00gPSAoKSA9PiB7XG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygndGFibGUnKSkge1xuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8Qm94IGRpc3BsYXk9XCJmbGV4XCIgZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiPlxuICAgICAgICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICA8SGVhZGVyPntgVGFibGUgXCIke3RhYmxlTmFtZX1cIiBtaXNzaW5nIGNvbHVtbnM6YH08L0hlYWRlcj5cbiAgICAgICAgICAgICAgICA8U2VsZWN0SW5wdXRcbiAgICAgICAgICAgICAgICAgIGl0ZW1zPXtkZWxldGVkQ29sdW1ucyEubWFwKChjb2x1bW4sIGk6IG51bWJlcikgPT4gKHtcbiAgICAgICAgICAgICAgICAgICAga2V5OiBTdHJpbmcoaSksXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICAgICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgICAgICAgICB9KSl9XG4gICAgICAgICAgICAgICAgICBvblNlbGVjdD17c2VsZWN0SXRlbUluZGV4fVxuICAgICAgICAgICAgICAgIC8+XG4gICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICB7ISFhZGRlZENvbHVtbnM/Lmxlbmd0aCAmJiAoXG4gICAgICAgICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgcGFkZGluZ0xlZnQ9ezV9PlxuICAgICAgICAgICAgICAgICAgPEhlYWRlcj5OZXcgdGFibGVzOjwvSGVhZGVyPlxuICAgICAgICAgICAgICAgICAgPEJveCBkaXNwbGF5PVwiZmxleFwiIGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIj5cbiAgICAgICAgICAgICAgICAgICAge2FkZGVkQ29sdW1ucy5tYXAoKHsgbmFtZSB9LCBpKSA9PiA8VGV4dCBrZXk9e25hbWUgKyBpfT57bmFtZX08L1RleHQ+KX1cbiAgICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgICAgICApfVxuICAgICAgICAgICAgPC9Cb3g+XG4gICAgICAgICAgPC9Cb3g+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdhY3Rpb24uYWN0aW9uQ2hvaWNlJykpIHtcbiAgICAgIGNvbnN0IHRlbXBBY3Rpb25zID0gIWFkZGVkQ29sdW1ucyEubGVuZ3RoXG4gICAgICAgID8gYWN0aW9ucy5maWx0ZXIoKHsgdmFsdWUgfSkgPT4gdmFsdWUgIT09IEFjdGlvbi5SRU5BTUUpXG4gICAgICAgIDogYWN0aW9ucztcblxuICAgICAgcmV0dXJuIChcbiAgICAgICAgPD5cbiAgICAgICAgICA8SGVhZGVyPntgJHtkZWxldGVkQ29sdW1ucyFbbWlzc2luZ0l0ZW1JbmRleF0/Lm5hbWV9IGlzOmB9PC9IZWFkZXI+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXt0ZW1wQWN0aW9uc30gb25TZWxlY3Q9e3NlbGVjdEFjdGlvbn0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2NvbmZpcm1hdGlvbkRlbGV0ZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxIZWFkZXI+ISEhIERhdGEgaW4gdGFibGUgd2lsbCBiZSBsb3N0ICEhITwvSGVhZGVyPlxuICAgICAgICAgIDxUZXh0PkFyZSB5b3Ugc3VyZT88L1RleHQ+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXtjb25maXJtYXRpb25zfSBvblNlbGVjdD17Y29uZmlybX0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2NvbmZpcm1hdGlvblJlbmFtZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxIZWFkZXI+QXJlIHlvdSBzdXJlPzwvSGVhZGVyPlxuICAgICAgICAgIDxTZWxlY3RJbnB1dCBpdGVtcz17Y29uZmlybWF0aW9uc30gb25TZWxlY3Q9e2NvbmZpcm19IC8+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdhY3Rpb24ucmVuYW1lJykpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEhlYWRlcj57YCR7ZGVsZXRlZENvbHVtbnMhW21pc3NpbmdJdGVtSW5kZXhdPy5uYW1lfSB3YXMgcmVuYW1lZCB0bzpgfTwvSGVhZGVyPlxuICAgICAgICAgIDxTZWxlY3RJbnB1dFxuICAgICAgICAgICAgaXRlbXM9e2FkZGVkQ29sdW1ucyEubWFwKCh0YWJsZSwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICBrZXk6IFN0cmluZyhpKSxcbiAgICAgICAgICAgICAgbGFiZWw6IHRhYmxlLm5hbWUsXG4gICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgfSkpfVxuICAgICAgICAgICAgb25TZWxlY3Q9e3NlbGVjdE5ld0l0ZW1JbmRleH1cbiAgICAgICAgICAvPlxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygnZG9uZScpKSB7XG4gICAgICBvbkRvbmUoeyBjcmVhdGVkLCByZW5hbWVkLCBkZWxldGVkIH0pO1xuICAgIH1cblxuICAgIHJldHVybiAoPD48Lz4pO1xuICB9O1xuXG4gIHJldHVybiAoISFkZWxldGVkLmxlbmd0aFxuICAgICAgfHwgISFyZW5hbWVkLmxlbmd0aFxuICAgICAgfHwgISFjcmVhdGVkLmxlbmd0aCkgPyAoXG4gICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpbj17MX0+XG4gICAgICAgICAgPEJveCBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCIgbWFyZ2luQm90dG9tPXswfT5cbiAgICAgICAgICAgIDxIZWFkZXI+e2Ake3RhYmxlTmFtZX0gY29sdW1uczpgfTwvSGVhZGVyPlxuICAgICAgICAgICAgPFRhYmxlXG4gICAgICAgICAgICAgIGRhdGE9e2Zvcm1hdERhdGFGb3JUYWJsZShbXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdEZWxldGVkJyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlczogZGVsZXRlZCxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnUmVuYW1lZCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZXM6IHJlbmFtZWQsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0NyZWF0ZWQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWVzOiBjcmVhdGVkLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgIF0pfVxuICAgICAgICAgICAgLz5cbiAgICAgICAgICA8L0JveD5cbiAgICAgICAgICB7cmVuZGVyRE9NKCl9XG4gICAgICAgIDwvQm94PlxuICAgICkgOiByZW5kZXJET00oKTtcbn07XG5cbmV4cG9ydCBkZWZhdWx0IFByb21wdENvbHVtbnNDb25mbGljdHM7XG4iLCJpbXBvcnQgUmVhY3QgZnJvbSAncmVhY3QnO1xuaW1wb3J0IHsgQm94LCBUZXh0IH0gZnJvbSAnaW5rJztcbmltcG9ydCBTZWxlY3RJbnB1dCBmcm9tICdpbmstc2VsZWN0LWlucHV0JztcbmltcG9ydCBUYWJsZSwgeyBIZWFkZXIgfSBmcm9tICdpbmstdGFibGUnO1xuaW1wb3J0IHsgdXNlTWFjaGluZSB9IGZyb20gJ0B4c3RhdGUvcmVhY3QnO1xuaW1wb3J0IHsgSXRlbSB9IGZyb20gJ2luay1zZWxlY3QtaW5wdXQvYnVpbGQvU2VsZWN0SW5wdXQnO1xuXG5pbXBvcnQgeyBOYW1lZCwgVGFibGVzUmVzdWx0RGF0YSB9IGZyb20gJ2NsaS9jb21tYW5kcy9taWdyYXRpb24vbWlncmF0ZSc7XG5pbXBvcnQgY3JlYXRlUmVzb2x2ZVRhYmxlc01hY2hpbmUgZnJvbSAnY2xpL21hY2hpbmVzL3Jlc29sdmVUYWJsZXNNYWNoaW5lJztcbmltcG9ydCBmb3JtYXREYXRhRm9yVGFibGUgZnJvbSAnY2xpL3V0aWxzL2Zvcm1hdERhdGFGb3JUYWJsZSc7XG5pbXBvcnQge1xuICBBY3Rpb24sXG4gIENvbmZpcm1hdGlvbixcbiAgYWN0aW9ucyxcbiAgY29uZmlybWF0aW9ucyxcbn0gZnJvbSAnY2xpL3V0aWxzL3ZhbHVlc0ZvclByb21wdHMnO1xuXG5leHBvcnQgaW50ZXJmYWNlIFJlbmRlclRhYmxlc1NlbGVjdFByb3BzPFQgZXh0ZW5kcyBOYW1lZD4ge1xuICBtaXNzaW5nVGFibGVzOiBUW10sXG4gIG5ld1RhYmxlczogVFtdLFxufVxuXG5pbnRlcmZhY2UgUHJvcHM8VCBleHRlbmRzIE5hbWVkPiBleHRlbmRzIFJlbmRlclRhYmxlc1NlbGVjdFByb3BzPFQ+IHtcbiAgb25Eb25lOiAodmFsdWU6IFRhYmxlc1Jlc3VsdERhdGE8VD4pID0+IHZvaWQ7XG59XG5cbmNvbnN0IFByb21wdFRhYmxlc0NvbmZsaWN0czogUmVhY3QuRkM8UHJvcHM8YW55Pj4gPSAoe1xuICBvbkRvbmUsXG4gIG5ld1RhYmxlczogbmV3UHJvcHMsXG4gIG1pc3NpbmdUYWJsZXM6IG1pc3NpbmdQcm9wcyxcbn0pID0+IHtcbiAgY29uc3QgW2N1cnJlbnQsIHNlbmRdID0gdXNlTWFjaGluZShjcmVhdGVSZXNvbHZlVGFibGVzTWFjaGluZSh7XG4gICAgbWlzc2luZ1RhYmxlczogbWlzc2luZ1Byb3BzLFxuICAgIG5ld1RhYmxlczogbmV3UHJvcHMsXG4gIH0pKTtcblxuICBjb25zdCB7XG4gICAgbWlzc2luZ0l0ZW1JbmRleCxcbiAgICBuZXdUYWJsZXMsXG4gICAgbWlzc2luZ1RhYmxlcyxcbiAgICBjcmVhdGVkVGFibGVzLFxuICAgIHJlbmFtZWRUYWJsZXMsXG4gICAgZGVsZXRlZFRhYmxlcyxcbiAgfSA9IGN1cnJlbnQuY29udGV4dDtcblxuICBjb25zdCBzZWxlY3RJdGVtSW5kZXggPSAoaXRlbTogSXRlbTxudW1iZXI+KSA9PiB7XG4gICAgc2VuZCh7IHR5cGU6ICdDSE9JQ0VfSVRFTScsIGl0ZW1JbmRleDogaXRlbS52YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBzZWxlY3ROZXdJdGVtSW5kZXggPSAoaXRlbTogSXRlbTxudW1iZXI+KSA9PiB7XG4gICAgc2VuZCh7IHR5cGU6ICdDSE9JQ0VfTkVXX0lURU0nLCBpdGVtSW5kZXg6IGl0ZW0udmFsdWUgfSk7XG4gIH07XG5cbiAgY29uc3Qgc2VsZWN0QWN0aW9uID0gKGFjdGlvbjogSXRlbTxBY3Rpb24+KSA9PiB7XG4gICAgc2VuZCh7IHR5cGU6IGFjdGlvbi52YWx1ZSB9KTtcbiAgfTtcblxuICBjb25zdCBjb25maXJtID0gKGNvbmZpcm1hdGlvbkl0ZW06IEl0ZW08Q29uZmlybWF0aW9uPikgPT4ge1xuICAgIHNlbmQoeyB0eXBlOiBjb25maXJtYXRpb25JdGVtLnZhbHVlIH0pO1xuICB9O1xuXG4gIGNvbnN0IHJlbmRlckRPTSA9ICgpID0+IHtcbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCd0YWJsZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICA8Qm94IGRpc3BsYXk9XCJmbGV4XCI+XG4gICAgICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiPlxuICAgICAgICAgICAgICAgIDxIZWFkZXI+TWlzc2luZyB0YWJsZXM6PC9IZWFkZXI+XG4gICAgICAgICAgICAgICAgPFNlbGVjdElucHV0XG4gICAgICAgICAgICAgICAgICBpdGVtcz17bWlzc2luZ1RhYmxlcyEubWFwKCh0YWJsZSwgaTogbnVtYmVyKSA9PiAoe1xuICAgICAgICAgICAgICAgICAgICBrZXk6IFN0cmluZyhpKSxcbiAgICAgICAgICAgICAgICAgICAgbGFiZWw6IHRhYmxlLm5hbWUsXG4gICAgICAgICAgICAgICAgICAgIHZhbHVlOiBpLFxuICAgICAgICAgICAgICAgICAgfSkpfVxuICAgICAgICAgICAgICAgICAgb25TZWxlY3Q9e3NlbGVjdEl0ZW1JbmRleH1cbiAgICAgICAgICAgICAgICAvPlxuICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICAgeyEhbmV3VGFibGVzPy5sZW5ndGggJiYgKFxuICAgICAgICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIHBhZGRpbmdMZWZ0PXs1fT5cbiAgICAgICAgICAgICAgICAgIDxIZWFkZXI+TmV3IHRhYmxlczo8L0hlYWRlcj5cbiAgICAgICAgICAgICAgICAgIDxCb3ggZGlzcGxheT1cImZsZXhcIiBmbGV4RGlyZWN0aW9uPVwiY29sdW1uXCI+XG4gICAgICAgICAgICAgICAgICAgIHtuZXdUYWJsZXMubWFwKCh7IG5hbWUgfSwgaSkgPT4gPFRleHQga2V5PXtuYW1lICsgaX0+e25hbWV9PC9UZXh0Pil9XG4gICAgICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICAgICA8L0JveD5cbiAgICAgICAgICAgICAgKX1cbiAgICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICA8Lz5cbiAgICAgICk7XG4gICAgfVxuXG4gICAgaWYgKGN1cnJlbnQubWF0Y2hlcygnYWN0aW9uLmFjdGlvbkNob2ljZScpKSB7XG4gICAgICBjb25zdCB0ZW1wQWN0aW9ucyA9ICFuZXdUYWJsZXMhLmxlbmd0aFxuICAgICAgICA/IGFjdGlvbnMuZmlsdGVyKCh7IHZhbHVlIH0pID0+IHZhbHVlICE9PSBBY3Rpb24uUkVOQU1FKVxuICAgICAgICA6IGFjdGlvbnM7XG5cbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEhlYWRlcj57YCR7bWlzc2luZ1RhYmxlcyFbbWlzc2luZ0l0ZW1JbmRleF0/Lm5hbWV9IGlzOmB9PC9IZWFkZXI+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXt0ZW1wQWN0aW9uc30gb25TZWxlY3Q9e3NlbGVjdEFjdGlvbn0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2NvbmZpcm1hdGlvbkRlbGV0ZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxIZWFkZXI+ISEhIERhdGEgaW4gdGFibGUgd2lsbCBiZSBsb3N0ICEhITwvSGVhZGVyPlxuICAgICAgICAgIDxUZXh0PkFyZSB5b3Ugc3VyZT88L1RleHQ+XG4gICAgICAgICAgPFNlbGVjdElucHV0IGl0ZW1zPXtjb25maXJtYXRpb25zfSBvblNlbGVjdD17Y29uZmlybX0gLz5cbiAgICAgICAgPC8+XG4gICAgICApO1xuICAgIH1cblxuICAgIGlmIChjdXJyZW50Lm1hdGNoZXMoJ2NvbmZpcm1hdGlvblJlbmFtZScpKSB7XG4gICAgICByZXR1cm4gKFxuICAgICAgICA8PlxuICAgICAgICAgIDxIZWFkZXI+QXJlIHlvdSBzdXJlPzwvSGVhZGVyPlxuICAgICAgICAgIDxTZWxlY3RJbnB1dCBpdGVtcz17Y29uZmlybWF0aW9uc30gb25TZWxlY3Q9e2NvbmZpcm19IC8+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdhY3Rpb24ucmVuYW1lJykpIHtcbiAgICAgIHJldHVybiAoXG4gICAgICAgIDw+XG4gICAgICAgICAgPEhlYWRlcj57YCR7bWlzc2luZ1RhYmxlcyFbbWlzc2luZ0l0ZW1JbmRleF0/Lm5hbWV9IHdhcyByZW5hbWVkIHRvOmB9PC9IZWFkZXI+XG4gICAgICAgICAgPFNlbGVjdElucHV0XG4gICAgICAgICAgICBpdGVtcz17bmV3VGFibGVzIS5tYXAoKHRhYmxlLCBpOiBudW1iZXIpID0+ICh7XG4gICAgICAgICAgICAgIGtleTogU3RyaW5nKGkpLFxuICAgICAgICAgICAgICBsYWJlbDogdGFibGUubmFtZSxcbiAgICAgICAgICAgICAgdmFsdWU6IGksXG4gICAgICAgICAgICB9KSl9XG4gICAgICAgICAgICBvblNlbGVjdD17c2VsZWN0TmV3SXRlbUluZGV4fVxuICAgICAgICAgIC8+XG4gICAgICAgIDwvPlxuICAgICAgKTtcbiAgICB9XG5cbiAgICBpZiAoY3VycmVudC5tYXRjaGVzKCdkb25lJykpIHtcbiAgICAgIG9uRG9uZSh7XG4gICAgICAgIGNyZWF0ZWQ6IGNyZWF0ZWRUYWJsZXMsXG4gICAgICAgIHJlbmFtZWQ6IHJlbmFtZWRUYWJsZXMsXG4gICAgICAgIGRlbGV0ZWQ6IGRlbGV0ZWRUYWJsZXMsXG4gICAgICB9KTtcbiAgICB9XG5cbiAgICByZXR1cm4gKDw+PC8+KTtcbiAgfTtcblxuICByZXR1cm4gKCEhZGVsZXRlZFRhYmxlcy5sZW5ndGhcbiAgICAgIHx8ICEhcmVuYW1lZFRhYmxlcy5sZW5ndGhcbiAgICAgIHx8ICEhY3JlYXRlZFRhYmxlcy5sZW5ndGgpID8gKFxuICAgICAgICA8Qm94IGZsZXhEaXJlY3Rpb249XCJjb2x1bW5cIiBtYXJnaW49ezF9PlxuICAgICAgICAgIDxCb3ggZmxleERpcmVjdGlvbj1cImNvbHVtblwiIG1hcmdpbkJvdHRvbT17MH0+XG4gICAgICAgICAgICA8SGVhZGVyPlRhYmxlczogPC9IZWFkZXI+XG4gICAgICAgICAgICA8VGFibGVcbiAgICAgICAgICAgICAgZGF0YT17Zm9ybWF0RGF0YUZvclRhYmxlKFtcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICB0aXRsZTogJ0RlbGV0ZWQnLFxuICAgICAgICAgICAgICAgICAgdmFsdWVzOiBkZWxldGVkVGFibGVzLFxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgICAgdGl0bGU6ICdSZW5hbWVkJyxcbiAgICAgICAgICAgICAgICAgIHZhbHVlczogcmVuYW1lZFRhYmxlcyxcbiAgICAgICAgICAgICAgICB9LFxuICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgIHRpdGxlOiAnQ3JlYXRlZCcsXG4gICAgICAgICAgICAgICAgICB2YWx1ZXM6IGNyZWF0ZWRUYWJsZXMsXG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgXSl9XG4gICAgICAgICAgICAvPlxuICAgICAgICAgIDwvQm94PlxuICAgICAgICAgIHtyZW5kZXJET00oKX1cbiAgICAgICAgPC9Cb3g+XG4gICAgKSA6IHJlbmRlckRPTSgpO1xufTtcblxuZXhwb3J0IGRlZmF1bHQgUHJvbXB0VGFibGVzQ29uZmxpY3RzO1xuIiwiaW1wb3J0IFJlYWN0LCB7IHVzZUVmZmVjdCwgdXNlU3RhdGUgfSBmcm9tICdyZWFjdCc7XG5pbXBvcnQgeyBCb3gsIE5ld2xpbmUsIFRleHQgfSBmcm9tICdpbmsnO1xuaW1wb3J0IFNwaW5uZXIgZnJvbSAnaW5rLXNwaW5uZXInO1xuaW1wb3J0IHsgQ3JlYXRlVGFza1BhcmFtcyB9IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaS9pbmRleCc7XG5cbmVudW0gU3RlcFN0YXRlIHtcbiAgSU5fUFJPR1JFU1MsXG4gIFNVQ0NFU1MsXG4gIEZBSUxcbn1cblxuZXhwb3J0IGludGVyZmFjZSBDYWxsYmFja1Byb3BzIHtcbiAgc2V0VGl0bGU6IFJlYWN0LkRpc3BhdGNoPFJlYWN0LlNldFN0YXRlQWN0aW9uPHN0cmluZz4+XG4gIHNldEVycm9yOiBSZWFjdC5EaXNwYXRjaDxSZWFjdC5TZXRTdGF0ZUFjdGlvbjxhbnk+PlxufVxuXG5pbnRlcmZhY2UgUHJvcHM8VD4ge1xuICBmdW5jOiAocHJvcHM6IENhbGxiYWNrUHJvcHMpID0+IFQ7XG4gIG9uRG9uZTogKHJlc3VsdDogVCkgPT4gVDtcbiAgdGl0bGVTdHI6IHN0cmluZztcbn1cblxuY29uc3QgVGFzazogUmVhY3QuRkM8UHJvcHM8YW55Pj4gPSA8VCBleHRlbmRzIHVua25vd24+KHByb3BzOiBQcm9wczxUPikgPT4ge1xuICBjb25zdCB7XG4gICAgZnVuYyxcbiAgICBvbkRvbmUsXG4gICAgdGl0bGVTdHIsXG4gIH0gPSBwcm9wcztcbiAgY29uc3QgW3RpdGxlLCBzZXRUaXRsZV0gPSB1c2VTdGF0ZTxzdHJpbmc+KHRpdGxlU3RyKTtcbiAgY29uc3QgW3N0YXRlLCBzZXRTdGF0ZV0gPSB1c2VTdGF0ZTxTdGVwU3RhdGU+KFN0ZXBTdGF0ZS5JTl9QUk9HUkVTUyk7XG4gIGNvbnN0IFtlcnJvciwgc2V0RXJyb3JdID0gdXNlU3RhdGU8YW55PihudWxsKTtcblxuICB1c2VFZmZlY3QoKCkgPT4ge1xuICAgIChhc3luYyAoKSA9PiB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCByZXN1bHQgPSBhd2FpdCBmdW5jKHsgc2V0VGl0bGUsIHNldEVycm9yIH0pO1xuICAgICAgICBzZXRTdGF0ZShTdGVwU3RhdGUuU1VDQ0VTUyk7XG4gICAgICAgIG9uRG9uZShyZXN1bHQpO1xuICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBzZXRFcnJvcihlKTtcbiAgICAgICAgc2V0U3RhdGUoU3RlcFN0YXRlLkZBSUwpO1xuICAgICAgfVxuICAgIH0pKCk7XG4gIH0sIFtdKTtcblxuICByZXR1cm4gKFxuICAgIDxCb3ggZmxleERpcmVjdGlvbj1cInJvd1wiPlxuICAgICAgPEJveCBtYXJnaW5SaWdodD17MX0+XG4gICAgICAgIHtzdGF0ZSA9PT0gU3RlcFN0YXRlLklOX1BST0dSRVNTID8gKFxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgPFNwaW5uZXIgdHlwZT1cImRvdHNcIiAvPlxuICAgICAgICAgICAgXVxuICAgICAgICAgIDwvVGV4dD5cbiAgICAgICAgKSA6IHN0YXRlID09PSBTdGVwU3RhdGUuU1VDQ0VTUyA/IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIFtcbiAgICAgICAgICAgIDxUZXh0IGNvbG9yPVwiZ3JlZW5cIj7inJM8L1RleHQ+XG4gICAgICAgICAgICBdXG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDxUZXh0PlxuICAgICAgICAgICAgW1xuICAgICAgICAgICAgPFRleHQgY29sb3I9XCJyZWRcIj7DlzwvVGV4dD5cbiAgICAgICAgICAgIF1cbiAgICAgICAgICA8L1RleHQ+XG4gICAgICAgICl9XG5cbiAgICAgICAge3N0YXRlID09PSBTdGVwU3RhdGUuRkFJTCA/IChcbiAgICAgICAgICA8VGV4dD5cbiAgICAgICAgICAgIHt0aXRsZX1cbiAgICAgICAgICAgIDxOZXdsaW5lIC8+XG4gICAgICAgICAgICA8VGV4dCBjb2xvcj1cInJlZFwiPntlcnJvciEubWVzc2FnZX08L1RleHQ+XG4gICAgICAgICAgPC9UZXh0PlxuICAgICAgICApIDogKFxuICAgICAgICAgIDw+XG4gICAgICAgICAgICA8VGV4dD57dGl0bGV9PC9UZXh0PlxuICAgICAgICAgIDwvPlxuICAgICAgICApfVxuICAgICAgPC9Cb3g+XG4gICAgPC9Cb3g+XG4gICk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBUYXNrO1xuIiwiaW1wb3J0IFJlYWN0IGZyb20gJ3JlYWN0JztcbmltcG9ydCB7IHByb3h5IH0gZnJvbSAndmFsdGlvJztcblxuaW1wb3J0IHtcbiAgQ29sdW1uc1Jlc3VsdERhdGEsXG4gIE5hbWVkLFxuICBUYWJsZXNSZXN1bHREYXRhLFxufSBmcm9tICdjbGkvY29tbWFuZHMvbWlncmF0aW9uL21pZ3JhdGUnO1xuaW1wb3J0IFRhc2ssIHsgQ2FsbGJhY2tQcm9wcyB9IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaS9jb21wb25lbnRzL1Rhc2snO1xuaW1wb3J0IGNyZWF0ZUFwcCBmcm9tICdjbGkvY29tcG9uZW50cy1hcGkvQ3JlYXRlQXBwJztcbmltcG9ydCB7IFRhYmxlV2l0aENvbHVtbiB9IGZyb20gJ2NsaS9tYWNoaW5lcy9yZXNvbHZlQ29sdW1uc01hY2hpbmUnO1xuaW1wb3J0IFByb21wdFRhYmxlc0NvbmZsaWN0cywgeyBSZW5kZXJUYWJsZXNTZWxlY3RQcm9wcyB9IGZyb20gJ2NsaS9jb21wb25lbnRzLWFwaS9jb21wb25lbnRzL1Byb21wdFRhYmxlc0NvbmZsaWN0cyc7XG5pbXBvcnQgUHJvbXB0Q29sdW1uc0NvbmZsaWN0cyBmcm9tICdjbGkvY29tcG9uZW50cy1hcGkvY29tcG9uZW50cy9Qcm9tcHRDb2x1bW5zQ29uZmxpY3RzJztcblxuY29uc3QgY29tcG9uZW50c0xpc3QgPSBwcm94eTxSZWFjdC5SZWFjdEVsZW1lbnQ8YW55LCBhbnk+W10+KFtdKTtcbmxldCBhcHA6IFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUFwcD47XG5cbmV4cG9ydCBpbnRlcmZhY2UgQ3JlYXRlVGFza1BhcmFtczxJbiwgQ2JzPiB7XG4gIGlucHV0OiBJbixcbiAgcnVuOiAoY2JzOiBDYnMpID0+IHZvaWRcbn1cblxuY29uc3QgcHJlcGFyZUFwcCA9ICgpID0+IHtcbiAgaWYgKCFhcHApIHtcbiAgICBhcHAgPSBjcmVhdGVBcHAoY29tcG9uZW50c0xpc3QpO1xuICAgIGNvbXBvbmVudHNMaXN0Lmxlbmd0aCA9IDA7XG4gIH1cbn07XG5cbmV4cG9ydCBjb25zdCB0YXNrID0gPFQgZXh0ZW5kcyB1bmtub3duPihcbiAgdGl0bGVTdHI6IHN0cmluZyxcbiAgZnVuYzogKHByb3BzOiBDYWxsYmFja1Byb3BzKSA9PiBULFxuKSA9PiBuZXcgUHJvbWlzZTxUPigoXG4gICAgcmVzb2x2ZSxcbiAgKSA9PiB7XG4gICAgcHJlcGFyZUFwcCgpO1xuXG4gICAgY29tcG9uZW50c0xpc3QucHVzaChcbiAgICAgIDxUYXNrXG4gICAgICAgIHRpdGxlU3RyPXt0aXRsZVN0cn1cbiAgICAgICAgZnVuYz17ZnVuY31cbiAgICAgICAgb25Eb25lPXsodmFsOiBUKSA9PiByZXNvbHZlKHZhbCl9XG4gICAgICAvPixcbiAgICApO1xuICB9KTtcblxuZXhwb3J0IGNvbnN0IHByb21wdFRhYmxlc0NvbmZsaWN0cyA9IDxUIGV4dGVuZHMgTmFtZWQ+KFxuICB7IG1pc3NpbmdUYWJsZXMsIG5ld1RhYmxlcyB9OiBSZW5kZXJUYWJsZXNTZWxlY3RQcm9wczxUPixcbikgPT4gbmV3IFByb21pc2U8VGFibGVzUmVzdWx0RGF0YTxUPj4oKFxuICByZXNvbHZlLFxuKSA9PiB7XG4gIHByZXBhcmVBcHAoKTtcblxuICBjb21wb25lbnRzTGlzdC5wdXNoKFxuICAgIDxQcm9tcHRUYWJsZXNDb25mbGljdHNcbiAgICAgIG9uRG9uZT17KHZhbCkgPT4gcmVzb2x2ZSh2YWwpfVxuICAgICAgbWlzc2luZ1RhYmxlcz17bWlzc2luZ1RhYmxlc31cbiAgICAgIG5ld1RhYmxlcz17bmV3VGFibGVzfVxuICAgIC8+LFxuICApO1xufSk7XG5cbmV4cG9ydCBjb25zdCBwcm9tcHRDb2x1bW5zQ29uZmxpY3RzID0gKFxuICB0YWJsZVdpdGhDb2x1bW5zOiBUYWJsZVdpdGhDb2x1bW4sXG4pID0+IG5ldyBQcm9taXNlPENvbHVtbnNSZXN1bHREYXRhPE5hbWVkPj4oKFxuICByZXNvbHZlLFxuKSA9PiB7XG4gIHByZXBhcmVBcHAoKTtcblxuICBjb21wb25lbnRzTGlzdC5wdXNoKFxuICAgIDxQcm9tcHRDb2x1bW5zQ29uZmxpY3RzXG4gICAgICBvbkRvbmU9eyh2YWwpID0+IHJlc29sdmUodmFsKX1cbiAgICAgIHRhYmxlV2l0aENvbHVtbnM9e3RhYmxlV2l0aENvbHVtbnN9XG4gICAgLz4sXG4gICk7XG59KTtcbiIsImltcG9ydCB7IGFzc2lnbiwgY3JlYXRlTWFjaGluZSwgc2VuZCB9IGZyb20gJ3hzdGF0ZSc7XG5pbXBvcnQgeyBOYW1lZCwgUmVuYW1lZE9iamVjdCB9IGZyb20gJ2NsaS9jb21tYW5kcy9taWdyYXRpb24vbWlncmF0ZSc7XG5cbnR5cGUgRXZlbnQgPVxuICB8IHsgdHlwZTogJ0NIT0lDRV9JVEVNJywgaXRlbUluZGV4OiBudW1iZXIgfVxuICB8IHsgdHlwZTogJ0RFTEVURScgfVxuICB8IHsgdHlwZTogJ1JFTkFNRScgfVxuICB8IHsgdHlwZTogJ0NBTkNFTCcgfVxuICB8IHsgdHlwZTogJ0NPTkZJUk0nIH1cbiAgfCB7IHR5cGU6ICdORVhUJyB9XG4gIHwgeyB0eXBlOiAnQ0hPSUNFX05FV19JVEVNJzsgaXRlbUluZGV4OiBudW1iZXIgfTtcblxuZXhwb3J0IGludGVyZmFjZSBUYWJsZVdpdGhDb2x1bW4ge1xuICBuYW1lOiBzdHJpbmc7XG4gIGFkZGVkOiBOYW1lZFtdLFxuICBkZWxldGVkOiBOYW1lZFtdLFxufVxuXG5pbnRlcmZhY2UgUHJvcHMge1xuICB0YWJsZVdpdGhDb2x1bW5zOiBUYWJsZVdpdGhDb2x1bW4sXG59XG5cbmludGVyZmFjZSBDb250ZXh0IHtcbiAgdGFibGVOYW1lOiBzdHJpbmcsXG4gIGFkZGVkQ29sdW1uczogTmFtZWRbXSxcbiAgZGVsZXRlZENvbHVtbnM6IE5hbWVkW10sXG4gIG1pc3NpbmdJdGVtSW5kZXg6IG51bWJlcixcbiAgbmV3SXRlbUluZGV4OiBudW1iZXIsXG4gIGNyZWF0ZWQ6IE5hbWVkW107XG4gIHJlbmFtZWQ6IFJlbmFtZWRPYmplY3Q8TmFtZWQ+W107XG4gIGRlbGV0ZWQ6IE5hbWVkW107XG59XG5cbmNvbnN0IGNyZWF0ZVJlc29sdmVDb2x1bW5zTWFjaGluZSA9IChwcm9wczogUHJvcHMpID0+IChcbiAgY3JlYXRlTWFjaGluZTxDb250ZXh0LCBFdmVudD4oe1xuICAgIGlkOiAncmVzb2x2ZUNvbHVtbnMnLFxuICAgIGluaXRpYWw6ICd0YWJsZScsXG4gICAgY29udGV4dDoge1xuICAgICAgdGFibGVOYW1lOiBwcm9wcy50YWJsZVdpdGhDb2x1bW5zLm5hbWUsXG4gICAgICBhZGRlZENvbHVtbnM6IHByb3BzLnRhYmxlV2l0aENvbHVtbnMuYWRkZWQsXG4gICAgICBkZWxldGVkQ29sdW1uczogcHJvcHMudGFibGVXaXRoQ29sdW1ucy5kZWxldGVkLFxuICAgICAgbWlzc2luZ0l0ZW1JbmRleDogMCxcbiAgICAgIG5ld0l0ZW1JbmRleDogMCxcbiAgICAgIGNyZWF0ZWQ6IFtdLFxuICAgICAgcmVuYW1lZDogW10sXG4gICAgICBkZWxldGVkOiBbXSxcbiAgICB9LFxuICAgIHN0YXRlczoge1xuICAgICAgdGFibGU6IHtcbiAgICAgICAgZW50cnk6IHNlbmQoeyB0eXBlOiAnTkVYVCcgfSksXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgTkVYVDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YXJnZXQ6ICdkb25lJyxcbiAgICAgICAgICAgICAgY29uZDogJ2lzTWlzc2luZ0NvbHVtbnNSZXNvbHZlZCcsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsncmVzb2x2ZVJlbWFpbmluZyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiAnZG9uZScsXG4gICAgICAgICAgICAgIGNvbmQ6ICdpc05ld0NvbHVtbnNSZXNvbHZlZCcsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsncmVzb2x2ZU1pc3NpbmcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgICBDSE9JQ0VfSVRFTTogeyB0YXJnZXQ6ICdhY3Rpb24nLCBhY3Rpb25zOiBbJ2Nob3NlSXRlbSddIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgYWN0aW9uOiB7XG4gICAgICAgIGluaXRpYWw6ICdhY3Rpb25DaG9pY2UnLFxuICAgICAgICBzdGF0ZXM6IHtcbiAgICAgICAgICBhY3Rpb25DaG9pY2U6IHtcbiAgICAgICAgICAgIG9uOiB7IERFTEVURTogJyNyZXNvbHZlQ29sdW1ucy5jb25maXJtYXRpb25EZWxldGUnLCBSRU5BTUU6ICdyZW5hbWUnIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZW5hbWU6IHtcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgIENIT0lDRV9ORVdfSVRFTTogeyB0YXJnZXQ6ICcjcmVzb2x2ZUNvbHVtbnMuY29uZmlybWF0aW9uUmVuYW1lJywgYWN0aW9uczogWydjaG9zZU5ld0l0ZW0nXSB9LFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpcm1hdGlvbkRlbGV0ZToge1xuICAgICAgICBvbjoge1xuICAgICAgICAgIENBTkNFTDogJ2FjdGlvbi5hY3Rpb25DaG9pY2UnLFxuICAgICAgICAgIENPTkZJUk06IFtcbiAgICAgICAgICAgIHsgdGFyZ2V0OiAnZmluYWwnLCBhY3Rpb25zOiBbJ2RlbGV0ZSddIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBjb25maXJtYXRpb25SZW5hbWU6IHtcbiAgICAgICAgb246IHtcbiAgICAgICAgICBDQU5DRUw6ICdhY3Rpb24uYWN0aW9uQ2hvaWNlJyxcbiAgICAgICAgICBDT05GSVJNOiBbXG4gICAgICAgICAgICB7IHRhcmdldDogJ2ZpbmFsJywgYWN0aW9uczogWydyZW5hbWUnXSB9LFxuICAgICAgICAgIF0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgZmluYWw6IHtcbiAgICAgICAgZW50cnk6IHNlbmQoeyB0eXBlOiAnTkVYVCcgfSksXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgTkVYVDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YXJnZXQ6ICdkb25lJyxcbiAgICAgICAgICAgICAgY29uZDogJ2lzTWlzc2luZ0NvbHVtbnNSZXNvbHZlZCcsXG4gICAgICAgICAgICAgIGFjdGlvbnM6IFsncmVzb2x2ZVJlbWFpbmluZyddLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgdGFyZ2V0OiAndGFibGUnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGRvbmU6IHt9LFxuICAgIH0sXG4gIH0sXG4gIHtcbiAgICBndWFyZHM6IHtcbiAgICAgIGlzTWlzc2luZ0NvbHVtbnNSZXNvbHZlZDogKHsgZGVsZXRlZENvbHVtbnMgfSkgPT4gIWRlbGV0ZWRDb2x1bW5zLmxlbmd0aCxcbiAgICAgIGlzTmV3Q29sdW1uc1Jlc29sdmVkOiAoeyBhZGRlZENvbHVtbnMgfSkgPT4gIWFkZGVkQ29sdW1ucy5sZW5ndGgsXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICBjaG9zZUl0ZW06IGFzc2lnbih7XG4gICAgICAgIG1pc3NpbmdJdGVtSW5kZXg6IChjb250ZXh0LCBldmVudCkgPT4gKGV2ZW50LnR5cGUgPT09ICdDSE9JQ0VfSVRFTScgPyBldmVudC5pdGVtSW5kZXggOiAwKSxcbiAgICAgIH0pLFxuXG4gICAgICBjaG9zZU5ld0l0ZW06IGFzc2lnbih7XG4gICAgICAgIG5ld0l0ZW1JbmRleDogKGNvbnRleHQsIGV2ZW50KSA9PiAoZXZlbnQudHlwZSA9PT0gJ0NIT0lDRV9ORVdfSVRFTScgPyBldmVudC5pdGVtSW5kZXggOiAwKSxcbiAgICAgIH0pLFxuXG4gICAgICBkZWxldGU6IGFzc2lnbih7XG4gICAgICAgIGRlbGV0ZWQ6ICh7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1JbmRleCxcbiAgICAgICAgICBkZWxldGVkLFxuICAgICAgICAgIGRlbGV0ZWRDb2x1bW5zLFxuICAgICAgICB9KSA9PiBbLi4uZGVsZXRlZCwgZGVsZXRlZENvbHVtbnNbbWlzc2luZ0l0ZW1JbmRleF1dLFxuICAgICAgICBkZWxldGVkQ29sdW1uczogKHtcbiAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgIGRlbGV0ZWRDb2x1bW5zLFxuICAgICAgICB9KSA9PiBkZWxldGVkQ29sdW1ucy5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAhPT0gbWlzc2luZ0l0ZW1JbmRleCksXG4gICAgICB9KSxcblxuICAgICAgcmVuYW1lOiBhc3NpZ24oe1xuICAgICAgICByZW5hbWVkOiAoe1xuICAgICAgICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgICAgICAgbmV3SXRlbUluZGV4LFxuICAgICAgICAgIHJlbmFtZWQsXG4gICAgICAgICAgYWRkZWRDb2x1bW5zLFxuICAgICAgICAgIGRlbGV0ZWRDb2x1bW5zLFxuICAgICAgICB9KSA9PiBbXG4gICAgICAgICAgLi4ucmVuYW1lZCxcbiAgICAgICAgICB7IG9sZDogZGVsZXRlZENvbHVtbnNbbWlzc2luZ0l0ZW1JbmRleF0sIG5ldzogYWRkZWRDb2x1bW5zW25ld0l0ZW1JbmRleF0gfSxcbiAgICAgICAgXSxcbiAgICAgICAgZGVsZXRlZENvbHVtbnM6ICh7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1JbmRleCxcbiAgICAgICAgICBkZWxldGVkQ29sdW1ucyxcbiAgICAgICAgfSkgPT4gZGVsZXRlZENvbHVtbnMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggIT09IG1pc3NpbmdJdGVtSW5kZXgpLFxuICAgICAgICBhZGRlZENvbHVtbnM6ICh7XG4gICAgICAgICAgbmV3SXRlbUluZGV4LFxuICAgICAgICAgIGFkZGVkQ29sdW1ucyxcbiAgICAgICAgfSkgPT4gYWRkZWRDb2x1bW5zLmZpbHRlcigoXywgaW5kZXgpID0+IGluZGV4ICE9PSBuZXdJdGVtSW5kZXgpLFxuICAgICAgfSksXG5cbiAgICAgIHJlc29sdmVSZW1haW5pbmc6IGFzc2lnbih7XG4gICAgICAgIGNyZWF0ZWQ6ICh7XG4gICAgICAgICAgYWRkZWRDb2x1bW5zLFxuICAgICAgICAgIGNyZWF0ZWQsXG4gICAgICAgIH0pID0+IFsuLi5jcmVhdGVkLCAuLi5hZGRlZENvbHVtbnNdLFxuICAgICAgICBhZGRlZENvbHVtbnM6IChjb250ZXh0KSA9PiBbXSxcbiAgICAgIH0pLFxuXG4gICAgICByZXNvbHZlTWlzc2luZzogYXNzaWduKHtcbiAgICAgICAgZGVsZXRlZDogKHtcbiAgICAgICAgICBkZWxldGVkQ29sdW1ucyxcbiAgICAgICAgICBkZWxldGVkLFxuICAgICAgICB9KSA9PiBbLi4uZGVsZXRlZCwgLi4uZGVsZXRlZENvbHVtbnNdLFxuICAgICAgICBkZWxldGVkQ29sdW1uczogKGNvbnRleHQpID0+IFtdLFxuICAgICAgfSksXG4gICAgfSxcbiAgfSkpO1xuXG5leHBvcnQgZGVmYXVsdCBjcmVhdGVSZXNvbHZlQ29sdW1uc01hY2hpbmU7XG4iLCJpbXBvcnQgeyBhc3NpZ24sIGNyZWF0ZU1hY2hpbmUsIHNlbmQgfSBmcm9tICd4c3RhdGUnO1xuaW1wb3J0IHsgTmFtZWQsIFJlbmFtZWRPYmplY3QgfSBmcm9tICdjbGkvY29tbWFuZHMvbWlncmF0aW9uL21pZ3JhdGUnO1xuXG50eXBlIEV2ZW50ID1cbiAgfCB7IHR5cGU6ICdDSE9JQ0VfSVRFTScsIGl0ZW1JbmRleDogbnVtYmVyIH1cbiAgfCB7IHR5cGU6ICdERUxFVEUnIH1cbiAgfCB7IHR5cGU6ICdSRU5BTUUnIH1cbiAgfCB7IHR5cGU6ICdDQU5DRUwnIH1cbiAgfCB7IHR5cGU6ICdDT05GSVJNJyB9XG4gIHwgeyB0eXBlOiAnTkVYVCcgfVxuICB8IHsgdHlwZTogJ0NIT0lDRV9ORVdfSVRFTSc7IGl0ZW1JbmRleDogbnVtYmVyIH07XG5cbmludGVyZmFjZSBDb250ZXh0IGV4dGVuZHMgUHJvcHMge1xuICBtaXNzaW5nSXRlbUluZGV4OiBudW1iZXIsXG4gIG5ld0l0ZW1JbmRleDogbnVtYmVyLFxuICBjcmVhdGVkVGFibGVzOiBOYW1lZFtdO1xuICByZW5hbWVkVGFibGVzOiBSZW5hbWVkT2JqZWN0PE5hbWVkPltdO1xuICBkZWxldGVkVGFibGVzOiBOYW1lZFtdO1xufVxuXG5pbnRlcmZhY2UgUHJvcHMge1xuICBtaXNzaW5nVGFibGVzOiBOYW1lZFtdLFxuICBuZXdUYWJsZXM6IE5hbWVkW10sXG59XG5cbmNvbnN0IGNyZWF0ZVJlc29sdmVUYWJsZXNNYWNoaW5lID0gKHByb3BzOiBQcm9wcykgPT4gKFxuICBjcmVhdGVNYWNoaW5lPENvbnRleHQsIEV2ZW50Pih7XG4gICAgaWQ6ICdyZXNvbHZlVGFibGVzJyxcbiAgICBpbml0aWFsOiAndGFibGUnLFxuICAgIGNvbnRleHQ6IHtcbiAgICAgIC4uLnByb3BzLFxuICAgICAgbWlzc2luZ0l0ZW1JbmRleDogMCxcbiAgICAgIG5ld0l0ZW1JbmRleDogMCxcbiAgICAgIGNyZWF0ZWRUYWJsZXM6IFtdLFxuICAgICAgcmVuYW1lZFRhYmxlczogW10sXG4gICAgICBkZWxldGVkVGFibGVzOiBbXSxcbiAgICB9LFxuICAgIHN0YXRlczoge1xuICAgICAgdGFibGU6IHtcbiAgICAgICAgZW50cnk6IHNlbmQoeyB0eXBlOiAnTkVYVCcgfSksXG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgTkVYVDogW1xuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YXJnZXQ6ICdkb25lJyxcbiAgICAgICAgICAgICAgY29uZDogJ2lzTWlzc2luZ1RhYmxlc1Jlc29sdmVkJyxcbiAgICAgICAgICAgICAgYWN0aW9uczogWydyZXNvbHZlUmVtYWluaW5nJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICB0YXJnZXQ6ICdkb25lJyxcbiAgICAgICAgICAgICAgY29uZDogJ2lzTmV3VGFibGVzUmVzb2x2ZWQnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3Jlc29sdmVNaXNzaW5nJ10sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIF0sXG4gICAgICAgICAgQ0hPSUNFX0lURU06IHsgdGFyZ2V0OiAnYWN0aW9uJywgYWN0aW9uczogWydjaG9zZUl0ZW0nXSB9LFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGFjdGlvbjoge1xuICAgICAgICBpbml0aWFsOiAnYWN0aW9uQ2hvaWNlJyxcbiAgICAgICAgc3RhdGVzOiB7XG4gICAgICAgICAgYWN0aW9uQ2hvaWNlOiB7XG4gICAgICAgICAgICBvbjogeyBERUxFVEU6ICcjcmVzb2x2ZVRhYmxlcy5jb25maXJtYXRpb25EZWxldGUnLCBSRU5BTUU6ICdyZW5hbWUnIH0sXG4gICAgICAgICAgfSxcbiAgICAgICAgICByZW5hbWU6IHtcbiAgICAgICAgICAgIG9uOiB7XG4gICAgICAgICAgICAgIENIT0lDRV9ORVdfSVRFTTogeyB0YXJnZXQ6ICcjcmVzb2x2ZVRhYmxlcy5jb25maXJtYXRpb25SZW5hbWUnLCBhY3Rpb25zOiBbJ2Nob3NlTmV3SXRlbSddIH0sXG4gICAgICAgICAgICB9LFxuICAgICAgICAgIH0sXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgICAgY29uZmlybWF0aW9uRGVsZXRlOiB7XG4gICAgICAgIG9uOiB7XG4gICAgICAgICAgQ0FOQ0VMOiAnYWN0aW9uLmFjdGlvbkNob2ljZScsXG4gICAgICAgICAgQ09ORklSTTogW1xuICAgICAgICAgICAgeyB0YXJnZXQ6ICdmaW5hbCcsIGFjdGlvbnM6IFsnZGVsZXRlJ10gfSxcbiAgICAgICAgICBdLFxuICAgICAgICB9LFxuICAgICAgfSxcbiAgICAgIGNvbmZpcm1hdGlvblJlbmFtZToge1xuICAgICAgICBvbjoge1xuICAgICAgICAgIENBTkNFTDogJ2FjdGlvbi5hY3Rpb25DaG9pY2UnLFxuICAgICAgICAgIENPTkZJUk06IFtcbiAgICAgICAgICAgIHsgdGFyZ2V0OiAnZmluYWwnLCBhY3Rpb25zOiBbJ3JlbmFtZSddIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBmaW5hbDoge1xuICAgICAgICBlbnRyeTogc2VuZCh7IHR5cGU6ICdORVhUJyB9KSxcbiAgICAgICAgb246IHtcbiAgICAgICAgICBORVhUOiBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogJ2RvbmUnLFxuICAgICAgICAgICAgICBjb25kOiAnaXNNaXNzaW5nVGFibGVzUmVzb2x2ZWQnLFxuICAgICAgICAgICAgICBhY3Rpb25zOiBbJ3Jlc29sdmVSZW1haW5pbmcnXSxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgIHRhcmdldDogJ3RhYmxlJyxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgXSxcbiAgICAgICAgfSxcbiAgICAgIH0sXG4gICAgICBkb25lOiB7fSxcbiAgICB9LFxuICB9LFxuICB7XG4gICAgZ3VhcmRzOiB7XG4gICAgICBpc01pc3NpbmdUYWJsZXNSZXNvbHZlZDogKHsgbWlzc2luZ1RhYmxlcyB9KSA9PiAhbWlzc2luZ1RhYmxlcy5sZW5ndGgsXG4gICAgICBpc05ld1RhYmxlc1Jlc29sdmVkOiAoeyBuZXdUYWJsZXMgfSkgPT4gIW5ld1RhYmxlcy5sZW5ndGgsXG4gICAgfSxcbiAgICBhY3Rpb25zOiB7XG4gICAgICBjaG9zZUl0ZW06IGFzc2lnbih7XG4gICAgICAgIG1pc3NpbmdJdGVtSW5kZXg6IChjb250ZXh0LCBldmVudCkgPT4gKGV2ZW50LnR5cGUgPT09ICdDSE9JQ0VfSVRFTScgPyBldmVudC5pdGVtSW5kZXggOiAwKSxcbiAgICAgIH0pLFxuXG4gICAgICBjaG9zZU5ld0l0ZW06IGFzc2lnbih7XG4gICAgICAgIG5ld0l0ZW1JbmRleDogKGNvbnRleHQsIGV2ZW50KSA9PiAoZXZlbnQudHlwZSA9PT0gJ0NIT0lDRV9ORVdfSVRFTScgPyBldmVudC5pdGVtSW5kZXggOiAwKSxcbiAgICAgIH0pLFxuXG4gICAgICBkZWxldGU6IGFzc2lnbih7XG4gICAgICAgIGRlbGV0ZWRUYWJsZXM6ICh7XG4gICAgICAgICAgbWlzc2luZ0l0ZW1JbmRleCxcbiAgICAgICAgICBkZWxldGVkVGFibGVzLFxuICAgICAgICAgIG1pc3NpbmdUYWJsZXMsXG4gICAgICAgIH0pID0+IFsuLi5kZWxldGVkVGFibGVzLCBtaXNzaW5nVGFibGVzW21pc3NpbmdJdGVtSW5kZXhdXSxcbiAgICAgICAgbWlzc2luZ1RhYmxlczogKHtcbiAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgIG1pc3NpbmdUYWJsZXMsXG4gICAgICAgIH0pID0+IG1pc3NpbmdUYWJsZXMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggIT09IG1pc3NpbmdJdGVtSW5kZXgpLFxuICAgICAgfSksXG5cbiAgICAgIHJlbmFtZTogYXNzaWduKHtcbiAgICAgICAgcmVuYW1lZFRhYmxlczogKHtcbiAgICAgICAgICBtaXNzaW5nSXRlbUluZGV4LFxuICAgICAgICAgIG5ld0l0ZW1JbmRleCxcbiAgICAgICAgICByZW5hbWVkVGFibGVzLFxuICAgICAgICAgIG5ld1RhYmxlcyxcbiAgICAgICAgICBtaXNzaW5nVGFibGVzLFxuICAgICAgICB9KSA9PiBbXG4gICAgICAgICAgLi4ucmVuYW1lZFRhYmxlcyxcbiAgICAgICAgICB7IG9sZDogbWlzc2luZ1RhYmxlc1ttaXNzaW5nSXRlbUluZGV4XSwgbmV3OiBuZXdUYWJsZXNbbmV3SXRlbUluZGV4XSB9LFxuICAgICAgICBdLFxuICAgICAgICBtaXNzaW5nVGFibGVzOiAoe1xuICAgICAgICAgIG1pc3NpbmdJdGVtSW5kZXgsXG4gICAgICAgICAgbWlzc2luZ1RhYmxlcyxcbiAgICAgICAgfSkgPT4gbWlzc2luZ1RhYmxlcy5maWx0ZXIoKF8sIGluZGV4KSA9PiBpbmRleCAhPT0gbWlzc2luZ0l0ZW1JbmRleCksXG4gICAgICAgIG5ld1RhYmxlczogKHtcbiAgICAgICAgICBuZXdJdGVtSW5kZXgsXG4gICAgICAgICAgbmV3VGFibGVzLFxuICAgICAgICB9KSA9PiBuZXdUYWJsZXMuZmlsdGVyKChfLCBpbmRleCkgPT4gaW5kZXggIT09IG5ld0l0ZW1JbmRleCksXG4gICAgICB9KSxcblxuICAgICAgcmVzb2x2ZVJlbWFpbmluZzogYXNzaWduKHtcbiAgICAgICAgY3JlYXRlZFRhYmxlczogKHtcbiAgICAgICAgICBuZXdUYWJsZXMsXG4gICAgICAgICAgY3JlYXRlZFRhYmxlcyxcbiAgICAgICAgfSkgPT4gWy4uLmNyZWF0ZWRUYWJsZXMsIC4uLm5ld1RhYmxlc10sXG4gICAgICAgIG5ld1RhYmxlczogKGNvbnRleHQpID0+IFtdLFxuICAgICAgfSksXG5cbiAgICAgIHJlc29sdmVNaXNzaW5nOiBhc3NpZ24oe1xuICAgICAgICBkZWxldGVkVGFibGVzOiAoe1xuICAgICAgICAgIG1pc3NpbmdUYWJsZXMsXG4gICAgICAgICAgZGVsZXRlZFRhYmxlcyxcbiAgICAgICAgfSkgPT4gWy4uLmRlbGV0ZWRUYWJsZXMsIC4uLm1pc3NpbmdUYWJsZXNdLFxuICAgICAgICBtaXNzaW5nVGFibGVzOiAoY29udGV4dCkgPT4gW10sXG4gICAgICB9KSxcbiAgICB9LFxuICB9KSk7XG5cbmV4cG9ydCBkZWZhdWx0IGNyZWF0ZVJlc29sdmVUYWJsZXNNYWNoaW5lO1xuIiwiaW1wb3J0IHsgTmFtZWQsIFJlbmFtZWRPYmplY3QgfSBmcm9tICdjbGkvY29tbWFuZHMvbWlncmF0aW9uL21pZ3JhdGUnO1xuXG5pbnRlcmZhY2UgU2NhbGFyRGljdCB7XG4gIFtrZXk6IHN0cmluZ106IHN0cmluZ1xufVxuXG5leHBvcnQgZGVmYXVsdCAoXG4gIGRhdGE6IHtcbiAgICB0aXRsZTogc3RyaW5nO1xuICAgIHZhbHVlczogTmFtZWRbXSB8IFJlbmFtZWRPYmplY3Q8TmFtZWQ+W11cbiAgfVtdLFxuKTogU2NhbGFyRGljdFtdID0+IHtcbiAgY29uc3QgYXJyYXk6IFNjYWxhckRpY3RbXSA9IFtdO1xuXG4gIGFycmF5Lmxlbmd0aCA9IGRhdGEucmVkdWNlKChhY2M6IG51bWJlciwgeyB2YWx1ZXMgfSkgPT4ge1xuICAgIGlmIChhY2MgPCB2YWx1ZXMubGVuZ3RoKSB7XG4gICAgICByZXR1cm4gdmFsdWVzLmxlbmd0aDtcbiAgICB9XG4gICAgcmV0dXJuIGFjYztcbiAgfSxcbiAgMCk7XG5cbiAgYXJyYXkuZmlsbCh7ICcnOiAnJyB9KTtcblxuICByZXR1cm4gYXJyYXkubWFwKChfLCBpKSA9PiB7XG4gICAgY29uc3QgdGVtcCA9IHt9IGFzIFNjYWxhckRpY3Q7XG5cbiAgICBkYXRhLmZvckVhY2goKGl0ZW06IGFueSwgaW5kOiBudW1iZXIpID0+IHtcbiAgICAgIHRlbXBbZGF0YVtpbmRdLnRpdGxlXSA9IGl0ZW0udmFsdWVzW2ldPy5vbGQ/Lm5hbWVcbiAgICAgICAgPyBgJHtpdGVtLnZhbHVlc1tpXT8ub2xkPy5uYW1lfSAtPiAke2l0ZW0udmFsdWVzW2ldPy5uZXc/Lm5hbWV9YFxuICAgICAgICA6IGl0ZW0udmFsdWVzW2ldPy5uYW1lIHx8ICcnO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHRlbXAgYXMgU2NhbGFyRGljdDtcbiAgfSk7XG59O1xuIiwiZXhwb3J0IGVudW0gQWN0aW9uIHtcbiAgUkVOQU1FID0gJ1JFTkFNRScsXG4gIERFTEVURSA9ICdERUxFVEUnXG59XG5cbmV4cG9ydCBlbnVtIENvbmZpcm1hdGlvbiB7XG4gIENBTkNFTCA9ICdDQU5DRUwnLFxuICBDT05GSVJNID0gJ0NPTkZJUk0nXG59XG5cbmV4cG9ydCBjb25zdCBhY3Rpb25zID0gW1xuICB7XG4gICAga2V5OiBBY3Rpb24uUkVOQU1FLFxuICAgIGxhYmVsOiAnUmVuYW1lZCcsXG4gICAgdmFsdWU6IEFjdGlvbi5SRU5BTUUsXG4gIH0sXG4gIHtcbiAgICBrZXk6IEFjdGlvbi5ERUxFVEUsXG4gICAgbGFiZWw6ICdEZWxldGVkJyxcbiAgICB2YWx1ZTogQWN0aW9uLkRFTEVURSxcbiAgfSxcbl07XG5cbmV4cG9ydCBjb25zdCBjb25maXJtYXRpb25zID0gW1xuICB7XG4gICAga2V5OiBDb25maXJtYXRpb24uQ09ORklSTSxcbiAgICBsYWJlbDogJ1llcycsXG4gICAgdmFsdWU6IENvbmZpcm1hdGlvbi5DT05GSVJNLFxuICB9LFxuICB7XG4gICAga2V5OiBDb25maXJtYXRpb24uQ0FOQ0VMLFxuICAgIGxhYmVsOiAnTm8nLFxuICAgIHZhbHVlOiBDb25maXJtYXRpb24uQ0FOQ0VMLFxuICB9LFxuXTtcbiIsImltcG9ydCBmcyBmcm9tICdmcydcbmltcG9ydCBzZXJpYWxpemUgZnJvbSAnc2VyaWxpemVyJ1xuXG4vLyBUT0RPOiBleHBvcnQgYXMgYSBmdW5jdGlvbiB3XG5cbmNvbnN0IGRyeSA9IHtcbiAgICB2ZXJzaW9uOiBcIjFcIixcbiAgICB0YWJsZXM6IHt9LFxuICAgIGVudW1zOiB7fVxufVxuXG5jb25zdCBwcmVwYXJlTWlncmF0aW9uID0gKFxuICAgIG1pZ3JhdGlvblJvb3RGb2xkZXJOYW1lOiBzdHJpbmcgPSAnZHJpenpsZScsXG4gICAgZGF0YUZvbGRlclBhdGg6IHN0cmluZ1xuKTogeyBwcmV2OiBhbnksIGN1cjogYW55IH0gPT4ge1xuICAgIGNvbnN0IHJvb3QgPSBtaWdyYXRpb25Sb290Rm9sZGVyTmFtZVxuICAgIGNvbnN0IGZpbGVzID0gZnMucmVhZGRpclN5bmMoJy4vJylcbiAgICBjb25zdCBkcml6emxlRm9sZGVyID0gZmlsZXMuZmluZCgoaXQpID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ID09PSByb290XG4gICAgfSlcblxuICAgIGlmICghZHJpenpsZUZvbGRlcikge1xuICAgICAgICBmcy5ta2RpclN5bmMocm9vdClcbiAgICB9XG5cbiAgICBjb25zdCBtaWdyYXRpb25Gb2xkZXJzID0gZnMucmVhZGRpclN5bmMoYC4vJHtyb290fWApXG5cbiAgICBsZXQgcHJldlNuYXBzaG90O1xuXG4gICAgaWYgKG1pZ3JhdGlvbkZvbGRlcnMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHByZXZTbmFwc2hvdCA9IGRyeVxuICAgIH0gZWxzZSB7XG4gICAgICAgIG1pZ3JhdGlvbkZvbGRlcnMuc29ydCgpXG4gICAgICAgIGNvbnN0IGxhc3RTbmFwc2hvdEZvbGRlciA9IG1pZ3JhdGlvbkZvbGRlcnNbbWlncmF0aW9uRm9sZGVycy5sZW5ndGggLSAxXVxuICAgICAgICBjb25zb2xlLmxvZyhsYXN0U25hcHNob3RGb2xkZXIpXG4gICAgICAgIHByZXZTbmFwc2hvdCA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKGAuLyR7cm9vdH0vJHtsYXN0U25hcHNob3RGb2xkZXJ9L3NuYXBzaG90Lmpzb25gKS50b1N0cmluZygpKVxuICAgIH1cblxuICAgIGNvbnN0IHRibHMgPSBgJHtkYXRhRm9sZGVyUGF0aH0vdGFibGVzL2BcbiAgICBjb25zdCB0cHMgPSBgJHtkYXRhRm9sZGVyUGF0aH0vdHlwZXMvYFxuXG4gICAgY29uc3QgcmVzdWx0ID0gc2VyaWFsaXplKHRibHMsIHRwcylcblxuICAgIHJldHVybiB7IHByZXY6IHByZXZTbmFwc2hvdCwgY3VyOiByZXN1bHQgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBwcmVwYXJlTWlncmF0aW9uOyIsImltcG9ydCB0cyBmcm9tIFwidHlwZXNjcmlwdFwiO1xuaW1wb3J0IGZzIGZyb20gXCJmc1wiO1xuY29uc3QgcHJpbnRlcjogdHMuUHJpbnRlciA9IHRzLmNyZWF0ZVByaW50ZXIoKTtcblxuY29uc3QgcHJlcGFyZUZhYnJpY0ZpbGUgPSAodGFibGVzRm9sZGVyOiBzdHJpbmcsIHR5cGVzRm9sZGVyOiBzdHJpbmcpID0+IHtcbiAgY29uc3Qgc3RhdGljSW1wb3J0cyA9IFtcbiAgICB0cy5jcmVhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZUltcG9ydENsYXVzZShcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICB0cy5jcmVhdGVOYW1lZEltcG9ydHMoW1xuICAgICAgICAgIHRzLmNyZWF0ZUltcG9ydFNwZWNpZmllcihcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJBYnN0cmFjdFRhYmxlXCIpLFxuICAgICAgICAgICksXG4gICAgICAgICAgdHMuY3JlYXRlSW1wb3J0U3BlY2lmaWVyKHVuZGVmaW5lZCwgdHMuY3JlYXRlSWRlbnRpZmllcihcIkRCXCIpKSxcbiAgICAgICAgXSksXG4gICAgICApLFxuICAgICAgdHMuY3JlYXRlU3RyaW5nTGl0ZXJhbChcImRyaXp6bGUtb3JtXCIpLFxuICAgICksXG4gICAgdHMuY3JlYXRlSW1wb3J0RGVjbGFyYXRpb24oXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB1bmRlZmluZWQsXG4gICAgICB0cy5jcmVhdGVJbXBvcnRDbGF1c2UodHMuY3JlYXRlSWRlbnRpZmllcihcIkVudW1cIiksIHVuZGVmaW5lZCksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKFwiZHJpenpsZS1vcm0vdHlwZXMvdHlwZVwiKSxcbiAgICApLFxuICAgIHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZU5hbWVkSW1wb3J0cyhbXG4gICAgICAgICAgdHMuY3JlYXRlSW1wb3J0U3BlY2lmaWVyKHVuZGVmaW5lZCwgdHMuY3JlYXRlSWRlbnRpZmllcihcIlBvb2xcIikpLFxuICAgICAgICBdKSxcbiAgICAgICksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKFwicGdcIiksXG4gICAgKSxcbiAgICB0cy5jcmVhdGVJbXBvcnREZWNsYXJhdGlvbihcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZUltcG9ydENsYXVzZSh0cy5jcmVhdGVJZGVudGlmaWVyKFwiU2VyaWFsaXplclwiKSwgdW5kZWZpbmVkKSxcbiAgICAgIHRzLmNyZWF0ZVN0cmluZ0xpdGVyYWwoXCIuL3NlcmlhbGl6ZXJcIiksXG4gICAgKSxcbiAgXTtcblxuICBjb25zdCBkeW5hbWljSW1wb3J0cyA9IFtdO1xuICBjb25zdCB0YWJsZXNGaWxlbmFtZXMgPSBmcy5yZWFkZGlyU3luYyh0YWJsZXNGb2xkZXIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHRhYmxlc0ZpbGVuYW1lcy5sZW5ndGg7IGkrKykge1xuICAgIGNvbnN0IGZpbGVuYW1lID0gdGFibGVzRmlsZW5hbWVzW2ldO1xuICAgIGNvbnN0IGltcG9ydFBhdGggPSBgJHt0YWJsZXNGb2xkZXJ9JHtmaWxlbmFtZS5zcGxpdChcIi5cIilbMF19YDtcbiAgICBkeW5hbWljSW1wb3J0cy5wdXNoKHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZU5hbWVzcGFjZUltcG9ydCh0cy5jcmVhdGVJZGVudGlmaWVyKGBpJHtpfWApKSxcbiAgICAgICksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKGltcG9ydFBhdGgpLFxuICAgICkpO1xuICB9XG4gIGNvbnN0IHR5cGVzRmlsZW5hbWVzID0gZnMucmVhZGRpclN5bmModHlwZXNGb2xkZXIpO1xuICBmb3IgKGxldCBpID0gMDsgaSA8IHR5cGVzRmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgY29uc3QgZmlsZW5hbWUgPSB0eXBlc0ZpbGVuYW1lc1tpXTtcbiAgICBjb25zdCBpbXBvcnRQYXRoID0gYCR7dHlwZXNGb2xkZXJ9JHtmaWxlbmFtZS5zcGxpdChcIi5cIilbMF19YDtcbiAgICBkeW5hbWljSW1wb3J0cy5wdXNoKHRzLmNyZWF0ZUltcG9ydERlY2xhcmF0aW9uKFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlSW1wb3J0Q2xhdXNlKFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZU5hbWVzcGFjZUltcG9ydCh0cy5jcmVhdGVJZGVudGlmaWVyKGB0JHtpfWApKSxcbiAgICAgICksXG4gICAgICB0cy5jcmVhdGVTdHJpbmdMaXRlcmFsKGltcG9ydFBhdGgpLFxuICAgICkpO1xuICB9XG5cbiAgY29uc3QgdmFyaWFibGVzU3RhdGVtZW50cyA9IFtcbiAgICB0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICBbXG4gICAgICAgICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJkYlwiKSxcbiAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgIHRzLmNyZWF0ZU5ldyh0cy5jcmVhdGVJZGVudGlmaWVyKFwiREJcIiksIHVuZGVmaW5lZCwgW1xuICAgICAgICAgICAgICB0cy5jcmVhdGVOZXcodHMuY3JlYXRlSWRlbnRpZmllcihcIlBvb2xcIiksIHVuZGVmaW5lZCwgW10pLFxuICAgICAgICAgICAgXSksXG4gICAgICAgICAgKSxcbiAgICAgICAgXSxcbiAgICAgICAgdHMuTm9kZUZsYWdzLkNvbnN0LFxuICAgICAgKSxcbiAgICApLFxuICAgIHRzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFxuICAgICAgdW5kZWZpbmVkLFxuICAgICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoXG4gICAgICAgIFtcbiAgICAgICAgICB0cy5jcmVhdGVWYXJpYWJsZURlY2xhcmF0aW9uKFxuICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcInNlcmlhbGl6ZXJcIiksXG4gICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICB0cy5jcmVhdGVOZXcodHMuY3JlYXRlSWRlbnRpZmllcihcIlNlcmlhbGl6ZXJcIiksIHVuZGVmaW5lZCwgW10pLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICAgIHRzLk5vZGVGbGFncy5Db25zdCxcbiAgICAgICksXG4gICAgKSxcbiAgXTtcblxuICBjb25zdCBibG9ja1N0YXRlbWVudHMgPSBbXTtcblxuICAvLyBjb25zdCB0YWJsZXMgPSBbXVxuICBibG9ja1N0YXRlbWVudHMucHVzaCh0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICB1bmRlZmluZWQsXG4gICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoXG4gICAgICBbXG4gICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcInRhYmxlc1wiKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgdHMuY3JlYXRlQXJyYXlMaXRlcmFsKFtdLCBmYWxzZSksXG4gICAgICAgICksXG4gICAgICBdLFxuICAgICAgdHMuTm9kZUZsYWdzLkNvbnN0LFxuICAgICksXG4gICkpO1xuXG4gIGZvciAobGV0IGkgPSAwOyBpIDwgdGFibGVzRmlsZW5hbWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gY29uc3QgdDEgPSAobmV3IGkxLmRlZmF1bHQoZGIpIGFzIHVua25vd24gYXMgQWJzdHJhY3RUYWJsZTxhbnk+KTtcbiAgICAvLyB0YWJsZXMucHVzaCh0MSlcbiAgICBjb25zdCBibG9ja1N0YXRlbWVudCA9IFtcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlU3RhdGVtZW50KFxuICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICAgIFtcbiAgICAgICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0YWJsZVwiICsgaSksXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdHMuY3JlYXRlUGFyZW4oXG4gICAgICAgICAgICAgICAgdHMuY3JlYXRlQXNFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlQXNFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVOZXcoXG4gICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiaVwiICsgaSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiZGVmYXVsdFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgICAgICBbdHMuY3JlYXRlSWRlbnRpZmllcihcImRiXCIpXSxcbiAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJBYnN0cmFjdFRhYmxlXCIpLFxuICAgICAgICAgICAgICAgICAgICBbXG4gICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgdHMuU3ludGF4S2luZC5BbnlLZXl3b3JkLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgIF0sXG4gICAgICAgICAgdHMuTm9kZUZsYWdzLkNvbnN0LFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICAgIHRzLmNyZWF0ZUV4cHJlc3Npb25TdGF0ZW1lbnQoXG4gICAgICAgIHRzLmNyZWF0ZUNhbGwoXG4gICAgICAgICAgdHMuY3JlYXRlUHJvcGVydHlBY2Nlc3MoXG4gICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwidGFibGVzXCIpLFxuICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcInB1c2hcIiksXG4gICAgICAgICAgKSxcbiAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgW3RzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0YWJsZVwiICsgaSldLFxuICAgICAgICApLFxuICAgICAgKSxcbiAgICBdO1xuXG4gICAgYmxvY2tTdGF0ZW1lbnRzLnB1c2goLi4uYmxvY2tTdGF0ZW1lbnQpO1xuICB9XG5cbiAgLy8gY29uc3QgZW51bXMgPSBbXVxuICBibG9ja1N0YXRlbWVudHMucHVzaCh0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICB1bmRlZmluZWQsXG4gICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoXG4gICAgICBbXG4gICAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb24oXG4gICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcImVudW1zXCIpLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICB0cy5jcmVhdGVBcnJheUxpdGVyYWwoW10sIGZhbHNlKSxcbiAgICAgICAgKSxcbiAgICAgIF0sXG4gICAgICB0cy5Ob2RlRmxhZ3MuQ29uc3QsXG4gICAgKSxcbiAgKSk7XG5cbiAgLy8gT2JqZWN0LnZhbHVlcyh0MCkuZm9yRWFjaCgodCkgPT4ge1xuICAvLyAgZW51bXMucHVzaCh0IGFzIEVudW08YW55Pik7XG4gIC8vIH0pO1xuICBpZiAodHlwZXNGaWxlbmFtZXMubGVuZ3RoID4gMCkge1xuICAgIGJsb2NrU3RhdGVtZW50cy5wdXNoKFxuICAgICAgdHMuY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgdHMuY3JlYXRlQ2FsbChcbiAgICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICAgIHRzLmNyZWF0ZUNhbGwoXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKFxuICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJPYmplY3RcIiksXG4gICAgICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcInZhbHVlc1wiKSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICBbdHMuY3JlYXRlSWRlbnRpZmllcihcInQwXCIpXSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiZm9yRWFjaFwiKSxcbiAgICAgICAgICApLFxuICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICBbXG4gICAgICAgICAgICB0cy5jcmVhdGVBcnJvd0Z1bmN0aW9uKFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgIHRzLmNyZWF0ZVBhcmFtZXRlcihcbiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0XCIpLFxuICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgIHVuZGVmaW5lZCxcbiAgICAgICAgICAgICAgdHMuY3JlYXRlVG9rZW4odHMuU3ludGF4S2luZC5FcXVhbHNHcmVhdGVyVGhhblRva2VuKSxcbiAgICAgICAgICAgICAgdHMuY3JlYXRlQmxvY2soXG4gICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlRXhwcmVzc2lvblN0YXRlbWVudChcbiAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlQ2FsbChcbiAgICAgICAgICAgICAgICAgICAgICB0cy5jcmVhdGVQcm9wZXJ0eUFjY2VzcyhcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJlbnVtc1wiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJwdXNoXCIpLFxuICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICAgICAgICAgIFtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUFzRXhwcmVzc2lvbihcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlQXNFeHByZXNzaW9uKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0XCIpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLmNyZWF0ZUtleXdvcmRUeXBlTm9kZShcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRzLlN5bnRheEtpbmQuVW5rbm93bktleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlVHlwZVJlZmVyZW5jZU5vZGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcIkVudW1cIiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHMuY3JlYXRlS2V5d29yZFR5cGVOb2RlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cy5TeW50YXhLaW5kLkFueUtleXdvcmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgIF0sXG4gICAgICAgICAgICAgICAgdHJ1ZSxcbiAgICAgICAgICAgICAgKSxcbiAgICAgICAgICAgICksXG4gICAgICAgICAgXSxcbiAgICAgICAgKSxcbiAgICAgICksXG4gICAgKTtcbiAgfVxuXG4gIC8vIHJldHVybiBzZXJpYWxpemVyLmdlbmVyYXRlKHRhYmxlcywgZW51bXMpXG4gIGJsb2NrU3RhdGVtZW50cy5wdXNoKFxuICAgIHRzLmNyZWF0ZVJldHVybihcbiAgICAgIHRzLmNyZWF0ZUNhbGwoXG4gICAgICAgIHRzLmNyZWF0ZVByb3BlcnR5QWNjZXNzKFxuICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJzZXJpYWxpemVyXCIpLFxuICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJnZW5lcmF0ZVwiKSxcbiAgICAgICAgKSxcbiAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICBbXG4gICAgICAgICAgdHMuY3JlYXRlSWRlbnRpZmllcihcInRhYmxlc1wiKSxcbiAgICAgICAgICB0cy5jcmVhdGVJZGVudGlmaWVyKFwiZW51bXNcIiksXG4gICAgICAgIF0sXG4gICAgICApLFxuICAgICksXG4gICk7XG5cbiAgY29uc3QgZnVuY1N0YXRlbWVudCA9IFtcbiAgICB0cy5jcmVhdGVWYXJpYWJsZVN0YXRlbWVudChcbiAgICAgIHVuZGVmaW5lZCxcbiAgICAgIHRzLmNyZWF0ZVZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KFxuICAgICAgICBbXG4gICAgICAgICAgdHMuY3JlYXRlVmFyaWFibGVEZWNsYXJhdGlvbihcbiAgICAgICAgICAgIHRzLmNyZWF0ZUlkZW50aWZpZXIoXCJ0ZXN0RnVuXCIpLFxuICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgdHMuY3JlYXRlQXJyb3dGdW5jdGlvbihcbiAgICAgICAgICAgICAgdW5kZWZpbmVkLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIFtdLFxuICAgICAgICAgICAgICB1bmRlZmluZWQsXG4gICAgICAgICAgICAgIHRzLmNyZWF0ZVRva2VuKHRzLlN5bnRheEtpbmQuRXF1YWxzR3JlYXRlclRoYW5Ub2tlbiksXG4gICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGJvZHlcbiAgICAgICAgICAgICAgdHMuY3JlYXRlQmxvY2soXG4gICAgICAgICAgICAgICAgYmxvY2tTdGF0ZW1lbnRzLFxuICAgICAgICAgICAgICAgIHRydWUsXG4gICAgICAgICAgICAgICksXG4gICAgICAgICAgICApLFxuICAgICAgICAgICksXG4gICAgICAgIF0sXG4gICAgICAgIHRzLk5vZGVGbGFncy5Db25zdCxcbiAgICAgICksXG4gICAgKSxcbiAgXTtcbiAgY29uc3QgaW52b2NhdGlvblN0YXRlbWVudCA9IFtcbiAgICB0cy5jcmVhdGVFeHByZXNzaW9uU3RhdGVtZW50KFxuICAgICAgdHMuY3JlYXRlQ2FsbCh0cy5jcmVhdGVJZGVudGlmaWVyKFwidGVzdEZ1blwiKSwgdW5kZWZpbmVkLCBbXSksXG4gICAgKSxcbiAgXTtcblxuICBjb25zdCBvdXRGaWxlOiB0cy5Tb3VyY2VGaWxlID0gdHMuY3JlYXRlU291cmNlRmlsZShcbiAgICBcIm91dGZpbGUudHNcIixcbiAgICBcIlwiLFxuICAgIHRzLlNjcmlwdFRhcmdldC5FUzIwMTUsXG4gICAgdHJ1ZSxcbiAgICB0cy5TY3JpcHRLaW5kLlRTLFxuICApO1xuXG4gIGNvbnN0IHNvdXJjZSA9IFtdO1xuICBzb3VyY2UucHVzaCguLi5zdGF0aWNJbXBvcnRzKTtcbiAgc291cmNlLnB1c2goLi4uZHluYW1pY0ltcG9ydHMpO1xuICBzb3VyY2UucHVzaCguLi52YXJpYWJsZXNTdGF0ZW1lbnRzKTtcbiAgc291cmNlLnB1c2goLi4uZnVuY1N0YXRlbWVudCk7XG4gIHNvdXJjZS5wdXNoKC4uLmludm9jYXRpb25TdGF0ZW1lbnQpO1xuXG4gIGNvbnN0IG5ld0ZpbGUgPSB0cy5mYWN0b3J5LnVwZGF0ZVNvdXJjZUZpbGUob3V0RmlsZSwgc291cmNlKTtcblxuICByZXR1cm4gcHJpbnRlci5wcmludEZpbGUobmV3RmlsZSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBwcmVwYXJlRmFicmljRmlsZTtcbiIsImltcG9ydCBmcyBmcm9tIFwiZnNcIjtcbmltcG9ydCB7IFN0cmluZ0RlY29kZXIgfSBmcm9tIFwic3RyaW5nX2RlY29kZXJcIjtcbmltcG9ydCBwcmVwYXJlRmFicmljRmlsZSBmcm9tIFwiLi9mYWN0b3J5XCI7XG5jb25zdCBlc2J1aWxkID0gcmVxdWlyZShcImVzYnVpbGRcIik7XG5cbmNvbnN0IHNlcmlhbGl6ZSA9IChwYXRoVG9UYWJsZXM6IHN0cmluZywgcGF0aFRvVHlwZXM6IHN0cmluZyk6IHN0cmluZyA9PiB7XG4gIGNvbnN0IGRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcigpO1xuICAvLyBjb25zdCBwcmVwYXJlZEZhcmJpYyA9IHByZXBhcmVGYWJyaWNGaWxlKFwiLi9leGFtcGxlcy90YWJsZXMvXCIsICcuL2V4YW1wbGVzL3R5cGVzLycpXG4gIGNvbnN0IHByZXBhcmVkRmFyYmljID0gcHJlcGFyZUZhYnJpY0ZpbGUocGF0aFRvVGFibGVzLCBwYXRoVG9UeXBlcylcbiAgY29uc3QgdHMgPSBwcmVwYXJlZEZhcmJpYztcblxuICBmcy53cml0ZUZpbGVTeW5jKFwiX19vdXQudHNcIiwgdHMsIFwidXRmLThcIik7XG4gIGNvbnN0IHJlc3VsdCA9IGVzYnVpbGQuYnVpbGRTeW5jKHtcbiAgICBlbnRyeVBvaW50czogW1wiX19vdXQudHNcIl0sXG4gICAgYnVuZGxlOiB0cnVlLFxuICAgIHBsYXRmb3JtOiBcIm5vZGVcIixcbiAgICB3cml0ZTogZmFsc2UsXG4gICAgZXh0ZXJuYWw6IFtcInBnLW5hdGl2ZVwiXSxcbiAgfSk7XG5cbiAgZnMucm1TeW5jKFwiX19vdXQudHNcIik7XG4gIHJldHVybiBldmFsKGRlY29kZXIud3JpdGUocmVzdWx0Lm91dHB1dEZpbGVzWzBdLmNvbnRlbnRzKSk7XG59O1xuXG5leHBvcnQgZGVmYXVsdCBzZXJpYWxpemU7XG4iLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJAeHN0YXRlL3JlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImNvbW1hbmRlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJlc2J1aWxkXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImlua1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJpbmstc2VsZWN0LWlucHV0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImluay1zcGlubmVyXCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcImluay10YWJsZVwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJqc29uLWRpZmZcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwicHJldHR5LWVycm9yL3N0YXJ0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInJlYWN0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInNvdXJjZS1tYXAtc3VwcG9ydC9yZWdpc3RlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJzdHJpbmdfZGVjb2RlclwiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ0eXBlc2NyaXB0XCIpOyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZShcInZhbHRpb1wiKTsiLCJtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoXCJ4c3RhdGVcIik7IiwibW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKFwiZnNcIik7IiwiLy8gVGhlIG1vZHVsZSBjYWNoZVxudmFyIF9fd2VicGFja19tb2R1bGVfY2FjaGVfXyA9IHt9O1xuXG4vLyBUaGUgcmVxdWlyZSBmdW5jdGlvblxuZnVuY3Rpb24gX193ZWJwYWNrX3JlcXVpcmVfXyhtb2R1bGVJZCkge1xuXHQvLyBDaGVjayBpZiBtb2R1bGUgaXMgaW4gY2FjaGVcblx0dmFyIGNhY2hlZE1vZHVsZSA9IF9fd2VicGFja19tb2R1bGVfY2FjaGVfX1ttb2R1bGVJZF07XG5cdGlmIChjYWNoZWRNb2R1bGUgIT09IHVuZGVmaW5lZCkge1xuXHRcdHJldHVybiBjYWNoZWRNb2R1bGUuZXhwb3J0cztcblx0fVxuXHQvLyBDcmVhdGUgYSBuZXcgbW9kdWxlIChhbmQgcHV0IGl0IGludG8gdGhlIGNhY2hlKVxuXHR2YXIgbW9kdWxlID0gX193ZWJwYWNrX21vZHVsZV9jYWNoZV9fW21vZHVsZUlkXSA9IHtcblx0XHQvLyBubyBtb2R1bGUuaWQgbmVlZGVkXG5cdFx0Ly8gbm8gbW9kdWxlLmxvYWRlZCBuZWVkZWRcblx0XHRleHBvcnRzOiB7fVxuXHR9O1xuXG5cdC8vIEV4ZWN1dGUgdGhlIG1vZHVsZSBmdW5jdGlvblxuXHRfX3dlYnBhY2tfbW9kdWxlc19fW21vZHVsZUlkXS5jYWxsKG1vZHVsZS5leHBvcnRzLCBtb2R1bGUsIG1vZHVsZS5leHBvcnRzLCBfX3dlYnBhY2tfcmVxdWlyZV9fKTtcblxuXHQvLyBSZXR1cm4gdGhlIGV4cG9ydHMgb2YgdGhlIG1vZHVsZVxuXHRyZXR1cm4gbW9kdWxlLmV4cG9ydHM7XG59XG5cbiIsIi8vIGdldERlZmF1bHRFeHBvcnQgZnVuY3Rpb24gZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBub24taGFybW9ueSBtb2R1bGVzXG5fX3dlYnBhY2tfcmVxdWlyZV9fLm4gPSAobW9kdWxlKSA9PiB7XG5cdHZhciBnZXR0ZXIgPSBtb2R1bGUgJiYgbW9kdWxlLl9fZXNNb2R1bGUgP1xuXHRcdCgpID0+IChtb2R1bGVbJ2RlZmF1bHQnXSkgOlxuXHRcdCgpID0+IChtb2R1bGUpO1xuXHRfX3dlYnBhY2tfcmVxdWlyZV9fLmQoZ2V0dGVyLCB7IGE6IGdldHRlciB9KTtcblx0cmV0dXJuIGdldHRlcjtcbn07IiwiLy8gZGVmaW5lIGdldHRlciBmdW5jdGlvbnMgZm9yIGhhcm1vbnkgZXhwb3J0c1xuX193ZWJwYWNrX3JlcXVpcmVfXy5kID0gKGV4cG9ydHMsIGRlZmluaXRpb24pID0+IHtcblx0Zm9yKHZhciBrZXkgaW4gZGVmaW5pdGlvbikge1xuXHRcdGlmKF9fd2VicGFja19yZXF1aXJlX18ubyhkZWZpbml0aW9uLCBrZXkpICYmICFfX3dlYnBhY2tfcmVxdWlyZV9fLm8oZXhwb3J0cywga2V5KSkge1xuXHRcdFx0T2JqZWN0LmRlZmluZVByb3BlcnR5KGV4cG9ydHMsIGtleSwgeyBlbnVtZXJhYmxlOiB0cnVlLCBnZXQ6IGRlZmluaXRpb25ba2V5XSB9KTtcblx0XHR9XG5cdH1cbn07IiwiX193ZWJwYWNrX3JlcXVpcmVfXy5vID0gKG9iaiwgcHJvcCkgPT4gKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApKSIsIi8vIGRlZmluZSBfX2VzTW9kdWxlIG9uIGV4cG9ydHNcbl9fd2VicGFja19yZXF1aXJlX18uciA9IChleHBvcnRzKSA9PiB7XG5cdGlmKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC50b1N0cmluZ1RhZykge1xuXHRcdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCBTeW1ib2wudG9TdHJpbmdUYWcsIHsgdmFsdWU6ICdNb2R1bGUnIH0pO1xuXHR9XG5cdE9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG59OyIsImltcG9ydCB7IHByb2dyYW0gfSBmcm9tICdjb21tYW5kZXInO1xuaW1wb3J0ICdzb3VyY2UtbWFwLXN1cHBvcnQvcmVnaXN0ZXInO1xuaW1wb3J0ICdwcmV0dHktZXJyb3Ivc3RhcnQnO1xuXG5pbXBvcnQgJy4vY29tbWFuZHMvbWlncmF0aW9uJztcblxucHJvZ3JhbS5wYXJzZSgpO1xuIl0sIm5hbWVzIjpbXSwic291cmNlUm9vdCI6IiJ9
3
+ (()=>{"use strict";var __webpack_modules__={194:(e,t,a)=>{a.r(t),a.d(t,{diffForRenamed:()=>l,differ:()=>r});const n=require("json-diff");function l(e){return e.map((e=>{const t=e.from||e.old,a=e.to||e.new;return[{...t,name:a.name},a]})).map((e=>{const t=(0,n.diff)(e[0],e[1]);return t.name=e[0].name,o(t)}))}function r(e,t){const a=(0,n.diff)(e,t);a.tables=a.tables?a.tables:{},a.enums=a.enums?a.enums:{};const l=Object.entries(a.tables),r=l.filter((e=>e[0].includes("__added"))).map((e=>e[1])).map((e=>({...e,indexes:Object.entries(e.indexes).map((e=>{const t=e[1],a=t.name,n=Object.values(t.columns).map((e=>e.name));return{name:a,columns:n}}))}))),d=l.filter((e=>e[0].includes("__deleted"))).map((e=>e[1])),s=Object.entries(a.enums),u=s.filter((e=>e[0].includes("__added"))).map((e=>e[1])).map((e=>{const t=Object.entries(e.values).map((e=>e[1]));return{name:e.name,values:t}})),i=s.filter((e=>e[0].includes("__deleted"))).map((e=>e[1])).map((e=>{const t=Object.entries(e.values).map((e=>e[1]));return{name:e.name,values:t}})),c=s.filter((e=>!(e[0].includes("__added")||e[0].includes("__deleted")))).map((e=>{const t=e[1].values,a=Object.entries(t).filter((e=>e[0].includes("__added"))).map((e=>e[1])),n=Object.entries(t).filter((e=>e[0].includes("__deleted"))).map((e=>e[1]));return{name:e[0],addedValues:a,deletedValues:n}}));return{addedTables:r,deletedTables:d,alteredTablesWithColumns:Object.keys(a.tables).filter((e=>!(e.includes("__added")||e.includes("__deleted")))).map((e=>({name:e,...a.tables[e]}))).map((e=>o(e))),addedEnums:u,deletedEnums:i,alteredEnums:c}}const o=e=>{const t=e.columns,a=Object.keys(t).filter((e=>e.includes("__added"))).map((e=>({...t[e]}))),n=Object.keys(t).filter((e=>e.includes("__deleted"))).map((e=>({...t[e]}))),l=Object.keys(t).filter((e=>!(e.includes("__deleted")||e.includes("__added")))).map((e=>({name:e,...t[e]}))),r=Object.values(e.indexes__deleted||{}).map((e=>({name:e.name,columns:Object.values(e.columns).map((e=>e.name))}))).concat(Object.keys(e.indexes||{}).filter((e=>e.includes("__deleted"))).map((t=>{const a=e.indexes[t],n=a.name,l=Object.values(a.columns).map((e=>e.name));return{name:n,columns:l}}))),o=Object.values(e.indexes__added||{}).map((e=>({name:e.name,columns:Object.values(e.columns).map((e=>e.name))}))).concat(Object.keys(e.indexes||{}).filter((e=>e.includes("__added"))).map((t=>{const a=e.indexes[t],n=a.name,l=Object.values(a.columns).map((e=>e.name));return{name:n,columns:l}})));return{name:e.name,deleted:n,added:a,altered:l,addedIndexes:o,deletedIndexes:r}}},845:(e,t,a)=>{a.r(t),a.d(t,{Types:()=>n,prepareCreateTableJson:()=>l,prepareDropTableJson:()=>r,prepareRenameTableJson:()=>o,prepareCreateEnumJson:()=>d,prepareAddValuesToEnumJson:()=>s,prepareAlterTableColumnsJson:()=>u,prepareCreateIndexesJson:()=>f,prepareDropIndexesJson:()=>p});class n{static createTable="create_table";static dropTable="drop_table";static renameTable="rename_table";static alterTableDropColumn="alter_table_drop_column";static alterTableAddColumn="alter_table_add_column";static alterTableAlterColumnSetType="alter_table_alter_column_set_type";static alterTableAlterColumnSetDefault="alter_table_alter_column_set_default";static alterTableAlterColumnDropDefault="alter_table_alter_column_drop_default";static alterTableAlterColumnSetNotNull="alter_table_alter_column_set_notnull";static alterTableAlterColumnDropNotNull="alter_table_alter_column_drop_notnull";static createIndex="create_index";static dropIndex="drop_index";static createTypeEnum="create_type_enum";static alterTypeAddValue="alter_type_add_value"}const l=e=>{const{name:t,columns:a}=e,l=Object.keys(a).map((e=>({...a[e]})));return{type:n.createTable,tableName:t,columns:l}},r=e=>({type:n.dropTable,tableName:e.name}),o=(e,t)=>({type:n.renameTable,from:e.name,to:t.name}),d=(e,t)=>({type:n.createTypeEnum,enumName:e,values:t}),s=(e,t)=>t.map((t=>({type:n.alterTypeAddValue,enumName:e,enumValue:t}))),u=e=>{const t=e.name,a=[],n=i(t,e.deleted),l=c(t,e.added),r=m(t,e.altered);return a.push(...n),a.push(...l),a.push(...r),a},i=(e,t)=>t.map((t=>({type:n.alterTableDropColumn,tableName:e,columnName:t.name}))),c=(e,t)=>t.map((t=>({type:n.alterTableAddColumn,tableName:e,column:t}))),m=(e,t)=>{let a=[];for(const l of t){const t=l.name;if(l.type){const{__new:r}=l.type;a.push({type:n.alterTableAlterColumnSetType,tableName:e,columnName:t,newDataType:r})}if(l.defaultValue||l.defaultValue__added){const r=l.defaultValue.__new|l.defaultValue__added;a.push({type:n.alterTableAlterColumnSetDefault,tableName:e,columnName:t,newDefault:r})}l.defaultValue__deleted&&a.push({type:n.alterTableAlterColumnDropDefault,tableName:e,columnName:t}),(l.notNull__added||l.notNull&&l.notNull.__new)&&a.push({type:n.alterTableAlterColumnSetNotNull,tableName:e,columnName:t}),(l.notNull__deleted||l.notNull&&!l.notNull.__new)&&a.push({type:n.alterTableAlterColumnDropNotNull,tableName:e,columnName:t})}return a},f=(e,t)=>t.map((t=>({type:n.createIndex,tableName:e,indexName:t.name,indexValue:t.columns.join(", ")}))),p=(e,t)=>t.map((t=>({type:n.dropIndex,tableName:e,indexName:t.name})))},373:(e,t,a)=>{a.r(t),a.d(t,{fromJson:()=>o,prepareDeleteColumns:()=>d,prepareCreateColumns:()=>s,prepareAlterColumns:()=>u,prepareCreateTable:()=>i,prepareCreateIndex:()=>c,prepareDropIndex:()=>m,prepareRenameTable:()=>f,prepareDropTable:()=>p,prepareCreateEnum:()=>_,prepareAddValuesToEnum:()=>b});var n=a(845);class l{constructor(e){this.type=e}can(e){return this.type===e}convert(e){throw Error("override the convert mothod")}}const r=[];r.push(new class extends l{constructor(){super(n.Types.createTable)}convert(e){const{tableName:t,columns:a}=e,n=Object.keys(a).map((e=>({...a[e]})));let l="";l+=`CREATE TABLE ${t} (\n`;for(const e of n){const t=e.primaryKey?"PRIMARY KEY":"",a=e.notNull?"NOT NULL":"",n=e.defaultValue?`DEFAULT '${e.defaultValue}'`:"";l+="\t"+`${e.name} ${e.type} ${t} ${n} ${a}`.replace(/ +/g," ").trim()+",\n"}return l+=");",l}}),r.push(new class extends l{constructor(){super(n.Types.createTypeEnum)}convert(e){const{enumName:t,values:a}=e;let n="(";return n+=a.map((e=>`'${e}'`)).join(", "),n+=")",`CREATE TYPE ${t} AS ENUM${n};`}}),r.push(new class extends l{constructor(){super(n.Types.dropTable)}convert(e){const{tableName:t}=e;return`DROP TABLE ${t}`}}),r.push(new class extends l{constructor(){super(n.Types.renameTable)}convert(e){const{from:t,to:a}=e;return`ALTER TABLE ${t} RENAME TO ${a}`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableDropColumn)}convert(e){const{tableName:t,columnName:a}=e;return`ALTER TABLE ${t} DROP COLUMN IF EXISTS ${a};`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAddColumn)}convert(e){const{tableName:t,column:a}=e,{name:n,type:l,defaultValue:r,notNull:o}=a;return`ALTER TABLE ${t} ADD COLUMN ${n} ${l}${r?` DEFAULT ${r}`:""}${o?" NOT NULL":""}`.trim()+";"}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAlterColumnSetType)}convert(e){const{tableName:t,columnName:a,newDataType:n}=e;return`ALTER TABLE ${t} ALTER COLUMN ${a} SET DATA TYPE ${n};`}}),r.push(new class extends l{constructor(){super(n.Types.createIndex)}convert(e){const{tableName:t,indexName:a,indexValue:n}=e;return`CREATE INDEX ${a} ON ${t} (${n});`}}),r.push(new class extends l{constructor(){super(n.Types.dropIndex)}convert(e){const{indexName:t}=e;return`DROP INDEX IF EXISTS ${t};`}}),r.push(new class extends l{constructor(){super(n.Types.alterTypeAddValue)}convert(e){const{enumName:t,enumValue:a}=e;return`ALTER TYPE ${t} ADD VALUE ${a};`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAlterColumnSetNotNull)}convert(e){const{tableName:t,columnName:a}=e;return`ALTER TABLE ${t} ALTER COLUMN ${a} SET NOT NULL;`}}),r.push(new class extends l{constructor(){super(n.Types.alterTableAlterColumnDropNotNull)}convert(e){const{tableName:t,columnName:a}=e;return`ALTER TABLE ${t} ALTER COLUMN ${a} DROP NOT NULL;`}});const o=e=>e.map((e=>{const t=r.filter((t=>t.can(e.type))),a=1===t.length?t[0]:void 0;return a?a.convert(e):(console.log("no convertor:",e.type),"dry run")})),d=(e,t)=>{let a="";for(const n of t)a+=`ALTER TABLE ${e} DROP COLUMN IF EXISTS ${n.name};`,a+="\n";return a.trim()},s=(e,t)=>{let a="";for(const n of t){const{name:t,type:l,defaultValue:r,notNull:o}=n;a+=`ALTER TABLE ${e} ADD COLUMN ${t} ${l} ${r?`DEFAULT ${r}`:""} ${o?"NOT NULL":""}`.trim()+";",a+="\n"}return a.trim()},u=(e,t)=>{let a="";for(const n of t){const{name:t}=n;if(n.type){const{__new:l}=n.type;a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET DATA TYPE ${l};`,a+="\n"}if(n.defaultValue){const{__new:l}=n.defaultValue;a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET DEFAULT ${l};`,a+="\n"}if(n.defaultValue__added&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET DEFAULT ${n.defaultValue__added};`,a+="\n"),n.defaultValue__deleted&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} DROP DEFAULT;`,a+="\n"),n.notNull){const{__new:l}=n.notNull;a+=`ALTER TABLE ${e} ALTER COLUMN ${t} ${l?"SET NOT NULL":"DROP NOT NULL"};`,a+="\n"}n.notNull__added&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} SET NOT NULL;`,a+="\n"),n.notNull__deleted&&(a+=`ALTER TABLE ${e} ALTER COLUMN ${t} DROP NOT NULL;`,a+="\n")}return a.trim()},i=e=>{const{name:t,columns:a}=e,n=Object.keys(a).map((e=>({...a[e]})));let l="";l+=`CREATE TABLE ${t} (\n`;for(const e of n){const t=e.primaryKey?"PRIMARY KEY":"",a=e.notNull?"NOT NULL":"",n=e.defaultValue?`DEFAULT '${e.defaultValue}'`:"";l+="\t"+`${e.name} ${e.type} ${t} ${n} ${a}`.replace(/ +/g," ").trim()+",\n"}return l+=");",l},c=(e,t)=>{let a="";for(const n of t){const{name:t,columns:l}=n;a+=`CREATE INDEX ${t} ON ${e} (${l.join(", ")});`,a+="\n"}return a.trim()},m=(e,t)=>{let a="";for(const e of t){const{name:t}=e;a+=`DROP INDEX IF EXISTS ${t};`,a+="\n"}return a.trim()},f=(e,t)=>`ALTER TABLE ${e.name} RENAME TO ${t.name}`,p=e=>{const{name:t}=e;return`DROP TABLE ${t}`},_=(e,t)=>{let a="(";return a+=Object.values(t).map((e=>`'${e}'`)).join(", "),a+=")",`CREATE TYPE ${e} AS ENUM${a};`},b=(e,t)=>{let a="";for(const n in t)a+=`ALTER TYPE ${e} ADD VALUE ${t[n]};`,a+="\n";return a.trim()}},512:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const l=a(304),r=n(a(492));l.program.command("migrate").alias("mg").description("Migration").action(r.default).command("start").description("Start migration").action(r.default)},492:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=a(282),s=o(a(147)),u=r(a(194)),i=o(a(572)),c=a(845),m=a(373);t.default=async()=>{const{prev:e,cur:t}=await(0,d.task)("preparing data schema json snapshot",(async({setTitle:e})=>(0,i.default)("drizzle","./data/v2"))),a=await(0,d.task)("preparing schemas diff",(async({setTitle:a})=>u.differ(e,t))),{created:n,renamed:l,deleted:r}=await(0,d.promptTablesConflicts)({newTables:a.addedTables,missingTables:a.deletedTables}),o=[],f=n.map((e=>(0,c.prepareCreateTableJson)(e))),p=n.map((e=>(0,c.prepareCreateIndexesJson)(e.name,e.indexes))).flat(),_=r.map((e=>(0,c.prepareDropTableJson)(e))),b=l.map((e=>(0,c.prepareRenameTableJson)(e.old,e.new))),E=u.diffForRenamed(l),T=a.alteredTablesWithColumns.concat(E),v=[];for(const e of T){const t=await(0,d.promptColumnsConflicts)(e),{deleted:a,added:n,...l}=e;v.push({...l,...t})}const y=v.map((e=>(0,c.prepareAlterTableColumnsJson)(e))).flat(),h=v.map((e=>(0,c.prepareCreateIndexesJson)(e.name,e.addedIndexes||{}))).flat(),C=v.map((e=>(0,c.prepareDropIndexesJson)(e.name,e.deletedIndexes||{}))).flat(),I=a.addedEnums.map((e=>(0,c.prepareCreateEnumJson)(e.name,e.values))),N=a.alteredEnums.map((e=>(0,c.prepareAddValuesToEnumJson)(e.name,e.addedValues))).flat();o.push(...I),o.push(...N),o.push(...f),o.push(...p),o.push(..._),o.push(...b),o.push(...y),o.push(...h),o.push(...C);const g=(0,m.fromJson)(o);console.log(g.join("\n"));const x=`./drizzle/${(new Date).toISOString()}`;s.default.mkdirSync(x),s.default.writeFileSync(`${x}/snapshot.json`,JSON.stringify(t,null,2)),s.default.writeFileSync(`${x}/migration.sql`,g.join("\n"))}},560:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const l=n(a(689)),r=a(259);t.default=({componentsList:e})=>((0,r.useSnapshot)(e),l.default.createElement(l.default.Fragment,null,e.map(((e,t)=>({...e,key:t})))))},613:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const l=a(82),r=n(a(689)),o=n(a(560));t.default=e=>{const t=(0,l.render)(r.default.createElement(o.default,{componentsList:e}));return{remove(){t.rerender(null),t.unmount(),t.clear(),t.cleanup()}}}},243:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=o(a(689)),s=a(82),u=o(a(138)),i=r(a(164)),c=a(456),m=o(a(454)),f=a(313),p=o(a(234));t.default=({onDone:e,tableWithColumns:t})=>{const[a,n]=(0,c.useMachine)((0,p.default)({tableWithColumns:t})),{tableName:l,addedColumns:r,deletedColumns:o,missingItemIndex:_,created:b,renamed:E,deleted:T}=a.context,v=e=>{n({type:"CHOICE_ITEM",itemIndex:e.value})},y=e=>{n({type:"CHOICE_NEW_ITEM",itemIndex:e.value})},h=e=>{n({type:e.value})},C=e=>{n({type:e.value})},I=()=>{if(a.matches("table"))return d.default.createElement(d.default.Fragment,null,d.default.createElement(s.Box,{display:"flex",flexDirection:"column"},d.default.createElement(s.Box,{display:"flex"},d.default.createElement(s.Box,{flexDirection:"column"},d.default.createElement(i.Header,null,`Table "${l}" missing columns:`),d.default.createElement(u.default,{items:o.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:v})),!!r?.length&&d.default.createElement(s.Box,{flexDirection:"column",paddingLeft:5},d.default.createElement(i.Header,null,"New tables:"),d.default.createElement(s.Box,{display:"flex",flexDirection:"column"},r.map((({name:e},t)=>d.default.createElement(s.Text,{key:e+t},e))))))));if(a.matches("action.actionChoice")){const e=r.length?f.actions:f.actions.filter((({value:e})=>e!==f.Action.RENAME));return d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${o[_]?.name} is:`),d.default.createElement(u.default,{items:e,onSelect:h}))}return a.matches("confirmationDelete")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"!!! Data in table will be lost !!!"),d.default.createElement(s.Text,null,"Are you sure?"),d.default.createElement(u.default,{items:f.confirmations,onSelect:C})):a.matches("confirmationRename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"Are you sure?"),d.default.createElement(u.default,{items:f.confirmations,onSelect:C})):a.matches("action.rename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${o[_]?.name} was renamed to:`),d.default.createElement(u.default,{items:r.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:y})):(a.matches("done")&&e({created:b,renamed:E,deleted:T}),d.default.createElement(d.default.Fragment,null))};return T.length||E.length||b.length?d.default.createElement(s.Box,{flexDirection:"column",margin:1},d.default.createElement(s.Box,{flexDirection:"column",marginBottom:0},d.default.createElement(i.Header,null,`${l} columns:`),d.default.createElement(i.default,{data:(0,m.default)([{title:"Deleted",values:T},{title:"Renamed",values:E},{title:"Created",values:b}])})),I()):I()}},60:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=o(a(689)),s=a(82),u=o(a(138)),i=r(a(164)),c=a(456),m=o(a(761)),f=o(a(454)),p=a(313);t.default=({onDone:e,newTables:t,missingTables:a})=>{const[n,l]=(0,c.useMachine)((0,m.default)({missingTables:a,newTables:t})),{missingItemIndex:r,newTables:o,missingTables:_,createdTables:b,renamedTables:E,deletedTables:T}=n.context,v=e=>{l({type:"CHOICE_ITEM",itemIndex:e.value})},y=e=>{l({type:"CHOICE_NEW_ITEM",itemIndex:e.value})},h=e=>{l({type:e.value})},C=e=>{l({type:e.value})},I=()=>{if(n.matches("table"))return d.default.createElement(d.default.Fragment,null,d.default.createElement(s.Box,{display:"flex",flexDirection:"column"},d.default.createElement(s.Box,{display:"flex"},d.default.createElement(s.Box,{flexDirection:"column"},d.default.createElement(i.Header,null,"Missing tables:"),d.default.createElement(u.default,{items:_.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:v})),!!o?.length&&d.default.createElement(s.Box,{flexDirection:"column",paddingLeft:5},d.default.createElement(i.Header,null,"New tables:"),d.default.createElement(s.Box,{display:"flex",flexDirection:"column"},o.map((({name:e},t)=>d.default.createElement(s.Text,{key:e+t},e))))))));if(n.matches("action.actionChoice")){const e=o.length?p.actions:p.actions.filter((({value:e})=>e!==p.Action.RENAME));return d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${_[r]?.name} is:`),d.default.createElement(u.default,{items:e,onSelect:h}))}return n.matches("confirmationDelete")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"!!! Data in table will be lost !!!"),d.default.createElement(s.Text,null,"Are you sure?"),d.default.createElement(u.default,{items:p.confirmations,onSelect:C})):n.matches("confirmationRename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,"Are you sure?"),d.default.createElement(u.default,{items:p.confirmations,onSelect:C})):n.matches("action.rename")?d.default.createElement(d.default.Fragment,null,d.default.createElement(i.Header,null,`${_[r]?.name} was renamed to:`),d.default.createElement(u.default,{items:o.map(((e,t)=>({key:String(t),label:e.name,value:t}))),onSelect:y})):(n.matches("done")&&e({created:b,renamed:E,deleted:T}),d.default.createElement(d.default.Fragment,null))};return T.length||E.length||b.length?d.default.createElement(s.Box,{flexDirection:"column",margin:1},d.default.createElement(s.Box,{flexDirection:"column",marginBottom:0},d.default.createElement(i.Header,null,"Tables: "),d.default.createElement(i.default,{data:(0,f.default)([{title:"Deleted",values:T},{title:"Renamed",values:E},{title:"Created",values:b}])})),I()):I()}},808:function(e,t,a){var n=this&&this.__createBinding||(Object.create?function(e,t,a,n){void 0===n&&(n=a),Object.defineProperty(e,n,{enumerable:!0,get:function(){return t[a]}})}:function(e,t,a,n){void 0===n&&(n=a),e[n]=t[a]}),l=this&&this.__setModuleDefault||(Object.create?function(e,t){Object.defineProperty(e,"default",{enumerable:!0,value:t})}:function(e,t){e.default=t}),r=this&&this.__importStar||function(e){if(e&&e.__esModule)return e;var t={};if(null!=e)for(var a in e)"default"!==a&&Object.prototype.hasOwnProperty.call(e,a)&&n(t,e,a);return l(t,e),t},o=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const d=r(a(689)),s=a(82),u=o(a(618));var i;!function(e){e[e.IN_PROGRESS=0]="IN_PROGRESS",e[e.SUCCESS=1]="SUCCESS",e[e.FAIL=2]="FAIL"}(i||(i={})),t.default=e=>{const{func:t,onDone:a,titleStr:n}=e,[l,r]=(0,d.useState)(n),[o,c]=(0,d.useState)(i.IN_PROGRESS),[m,f]=(0,d.useState)(null);return(0,d.useEffect)((()=>{(async()=>{try{const e=await t({setTitle:r,setError:f});c(i.SUCCESS),a(e)}catch(e){f(e),c(i.FAIL)}})()}),[]),d.default.createElement(s.Box,{flexDirection:"row"},d.default.createElement(s.Box,{marginRight:1},o===i.IN_PROGRESS?d.default.createElement(s.Text,null,"[",d.default.createElement(u.default,{type:"dots"}),"]"):o===i.SUCCESS?d.default.createElement(s.Text,null,"[",d.default.createElement(s.Text,{color:"green"},"✓"),"]"):d.default.createElement(s.Text,null,"[",d.default.createElement(s.Text,{color:"red"},"×"),"]"),o===i.FAIL?d.default.createElement(s.Text,null,l,d.default.createElement(s.Newline,null),d.default.createElement(s.Text,{color:"red"},m.message)):d.default.createElement(d.default.Fragment,null,d.default.createElement(s.Text,null,l))))}},282:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0}),t.promptColumnsConflicts=t.promptTablesConflicts=t.task=void 0;const l=n(a(689)),r=a(259),o=n(a(808)),d=n(a(613)),s=n(a(60)),u=n(a(243)),i=(0,r.proxy)([]);let c;const m=()=>{c||(c=(0,d.default)(i),i.length=0)};t.task=(e,t)=>new Promise((a=>{m(),i.push(l.default.createElement(o.default,{titleStr:e,func:t,onDone:e=>a(e)}))})),t.promptTablesConflicts=({missingTables:e,newTables:t})=>new Promise((a=>{m(),i.push(l.default.createElement(s.default,{onDone:e=>a(e),missingTables:e,newTables:t}))})),t.promptColumnsConflicts=e=>new Promise((t=>{m(),i.push(l.default.createElement(u.default,{onDone:e=>t(e),tableWithColumns:e}))}))},234:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(522);t.default=e=>(0,n.createMachine)({id:"resolveColumns",initial:"table",context:{tableName:e.tableWithColumns.name,addedColumns:e.tableWithColumns.added,deletedColumns:e.tableWithColumns.deleted,missingItemIndex:0,newItemIndex:0,created:[],renamed:[],deleted:[]},states:{table:{entry:(0,n.send)({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingColumnsResolved",actions:["resolveRemaining"]},{target:"done",cond:"isNewColumnsResolved",actions:["resolveMissing"]}],CHOICE_ITEM:{target:"action",actions:["choseItem"]}}},action:{initial:"actionChoice",states:{actionChoice:{on:{DELETE:"#resolveColumns.confirmationDelete",RENAME:"rename"}},rename:{on:{CHOICE_NEW_ITEM:{target:"#resolveColumns.confirmationRename",actions:["choseNewItem"]}}}}},confirmationDelete:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["delete"]}]}},confirmationRename:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["rename"]}]}},final:{entry:(0,n.send)({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingColumnsResolved",actions:["resolveRemaining"]},{target:"table"}]}},done:{}}},{guards:{isMissingColumnsResolved:({deletedColumns:e})=>!e.length,isNewColumnsResolved:({addedColumns:e})=>!e.length},actions:{choseItem:(0,n.assign)({missingItemIndex:(e,t)=>"CHOICE_ITEM"===t.type?t.itemIndex:0}),choseNewItem:(0,n.assign)({newItemIndex:(e,t)=>"CHOICE_NEW_ITEM"===t.type?t.itemIndex:0}),delete:(0,n.assign)({deleted:({missingItemIndex:e,deleted:t,deletedColumns:a})=>[...t,a[e]],deletedColumns:({missingItemIndex:e,deletedColumns:t})=>t.filter(((t,a)=>a!==e))}),rename:(0,n.assign)({renamed:({missingItemIndex:e,newItemIndex:t,renamed:a,addedColumns:n,deletedColumns:l})=>[...a,{old:l[e],new:n[t]}],deletedColumns:({missingItemIndex:e,deletedColumns:t})=>t.filter(((t,a)=>a!==e)),addedColumns:({newItemIndex:e,addedColumns:t})=>t.filter(((t,a)=>a!==e))}),resolveRemaining:(0,n.assign)({created:({addedColumns:e,created:t})=>[...t,...e],addedColumns:e=>[]}),resolveMissing:(0,n.assign)({deleted:({deletedColumns:e,deleted:t})=>[...t,...e],deletedColumns:e=>[]})}})},761:(e,t,a)=>{Object.defineProperty(t,"__esModule",{value:!0});const n=a(522);t.default=e=>(0,n.createMachine)({id:"resolveTables",initial:"table",context:{...e,missingItemIndex:0,newItemIndex:0,createdTables:[],renamedTables:[],deletedTables:[]},states:{table:{entry:(0,n.send)({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingTablesResolved",actions:["resolveRemaining"]},{target:"done",cond:"isNewTablesResolved",actions:["resolveMissing"]}],CHOICE_ITEM:{target:"action",actions:["choseItem"]}}},action:{initial:"actionChoice",states:{actionChoice:{on:{DELETE:"#resolveTables.confirmationDelete",RENAME:"rename"}},rename:{on:{CHOICE_NEW_ITEM:{target:"#resolveTables.confirmationRename",actions:["choseNewItem"]}}}}},confirmationDelete:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["delete"]}]}},confirmationRename:{on:{CANCEL:"action.actionChoice",CONFIRM:[{target:"final",actions:["rename"]}]}},final:{entry:(0,n.send)({type:"NEXT"}),on:{NEXT:[{target:"done",cond:"isMissingTablesResolved",actions:["resolveRemaining"]},{target:"table"}]}},done:{}}},{guards:{isMissingTablesResolved:({missingTables:e})=>!e.length,isNewTablesResolved:({newTables:e})=>!e.length},actions:{choseItem:(0,n.assign)({missingItemIndex:(e,t)=>"CHOICE_ITEM"===t.type?t.itemIndex:0}),choseNewItem:(0,n.assign)({newItemIndex:(e,t)=>"CHOICE_NEW_ITEM"===t.type?t.itemIndex:0}),delete:(0,n.assign)({deletedTables:({missingItemIndex:e,deletedTables:t,missingTables:a})=>[...t,a[e]],missingTables:({missingItemIndex:e,missingTables:t})=>t.filter(((t,a)=>a!==e))}),rename:(0,n.assign)({renamedTables:({missingItemIndex:e,newItemIndex:t,renamedTables:a,newTables:n,missingTables:l})=>[...a,{old:l[e],new:n[t]}],missingTables:({missingItemIndex:e,missingTables:t})=>t.filter(((t,a)=>a!==e)),newTables:({newItemIndex:e,newTables:t})=>t.filter(((t,a)=>a!==e))}),resolveRemaining:(0,n.assign)({createdTables:({newTables:e,createdTables:t})=>[...t,...e],newTables:e=>[]}),resolveMissing:(0,n.assign)({deletedTables:({missingTables:e,deletedTables:t})=>[...t,...e],missingTables:e=>[]})}})},454:(e,t)=>{Object.defineProperty(t,"__esModule",{value:!0}),t.default=e=>{const t=[];return t.length=e.reduce(((e,{values:t})=>e<t.length?t.length:e),0),t.fill({"":""}),t.map(((t,a)=>{const n={};return e.forEach(((t,l)=>{n[e[l].title]=t.values[a]?.old?.name?`${t.values[a]?.old?.name} -> ${t.values[a]?.new?.name}`:t.values[a]?.name||""})),n}))}},313:(e,t)=>{var a,n;Object.defineProperty(t,"__esModule",{value:!0}),t.confirmations=t.actions=t.Confirmation=t.Action=void 0,function(e){e.RENAME="RENAME",e.DELETE="DELETE"}(a=t.Action||(t.Action={})),function(e){e.CANCEL="CANCEL",e.CONFIRM="CONFIRM"}(n=t.Confirmation||(t.Confirmation={})),t.actions=[{key:a.RENAME,label:"Renamed",value:a.RENAME},{key:a.DELETE,label:"Deleted",value:a.DELETE}],t.confirmations=[{key:n.CONFIRM,label:"Yes",value:n.CONFIRM},{key:n.CANCEL,label:"No",value:n.CANCEL}]},572:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const l=n(a(147)),r=n(a(513)),o={version:"1",tables:{},enums:{}};t.default=(e="drizzle",t)=>{const a=e;l.default.readdirSync("./").find((e=>e===a))||l.default.mkdirSync(a);const n=l.default.readdirSync(`./${a}`);let d;if(0===n.length)d=o;else{n.sort();const e=n[n.length-1];console.log(e),d=JSON.parse(l.default.readFileSync(`./${a}/${e}/snapshot.json`).toString())}const s=`${t}/tables/`,u=`${t}/types/`;return{prev:d,cur:(0,r.default)(s,u)}}},980:function(e,t,a){var n=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(t,"__esModule",{value:!0});const l=n(a(7)),r=n(a(147)),o=l.default.createPrinter();t.default=(e,t)=>{const a=[l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamedImports([l.default.createImportSpecifier(void 0,l.default.createIdentifier("AbstractTable")),l.default.createImportSpecifier(void 0,l.default.createIdentifier("DB"))])),l.default.createStringLiteral("drizzle-orm")),l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(l.default.createIdentifier("Enum"),void 0),l.default.createStringLiteral("drizzle-orm/types/type")),l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamedImports([l.default.createImportSpecifier(void 0,l.default.createIdentifier("Pool"))])),l.default.createStringLiteral("pg")),l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(l.default.createIdentifier("Serializer"),void 0),l.default.createStringLiteral("./serializer"))],n=[],d=r.default.readdirSync(e);for(let t=0;t<d.length;t++){const a=`${e}${d[t].split(".")[0]}`;n.push(l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamespaceImport(l.default.createIdentifier(`i${t}`))),l.default.createStringLiteral(a)))}const s=r.default.readdirSync(t);for(let e=0;e<s.length;e++){const a=`${t}${s[e].split(".")[0]}`;n.push(l.default.createImportDeclaration(void 0,void 0,l.default.createImportClause(void 0,l.default.createNamespaceImport(l.default.createIdentifier(`t${e}`))),l.default.createStringLiteral(a)))}const u=[l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("db"),void 0,l.default.createNew(l.default.createIdentifier("DB"),void 0,[l.default.createNew(l.default.createIdentifier("Pool"),void 0,[])]))],l.default.NodeFlags.Const)),l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("serializer"),void 0,l.default.createNew(l.default.createIdentifier("Serializer"),void 0,[]))],l.default.NodeFlags.Const))],i=[];i.push(l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("tables"),void 0,l.default.createArrayLiteral([],!1))],l.default.NodeFlags.Const)));for(let e=0;e<d.length;e++){const t=[l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("table"+e),void 0,l.default.createParen(l.default.createAsExpression(l.default.createAsExpression(l.default.createNew(l.default.createPropertyAccess(l.default.createIdentifier("i"+e),l.default.createIdentifier("default")),void 0,[l.default.createIdentifier("db")]),l.default.createKeywordTypeNode(l.default.SyntaxKind.UnknownKeyword)),l.default.createTypeReferenceNode(l.default.createIdentifier("AbstractTable"),[l.default.createKeywordTypeNode(l.default.SyntaxKind.AnyKeyword)]))))],l.default.NodeFlags.Const)),l.default.createExpressionStatement(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("tables"),l.default.createIdentifier("push")),void 0,[l.default.createIdentifier("table"+e)]))];i.push(...t)}i.push(l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("enums"),void 0,l.default.createArrayLiteral([],!1))],l.default.NodeFlags.Const))),s.length>0&&i.push(l.default.createExpressionStatement(l.default.createCall(l.default.createPropertyAccess(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("Object"),l.default.createIdentifier("values")),void 0,[l.default.createIdentifier("t0")]),l.default.createIdentifier("forEach")),void 0,[l.default.createArrowFunction(void 0,void 0,[l.default.createParameter(void 0,void 0,void 0,l.default.createIdentifier("t"),void 0,void 0,void 0)],void 0,l.default.createToken(l.default.SyntaxKind.EqualsGreaterThanToken),l.default.createBlock([l.default.createExpressionStatement(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("enums"),l.default.createIdentifier("push")),void 0,[l.default.createAsExpression(l.default.createAsExpression(l.default.createIdentifier("t"),l.default.createKeywordTypeNode(l.default.SyntaxKind.UnknownKeyword)),l.default.createTypeReferenceNode(l.default.createIdentifier("Enum"),[l.default.createKeywordTypeNode(l.default.SyntaxKind.AnyKeyword)]))]))],!0))]))),i.push(l.default.createReturn(l.default.createCall(l.default.createPropertyAccess(l.default.createIdentifier("serializer"),l.default.createIdentifier("generate")),void 0,[l.default.createIdentifier("tables"),l.default.createIdentifier("enums")])));const c=[l.default.createVariableStatement(void 0,l.default.createVariableDeclarationList([l.default.createVariableDeclaration(l.default.createIdentifier("testFun"),void 0,l.default.createArrowFunction(void 0,void 0,[],void 0,l.default.createToken(l.default.SyntaxKind.EqualsGreaterThanToken),l.default.createBlock(i,!0)))],l.default.NodeFlags.Const))],m=[l.default.createExpressionStatement(l.default.createCall(l.default.createIdentifier("testFun"),void 0,[]))],f=l.default.createSourceFile("outfile.ts","",l.default.ScriptTarget.ES2015,!0,l.default.ScriptKind.TS),p=[];p.push(...a),p.push(...n),p.push(...u),p.push(...c),p.push(...m);const _=l.default.factory.updateSourceFile(f,p);return o.printFile(_)}},513:function(__unused_webpack_module,exports,__webpack_require__){var __importDefault=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0});const fs_1=__importDefault(__webpack_require__(147)),string_decoder_1=__webpack_require__(330),factory_1=__importDefault(__webpack_require__(980)),esbuild=__webpack_require__(659),serialize=(pathToTables,pathToTypes)=>{const decoder=new string_decoder_1.StringDecoder,preparedFarbic=(0,factory_1.default)(pathToTables,pathToTypes),ts=preparedFarbic;fs_1.default.writeFileSync("__out.ts",ts,"utf-8");const result=esbuild.buildSync({entryPoints:["__out.ts"],bundle:!0,platform:"node",write:!1,external:["pg-native"]});return fs_1.default.rmSync("__out.ts"),eval(decoder.write(result.outputFiles[0].contents))};exports.default=serialize},456:e=>{e.exports=require("@xstate/react")},304:e=>{e.exports=require("commander")},659:e=>{e.exports=require("esbuild")},82:e=>{e.exports=require("ink")},138:e=>{e.exports=require("ink-select-input")},618:e=>{e.exports=require("ink-spinner")},164:e=>{e.exports=require("ink-table")},102:e=>{e.exports=require("pretty-error/start")},689:e=>{e.exports=require("react")},501:e=>{e.exports=require("source-map-support/register")},330:e=>{e.exports=require("string_decoder")},7:e=>{e.exports=require("typescript")},259:e=>{e.exports=require("valtio")},522:e=>{e.exports=require("xstate")},147:e=>{e.exports=require("fs")}},__webpack_module_cache__={};function __webpack_require__(e){var t=__webpack_module_cache__[e];if(void 0!==t)return t.exports;var a=__webpack_module_cache__[e]={exports:{}};return __webpack_modules__[e].call(a.exports,a,a.exports,__webpack_require__),a.exports}__webpack_require__.d=(e,t)=>{for(var a in t)__webpack_require__.o(t,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,get:t[a]})},__webpack_require__.o=(e,t)=>Object.prototype.hasOwnProperty.call(e,t),__webpack_require__.r=e=>{"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};(()=>{const e=__webpack_require__(304);__webpack_require__(501),__webpack_require__(102),__webpack_require__(512),e.program.parse()})()})();
4
+ //# sourceMappingURL=drizzle.js.map