@myrtex-org/form 1.1.86 → 1.1.88
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/esm2022/lib/modules/object-form/components/elements/input/table/input-table.component.mjs
CHANGED
|
@@ -69,23 +69,34 @@ export class InputTableComponent {
|
|
|
69
69
|
this._subscriptions$.push(this._store.select(objectFormSelectors.selectValueModel(this.settings))
|
|
70
70
|
.subscribe((result) => {
|
|
71
71
|
const cloneResult = structuredClone(result);
|
|
72
|
-
//
|
|
72
|
+
// Наша проверка по sysName, которую мы добавили ранее
|
|
73
73
|
if (cloneResult && !Array.isArray(cloneResult) && cloneResult.sysName === this.settings.sysName) {
|
|
74
|
-
//
|
|
74
|
+
// --- ВОТ ЭТОТ НОВЫЙ БЛОК ДЛЯ ВОССТАНОВЛЕНИЯ ДАТ ---
|
|
75
|
+
// Проверяем, есть ли вообще данные внутри пришедшей модели
|
|
76
|
+
if (cloneResult.data && Array.isArray(cloneResult.data)) {
|
|
77
|
+
cloneResult.data.forEach((row) => {
|
|
78
|
+
if (row.data && Array.isArray(row.data)) {
|
|
79
|
+
row.data.forEach((cell) => {
|
|
80
|
+
// Если тип компонента — дата, значение — строка и в ней есть наш разделитель '/'
|
|
81
|
+
if (cell.type === 'inputDate' && typeof cell.value === 'string' && cell.value.includes('/')) {
|
|
82
|
+
console.log(`[Table <- Store Parsing] Восстанавливаем range-дату из строки для ${cell.sysName}:`, cell.value);
|
|
83
|
+
// Разрезаем строку "2026-05-05/2026-05-07" обратно в массив ['2026-05-05', '2026-05-07']
|
|
84
|
+
cell.value = cell.value.split('/');
|
|
85
|
+
}
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
// -------------------------------------------------
|
|
91
|
+
// Проверяем, изменились ли данные по сравнению с текущими
|
|
75
92
|
const isDataChanged = JSON.stringify(this.model?.data) !== JSON.stringify(cloneResult.data);
|
|
76
93
|
if (isDataChanged) {
|
|
77
|
-
console.log(`[Table -> Store Apply] [${this.settings.sysName}]
|
|
94
|
+
console.log(`[Table -> Store Apply] [${this.settings.sysName}] Синхронизируем строки.`);
|
|
78
95
|
this.model = structuredClone(cloneResult);
|
|
96
|
+
// Извлекаем строки (теперь внутри cell.value уже лежит правильный массив, и они не занулятся!)
|
|
79
97
|
this._rows = this._extractRows(this.model.data);
|
|
80
98
|
this._initDataSource(this._rows);
|
|
81
99
|
}
|
|
82
|
-
else {
|
|
83
|
-
console.log(`[Table -> Store Skip] [${this.settings.sysName}] Данные нашей таблицы идентичны. Пропускаем.`);
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
else if (cloneResult && !Array.isArray(cloneResult)) {
|
|
87
|
-
// Логируем игнорирование чужих таблиц (itb4, itb5)
|
|
88
|
-
console.log(`[Table -> Store Ignore] Игнорируем Стор. Текущая таблица: ${this.settings.sysName}, Пришло для: ${cloneResult.sysName}`);
|
|
89
100
|
}
|
|
90
101
|
}));
|
|
91
102
|
}
|
|
@@ -104,7 +115,17 @@ export class InputTableComponent {
|
|
|
104
115
|
isCheckRequired: this._isCheckRequired
|
|
105
116
|
}).afterClosed().subscribe(resolve => {
|
|
106
117
|
console.log('[Table <- Modal Closed (Create)] Результат из модалки:', structuredClone(resolve));
|
|
107
|
-
if (resolve.result) {
|
|
118
|
+
if (resolve && resolve.result && resolve.rowModel) {
|
|
119
|
+
// КРИТИЧЕСКИЙ ХАК: Склеиваем массив диапазона дат в строку перед отправкой в Стор
|
|
120
|
+
if (resolve.rowModel.data && Array.isArray(resolve.rowModel.data)) {
|
|
121
|
+
resolve.rowModel.data.forEach((cell) => {
|
|
122
|
+
if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
|
|
123
|
+
console.log(`[Table <- Modal] Найдена рендж-дата в ${cell.sysName}. Склеиваем в строку:`, cell.value);
|
|
124
|
+
cell.value = cell.value.join('/'); // Превращаем ['2026-05-05...', '2026-05-07...'] в "дата1/дата2"
|
|
125
|
+
}
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
// Накатываем обновленную модель в локальные строки
|
|
108
129
|
this._rows = [...structuredClone(this._rows), resolve.rowModel];
|
|
109
130
|
this._initDataSource(this._rows);
|
|
110
131
|
this._changeSubject$.next(this._buildTableValueModel());
|
|
@@ -135,16 +156,21 @@ export class InputTableComponent {
|
|
|
135
156
|
settings: this.settings,
|
|
136
157
|
rowModel: rowModelClone
|
|
137
158
|
}).afterClosed().subscribe(resolve => {
|
|
138
|
-
console.log('[Table <- Modal Closed (
|
|
139
|
-
if (resolve.result) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
159
|
+
console.log('[Table <- Modal Closed (Create)] Результат из модалки:', structuredClone(resolve));
|
|
160
|
+
if (resolve && resolve.result && resolve.rowModel) {
|
|
161
|
+
// КРИТИЧЕСКИЙ ХАК: Склеиваем массив диапазона дат в строку перед отправкой в Стор
|
|
162
|
+
if (resolve.rowModel.data && Array.isArray(resolve.rowModel.data)) {
|
|
163
|
+
resolve.rowModel.data.forEach((cell) => {
|
|
164
|
+
if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
|
|
165
|
+
console.log(`[Table <- Modal] Найдена рендж-дата в ${cell.sysName}. Склеиваем в строку:`, cell.value);
|
|
166
|
+
cell.value = cell.value.join('/'); // Превращаем ['2026-05-05...', '2026-05-07...'] в "дата1/дата2"
|
|
167
|
+
}
|
|
168
|
+
});
|
|
147
169
|
}
|
|
170
|
+
// Накатываем обновленную модель в локальные строки
|
|
171
|
+
this._rows = [...structuredClone(this._rows), resolve.rowModel];
|
|
172
|
+
this._initDataSource(this._rows);
|
|
173
|
+
this._changeSubject$.next(this._buildTableValueModel());
|
|
148
174
|
}
|
|
149
175
|
});
|
|
150
176
|
}
|
|
@@ -336,17 +362,41 @@ export class InputTableComponent {
|
|
|
336
362
|
});
|
|
337
363
|
});
|
|
338
364
|
}
|
|
365
|
+
// private _buildTableValueModel(): TableValueModel {
|
|
366
|
+
// console.log('[Table -> _buildTableValueModel] Старт сборки модели для Стора. Текущие локальные _rows:', structuredClone(this._rows));
|
|
367
|
+
// const groupedData = this._buildGroupedItems(this._rows, this.settings.options.groups || [], 0);
|
|
368
|
+
// const totals = this._calculateTotals(this._rows);
|
|
369
|
+
// this.model = {
|
|
370
|
+
// sysName: this.settings.sysName,
|
|
371
|
+
// type: this.settings.type,
|
|
372
|
+
// data: groupedData,
|
|
373
|
+
// totals
|
|
374
|
+
// };
|
|
375
|
+
// console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
|
|
376
|
+
// return structuredClone(this.model);
|
|
377
|
+
// }
|
|
339
378
|
_buildTableValueModel() {
|
|
340
|
-
|
|
341
|
-
const
|
|
342
|
-
|
|
379
|
+
// Глубокое клонирование строк, чтобы не испортить UI до отправки
|
|
380
|
+
const rowsClone = structuredClone(this._rows);
|
|
381
|
+
// Пробегаемся по ячейкам и если видим массив дат (range) — склеиваем в строку
|
|
382
|
+
rowsClone.forEach(row => {
|
|
383
|
+
if (row.data) {
|
|
384
|
+
row.data.forEach(cell => {
|
|
385
|
+
if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
|
|
386
|
+
// Склеиваем массив ['2026-05-05...', '2026-05-07...'] в строку "2026-05-05.../2026-05-07..."
|
|
387
|
+
cell.value = cell.value.join('/');
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
}
|
|
391
|
+
});
|
|
392
|
+
const groupedData = this._buildGroupedItems(rowsClone, this.settings.options.groups || [], 0);
|
|
393
|
+
const totals = this._calculateTotals(rowsClone);
|
|
343
394
|
this.model = {
|
|
344
395
|
sysName: this.settings.sysName,
|
|
345
396
|
type: this.settings.type,
|
|
346
397
|
data: groupedData,
|
|
347
398
|
totals
|
|
348
399
|
};
|
|
349
|
-
console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
|
|
350
400
|
return structuredClone(this.model);
|
|
351
401
|
}
|
|
352
402
|
_buildGroupedItems(rows, groupFields, level) {
|
|
@@ -472,4 +522,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImpo
|
|
|
472
522
|
}], changed: [{
|
|
473
523
|
type: Output
|
|
474
524
|
}] } });
|
|
475
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUtMLGFBQWEsRUFHZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFD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Z0JBQ3RCLElBQUksQ0FBQyxJQUFJLENBQUM7b0JBQ1IsR0FBRyxJQUFJO29CQUNQLFFBQVEsRUFBRSxhQUFhLENBQUMsR0FBRztpQkFDNUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxHQUFHLElBQXVCLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFlO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQXFCLENBQUM7UUFDdkMsT0FBTyxPQUFPLFFBQVEsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7K0dBbGlCVSxtQkFBbUI7bUdBQW5CLG1CQUFtQix5VUN6Q2hDLDh3SkF5SEE7OzRGRGhGYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBeUJ0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sSUFBSTtzQkFBaEIsS0FBSztnQkFXa0MsUUFBUTtzQkFBL0MsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNNLFlBQVk7c0JBQXZELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFFekIsT0FBTztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlciwgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBEYXRlVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9lbnVtcyc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRNb2RlbEJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEeERhdGFHcmlkQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRWYWx1ZU1vZGVsLFxyXG4gIFNlY3Rpb25WYWx1ZU1vZGVsLFxyXG4gIFRhYmxlR3JvdXBNb2RlbCxcclxuICBUYWJsZUl0ZW0sXHJcbiAgVGFibGVJdGVtVHlwZSxcclxuICBUYWJsZVJvd01vZGVsLFxyXG4gIFRhYmxlVmFsdWVNb2RlbFxyXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IElucHV0RGF0ZU1vZGVsLCBJbnB1dE51bWJlck1vZGVsLCBJbnB1dFNlbGVjdE1vZGVsLCBJbnB1dFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZWxlbWV0cy9pbnB1dHMnO1xyXG5pbXBvcnQgeyBvYmplY3RGb3JtQWN0aW9ucywgb2JqZWN0Rm9ybVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0b3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnQG15cnRleC1vcmcvdWknO1xyXG5pbXBvcnQgeyBJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBnZXRSb3dNb2RlbCB9IGZyb20gJy4vaGVscGVycy9nZXQtcm93LW1vZGVsLmhlbHBlcic7XHJcbmltcG9ydCB7IENvbHVtbk1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3JlZmVyZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtaW5wdXQtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtdGFibGUuY29tcG9uZW50Lmxlc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICB0eXBlID0gQ29tcG9uZW50VHlwZS5JbnB1dFRhYmxlO1xyXG5cclxuICBwcml2YXRlIF9yZWZlcmVuY2VTZXJ2aWNlOiBSZWZlcmVuY2VTZXJ2aWNlID0gaW5qZWN0KFJlZmVyZW5jZVNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9sb29rdXBzQ2FjaGU6IE1hcDxzdHJpbmcsIGFueVtdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlID0gaW5qZWN0KFN0b3JlKTtcclxuICBwcml2YXRlIF9kZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX21vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlID0gaW5qZWN0KE1vZGFsU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgX2NoYW5nZVN1YmplY3QkOiBTdWJqZWN0PFRhYmxlVmFsdWVNb2RlbD4gPSBuZXcgU3ViamVjdDxUYWJsZVZhbHVlTW9kZWw+KCk7XHJcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHByaXZhdGUgX2lzQ2hlY2tSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2NhbkVkaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yb3dzOiBUYWJsZVJvd01vZGVsW10gPSBbXTtcclxuXHJcbiAgcHVibGljIG1vZGVsITogVGFibGVWYWx1ZU1vZGVsO1xyXG4gIHB1YmxpYyBzZXR0aW5ncyE6IElucHV0VGFibGVNb2RlbDtcclxuICBwdWJsaWMgZGF0YVNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XHJcbiAgcHVibGljIGNvbHVtbnM6IENvbHVtbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgdmFsdWVzOiBTZWN0aW9uVmFsdWVNb2RlbFtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRhKHNldHRpbmdzOiBDb21wb25lbnRNb2RlbEJhc2UpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncyBhcyBJbnB1dFRhYmxlTW9kZWw7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtzeXNOYW1lOiBzZXR0aW5ncy5zeXNOYW1lLCB0eXBlOiBzZXR0aW5ncy50eXBlLCBkYXRhOiBbXSwgdG90YWxzOiBbXX07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcblxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIHRoaXMuX2luaXRDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdkYXRhR3JpZCcsIHtzdGF0aWM6IGZhbHNlfSkgZGF0YUdyaWQhOiBEeERhdGFHcmlkQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRUZW1wbGF0ZScsIHtzdGF0aWM6IGZhbHNlfSkgZWRpdFRlbXBsYXRlITogYW55O1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDb21wb25lbnRWYWx1ZU1vZGVsIHwgQ29tcG9uZW50VmFsdWVNb2RlbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50VmFsdWVNb2RlbCB8IENvbXBvbmVudFZhbHVlTW9kZWxbXT4oKTtcclxuXHJcbiAgcHVibGljIGdldCByb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0FueVRvdGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cy5zb21lKGMgPT5cclxuICAgICAgdGhpcy5zaG93VG90YWwoYykgfHwgYy5jb21wb25lbnRzPy5zb21lKGlubmVyID0+IHRoaXMuc2hvd1RvdGFsKGlubmVyKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZWROb0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNDaGVja1JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbml0TW9kZWwoKTtcclxuXHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoNzAwKSxcclxuICAgICkuc3Vic2NyaWJlKG1vZGVsID0+IHtcclxuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gob2JqZWN0Rm9ybUFjdGlvbnMudXBkYXRlVmFsdWVzKHt2YWx1ZTogbW9kZWx9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5wdXNoKHRoaXMuX3N0b3JlLnNlbGVjdChvYmplY3RGb3JtU2VsZWN0b3JzLnNlbGVjdElzQ2hlY2tSZXF1aXJlZCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIHRoaXMuX2lzQ2hlY2tSZXF1aXJlZCA9IHJlc3VsdDtcclxuICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLnB1c2godGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0Q2FuRWRpdE9iamVjdClcclxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhbkVkaXRPYmplY3QgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzPy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbml0Q29sdW1ucyh0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQucHVzaChcclxuICAgICAgdGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0VmFsdWVNb2RlbCh0aGlzLnNldHRpbmdzKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsIHwgKENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsKVtdKSA9PiB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGNsb25lUmVzdWx0ID0gc3RydWN0dXJlZENsb25lKHJlc3VsdCBhcyBUYWJsZVZhbHVlTW9kZWwgfCBudWxsKTtcclxuXHJcbiAgICAgICAgICAvLyDQmtCg0JjQotCY0KfQldCh0JrQmNCZINCk0JjQm9Cs0KLQoDog0KDQtdCw0LPQuNGA0YPQtdC8INGC0L7Qu9GM0LrQviDQvdCwINCh0JLQntCZIHN5c05hbWVcclxuICAgICAgICAgIGlmIChjbG9uZVJlc3VsdCAmJiAhQXJyYXkuaXNBcnJheShjbG9uZVJlc3VsdCkgJiYgY2xvbmVSZXN1bHQuc3lzTmFtZSA9PT0gdGhpcy5zZXR0aW5ncy5zeXNOYW1lKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyDQodGA0LDQstC90LjQstCw0LXQvCDQuNC80LXQvdC90L4g0YHRgtGA0L7QutC+0LLRi9C1IEpTT04t0L/RgNC10LTRgdGC0LDQstC70LXQvdC40Y8g0LTQsNC90L3Ri9GFLCDRh9GC0L7QsdGLINC40LfQsdC10LbQsNGC0Ywg0LvQvtC20L3Ri9GFINGB0YDQsNCx0LDRgtGL0LLQsNC90LjQuSBkZWVwLWNoZWNrXHJcbiAgICAgICAgICAgIGNvbnN0IGlzRGF0YUNoYW5nZWQgPSBKU09OLnN0cmluZ2lmeSh0aGlzLm1vZGVsPy5kYXRhKSAhPT0gSlNPTi5zdHJpbmdpZnkoY2xvbmVSZXN1bHQuZGF0YSk7XHJcblxyXG4gICAgICAgICAgICBpZiAoaXNEYXRhQ2hhbmdlZCkge1xyXG4gICAgICAgICAgICAgIGNvbnNvbGUubG9nKGBbVGFibGUgLT4gU3RvcmUgQXBwbHldIFske3RoaXMuc2V0dGluZ3Muc3lzTmFtZX1dINCd0LDRiNCwINGC0LDQsdC70LjRhtCwINC+0LHQvdC+0LLQuNC70LDRgdGMLiDQodC40L3RhdGA0L7QvdC40LfQuNGA0YPQtdC8INGB0YLRgNC+0LrQuC5gKTtcclxuICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gc3RydWN0dXJlZENsb25lKGNsb25lUmVzdWx0KTtcclxuICAgICAgICAgICAgICB0aGlzLl9yb3dzID0gdGhpcy5fZXh0cmFjdFJvd3ModGhpcy5tb2RlbC5kYXRhKTtcclxuICAgICAgICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1RhYmxlIC0+IFN0b3JlIFNraXBdIFske3RoaXMuc2V0dGluZ3Muc3lzTmFtZX1dINCU0LDQvdC90YvQtSDQvdCw0YjQtdC5INGC0LDQsdC70LjRhtGLINC40LTQtdC90YLQuNGH0L3Riy4g0J/RgNC+0L/Rg9GB0LrQsNC10LwuYCk7XHJcbiAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICB9IGVsc2UgaWYgKGNsb25lUmVzdWx0ICYmICFBcnJheS5pc0FycmF5KGNsb25lUmVzdWx0KSkge1xyXG4gICAgICAgICAgICAvLyDQm9C+0LPQuNGA0YPQtdC8INC40LPQvdC+0YDQuNGA0L7QstCw0L3QuNC1INGH0YPQttC40YUg0YLQsNCx0LvQuNGGIChpdGI0LCBpdGI1KVxyXG4gICAgICAgICAgICBjb25zb2xlLmxvZyhgW1RhYmxlIC0+IFN0b3JlIElnbm9yZV0g0JjQs9C90L7RgNC40YDRg9C10Lwg0KHRgtC+0YAuINCi0LXQutGD0YnQsNGPINGC0LDQsdC70LjRhtCwOiAke3RoaXMuc2V0dGluZ3Muc3lzTmFtZX0sINCf0YDQuNGI0LvQviDQtNC70Y86ICR7Y2xvbmVSZXN1bHQuc3lzTmFtZX1gKTtcclxuICAgICAgICAgIH1cclxuICAgICAgICB9KVxyXG4gICAgKTtcclxuICB9XHJcblxyXG4gIG5nT25EZXN0cm95KCk6IHZvaWQge1xyXG4gICAgdGhpcy5fY2hhbmdlU3ViamVjdCQudW5zdWJzY3JpYmUoKTtcclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLmZvckVhY2goKHN1YnNjcmlwdGlvbikgPT4gc3Vic2NyaXB0aW9uLnVuc3Vic2NyaWJlKCkpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNyZWF0ZVJvdygpIHtcclxuICAgIGNvbnN0IGluaXRpYWxSb3dNb2RlbCA9IGdldFJvd01vZGVsKHRoaXMuc2V0dGluZ3MpO1xyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBDcmVhdGUgUm93XSDQmNGB0YXQvtC00L3QsNGPINC80L7QtNC10LvRjCDQtNC70Y8g0L3QvtCy0L7QuSDRgdGC0YDQvtC60Lg6Jywgc3RydWN0dXJlZENsb25lKGluaXRpYWxSb3dNb2RlbCkpO1xyXG5cclxuICAgIHRoaXMuX21vZGFsU2VydmljZS5vcGVuKElucHV0VGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICB0aXRsZTogJ9Ch0L7Qt9C00LDQvdC40LUg0YHRgtGA0L7QutC4JyxcclxuICAgICAgb2tUZXh0OiAn0KHQvtC30LTQsNGC0YwnLFxyXG4gICAgICBzZXR0aW5nczogdGhpcy5zZXR0aW5ncyxcclxuICAgICAgcm93TW9kZWw6IGdldFJvd01vZGVsKHRoaXMuc2V0dGluZ3MpLFxyXG4gICAgICBpc0NoZWNrUmVxdWlyZWQ6IHRoaXMuX2lzQ2hlY2tSZXF1aXJlZFxyXG4gICAgfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzb2x2ZSA9PiB7XHJcbiAgICAgIGNvbnNvbGUubG9nKCdbVGFibGUgPC0gTW9kYWwgQ2xvc2VkIChDcmVhdGUpXSDQoNC10LfRg9C70YzRgtCw0YIg0LjQtyDQvNC+0LTQsNC70LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUocmVzb2x2ZSkpO1xyXG5cclxuICAgICAgaWYgKHJlc29sdmUucmVzdWx0KSB7XHJcbiAgICAgICAgdGhpcy5fcm93cyA9IFsuLi5zdHJ1Y3R1cmVkQ2xvbmUodGhpcy5fcm93cyksIHJlc29sdmUucm93TW9kZWxdO1xyXG5cclxuICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICAgICAgdGhpcy5fY2hhbmdlU3ViamVjdCQubmV4dCh0aGlzLl9idWlsZFRhYmxlVmFsdWVNb2RlbCgpKTtcclxuICAgICAgfVxyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZGVsZXRlUm93KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpbmRSb3cgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcblxyXG4gICAgaWYgKGZpbmRSb3cpIHtcclxuICAgICAgdGhpcy5fcm93cyA9IHRoaXMuX3Jvd3MuZmlsdGVyKGl0ZW0gPT4gaXRlbS5pZCAhPT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcblxyXG4gICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuICF0aGlzLl9jYW5FZGl0T2JqZWN0O1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGVkaXRSb3coZXZlbnQ6IGFueSkge1xyXG4gICAgY29uc3QgZmluZFJvdyA9IHRoaXMuX3Jvd3MuZmluZChpdGVtID0+IGl0ZW0uaWQgPT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gRWRpdCBSb3ddINCU0LDQvdC90YvQtSDRgdGC0YDQvtC60Lgg0LjQtyDQutC70LjQutCwIChldmVudC5yb3cuZGF0YSk6JywgZXZlbnQucm93LmRhdGEpO1xyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBFZGl0IFJvd10g0J3QsNC50LTQtdC90L4g0LIg0LvQvtC60LDQu9GM0L3QvtC8IHJvd3M6Jywgc3RydWN0dXJlZENsb25lKGZpbmRSb3cpKTtcclxuICAgIC8vIGNvbnN0IGZpbmRSb3c6IFRhYmxlUm93TW9kZWwgfCB1bmRlZmluZWQgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcblxyXG4gICAgaWYgKGZpbmRSb3cpIHtcclxuICAgICAgY29uc3Qgcm93TW9kZWxDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZShmaW5kUm93KTtcclxuXHJcbiAgICAgIHRoaXMuX21vZGFsU2VydmljZS5vcGVuKElucHV0VGFibGVNb2RhbENvbXBvbmVudCwge1xyXG4gICAgICAgIHRpdGxlOiAn0KDQtdC00LDQutGC0LjRgNC+0LLQsNC90LjQtSDRgdGC0YDQvtC60LgnLFxyXG4gICAgICAgIG9rVGV4dDogJ9Ch0L7RhdGA0LDQvdC40YLRjCcsXHJcbiAgICAgICAgc2V0dGluZ3M6IHRoaXMuc2V0dGluZ3MsXHJcbiAgICAgICAgcm93TW9kZWw6IHJvd01vZGVsQ2xvbmVcclxuICAgICAgfSkuYWZ0ZXJDbG9zZWQoKS5zdWJzY3JpYmUocmVzb2x2ZSA9PiB7XHJcbiAgICAgICAgY29uc29sZS5sb2coJ1tUYWJsZSA8LSBNb2RhbCBDbG9zZWQgKEVkaXQpXSDQoNC10LfRg9C70YzRgtCw0YIg0LjQtyDQvNC+0LTQsNC70LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUocmVzb2x2ZSkpO1xyXG5cclxuICAgICAgICBpZiAocmVzb2x2ZS5yZXN1bHQpIHtcclxuICAgICAgICAgIGNvbnN0IGNsb25lUm93cyA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9yb3dzKTtcclxuICAgICAgICAgIGNvbnN0IGVkaXRhYmxlUm93ID0gY2xvbmVSb3dzLmZpbmQocm93ID0+IHJvdy5pZCA9PT0gcmVzb2x2ZS5yb3dNb2RlbC5pZCk7XHJcblxyXG4gICAgICAgICAgaWYgKGVkaXRhYmxlUm93KSB7XHJcbiAgICAgICAgICAgIGVkaXRhYmxlUm93LmRhdGEgPSByZXNvbHZlLnJvd01vZGVsLmRhdGE7XHJcbiAgICAgICAgICAgIHRoaXMuX3Jvd3MgPSBjbG9uZVJvd3M7XHJcbiAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG4gICAgICAgICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKSB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dERhdGU6XHJcbiAgICAgICAgc3dpdGNoICgoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnZpZXdUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIERhdGVUeXBlRW51bS5EYXRlVGltZTpcclxuICAgICAgICAgICAgcmV0dXJuICdkZC5NTS55eXl5IGhoOm1tJztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiAnZGQuTU0ueXl5eSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhVHlwZShjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSkge1xyXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xyXG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW5wdXREYXRlOlxyXG4gICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dFN3aXRjaDpcclxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dUb3RhbChjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0TnVtYmVyKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IElucHV0TnVtYmVyTW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXROdW1iZXJNb2RlbDtcclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50Lm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVG90YWxDb2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpLm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TW9kZWwoKSB7XHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogW10sXHJcbiAgICAgIHRvdGFsczogW11cclxuICAgIH07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RGF0YVNvdXJjZShkYXRhOiBUYWJsZVJvd01vZGVsW10pIHtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gX2luaXREYXRhU291cmNlXSDQodCx0L7RgNC60LAgZGF0YVNvdXJjZSDQuNC3IHJvd3M6Jywgc3RydWN0dXJlZENsb25lKGRhdGEpKTtcclxuICAgIFxyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YS5tYXAoKGl0ZW06IFRhYmxlUm93TW9kZWwpID0+IHtcclxuICAgICAgY29uc3QgbmV3RGF0YUl0ZW06IGFueSA9IHt9O1xyXG4gICAgICBcclxuICAgICAgZm9yIChsZXQgaSBpbiBpdGVtLmRhdGEpIHtcclxuICAgICAgICBjb25zdCBjZWxsID0gaXRlbS5kYXRhW2ldO1xyXG4gICAgICAgIC8vINCd0LDQv9GA0Y/QvNGD0Y4g0LHQtdGA0LXQvCDQt9C90LDRh9C10L3QuNC1INGP0YfQtdC50LrQuCAo0LHRg9C00Ywg0YLQviDRgdGC0YDQvtC60LAg0LjQu9C4INC80LDRgdGB0LjQsiDQtNCw0YIpXHJcbiAgICAgICAgbmV3RGF0YUl0ZW1bY2VsbC5zeXNOYW1lXSA9IGNlbGwudmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIG5ld0RhdGFJdGVtLmlkID0gaXRlbS5pZDtcclxuICAgICAgcmV0dXJuIG5ld0RhdGFJdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBfaW5pdERhdGFTb3VyY2VdINCY0YLQvtCz0L7QstGL0LkgZGF0YVNvdXJjZSwg0L/QtdGA0LXQtNCw0L3QvdGL0Lkg0LIgRGF0YUdyaWQ6Jywgc3RydWN0dXJlZENsb25lKHRoaXMuZGF0YVNvdXJjZSkpO1xyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGFHcmlkPy5pbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLmRhdGFHcmlkLmluc3RhbmNlLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRDb2x1bW5zKGNvbXBvbmVudHM6IENvbXBvbmVudE1vZGVsQmFzZVtdKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMgPSBjb21wb25lbnRzLm1hcChjID0+IHRoaXMuX3RyYW5zZm9ybUNvbHVtbihzdHJ1Y3R1cmVkQ2xvbmUoYykpKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xyXG4gICAgICAgIGNhcHRpb246ICcnLFxyXG4gICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgY3NzQ2xhc3M6ICdjdXN0b20tY2VsbC1jb250cm9scycsXHJcbiAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ2VkaXRCdXR0b25UZW1wbGF0ZScsXHJcbiAgICAgICAgICAgIGhpbnQ6ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCcsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ2RlbGV0ZUJ1dHRvblRlbXBsYXRlJyxcclxuICAgICAgICAgICAgaGludDogJ9Cj0LTQsNC70LjRgtGMJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdHJhbnNmb3JtQ29sdW1uKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKTogQ29sdW1uTW9kZWwge1xyXG4gICAgY29uc3QgZGF0YVR5cGUgPSB0aGlzLmdldERhdGFUeXBlKGNvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW5Nb2RlbCA9IHtcclxuICAgICAgY2FwdGlvbjogY29tcG9uZW50Lm9wdGlvbnMubGFiZWwgfHwgJycsXHJcbiAgICAgIGNvbHVtbnM6IGNvbXBvbmVudC5jb21wb25lbnRzLm1hcChjID0+IHRoaXMuX3RyYW5zZm9ybUNvbHVtbihzdHJ1Y3R1cmVkQ2xvbmUoYykpKSxcclxuICAgICAgZGF0YUZpZWxkOiBjb21wb25lbnQuc3lzTmFtZSxcclxuICAgICAgZGF0YVR5cGU6IHRoaXMuZ2V0RGF0YVR5cGUoY29tcG9uZW50KSxcclxuICAgICAgZm9ybWF0OiB0aGlzLmdldEZvcm1hdChjb21wb25lbnQpLFxyXG4gICAgICBtaW5XaWR0aDogMTYwXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0RGF0ZSAmJiAoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnJhbmdlKSB7XHJcbiAgICAgIGNvbHVtbi5jYWxjdWxhdGVDZWxsVmFsdWUgPSAocm93RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gcm93RGF0YVtjb21wb25lbnQuc3lzTmFtZV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSAmJiBkYXRlUmFuZ2UubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKGRhdGVTdHI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWRhdGVTdHIpIHJldHVybiAnJztcclxuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGVTdHIpO1xyXG4gICAgICAgICAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgY29uc3QgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2RheX0uJHttb250aH0uJHt5ZWFyfWA7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN0YXJ0Rm9ybWF0dGVkID0gZm9ybWF0RGF0ZShkYXRlUmFuZ2VbMF0pO1xyXG4gICAgICAgICAgY29uc3QgZW5kRm9ybWF0dGVkID0gZm9ybWF0RGF0ZShkYXRlUmFuZ2VbMV0pO1xyXG5cclxuICAgICAgICAgIGlmIChzdGFydEZvcm1hdHRlZCAmJiBlbmRGb3JtYXR0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3N0YXJ0Rm9ybWF0dGVkfSDigJQgJHtlbmRGb3JtYXR0ZWR9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBzdGFydEZvcm1hdHRlZCB8fCBlbmRGb3JtYXR0ZWQgfHwgJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBkYXRlUmFuZ2UgfHwgJyc7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29sdW1uLmNhbGN1bGF0ZUNlbGxWYWx1ZSA9IChyb3dEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd0RhdGFbY29tcG9uZW50LnN5c05hbWVdO1xyXG4gICAgICAgIC8vINCV0YHQu9C4IHRydWUg4oCUINCU0LAsINC10YHQu9C4IGZhbHNlLCBcIlwiINC40LvQuCBudWxsIOKAlCDQndC10YJcclxuICAgICAgICByZXR1cm4gISF2YWx1ZTsgXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4ubG9va3VwID0ge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IFtcclxuICAgICAgICAgIHsgdmFsdWU6IHRydWUsIGRpc3BsYXlWYWx1ZTogJ9CU0LAnIH0sXHJcbiAgICAgICAgICB7IHZhbHVlOiBmYWxzZSwgZGlzcGxheVZhbHVlOiAn0J3QtdGCJyB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICdkaXNwbGF5VmFsdWUnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0U2VsZWN0KSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdE1vZGVsID0gY29tcG9uZW50IGFzIElucHV0U2VsZWN0TW9kZWw7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0TW9kZWwub3B0aW9ucy5tYW51YWwpIHtcclxuICAgICAgICBjb2x1bW4ubG9va3VwID0ge1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2VsZWN0TW9kZWwub3B0aW9ucy5pdGVtcyxcclxuICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCdcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE1vZGVsLm9wdGlvbnMuZGlyZWN0b3J5Py5bMF0pIHtcclxuICAgICAgICBjb25zdCBkaXJlY3RvcnlOYW1lID0gc2VsZWN0TW9kZWwub3B0aW9ucy5kaXJlY3RvcnlbMF07XHJcblxyXG4gICAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgICAvLyDQntCx0L7RgNCw0YfQuNCy0LDQtdC8INCyIEN1c3RvbVN0b3JlINC00LvRjyDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8g0YLQuNC/0LDQvCBEZXZFeHRyZW1lXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgQ3VzdG9tU3RvcmUoe1xyXG4gICAgICAgICAgICBrZXk6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgIGxvYWQ6ICgpID0+IHRoaXMuZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lKSxcclxuICAgICAgICAgICAgYnlLZXk6IChrZXkpID0+IHRoaXMuZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lKS50aGVuKGl0ZW1zID0+IGl0ZW1zLmZpbmQoaSA9PiBpLnZhbHVlID09PSBrZXkpKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaW5kSWR4ID0gdGhpcy5zZXR0aW5ncy5vcHRpb25zLmdyb3Vwcy5maW5kSW5kZXgoeCA9PiB4ID09PSBjb21wb25lbnQuc3lzTmFtZSk7XHJcblxyXG4gICAgICBpZiAoZmluZElkeCAhPT0gLTEpIHtcclxuICAgICAgICBjb2x1bW4uZ3JvdXBJbmRleCA9IGZpbmRJZHhcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0LrRjdGIXHJcbiAgICBpZiAodGhpcy5fbG9va3Vwc0NhY2hlLmhhcyhkaXJlY3RvcnlOYW1lKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2xvb2t1cHNDYWNoZS5nZXQoZGlyZWN0b3J5TmFtZSkhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDQl9Cw0L/RgNCw0YjQuNCy0LDQtdC8INC00LDQvdC90YvQtSAo0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0YLQvtGCINC20LUgb2JqZWN0SWQsINGH0YLQviDQuCDQsiDQvNC+0LTQsNC70LrQtSlcclxuICAgIC8vINCj0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+IG9iamVjdElkINC00L7RgdGC0YPQv9C10L0g0LIg0Y3RgtC+0Lwg0LrQvtC80L/QvtC90LXQvdGC0LVcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLl9yZWZlcmVuY2VTZXJ2aWNlLmdldFJlZmVyZW5jZXMoZGlyZWN0b3J5TmFtZSwgKHRoaXMgYXMgYW55KS5vYmplY3RJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IChyZXN1bHQ/LnJvd3MgfHwgW10pLm1hcCgocm93OiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgIHZhbHVlOiByb3cuYSxcclxuICAgICAgICAgICAgdGV4dDogcm93LmJcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIHRoaXMuX2xvb2t1cHNDYWNoZS5zZXQoZGlyZWN0b3J5TmFtZSwgaXRlbXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZShpdGVtcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4gcmVzb2x2ZShbXSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCk6IFRhYmxlVmFsdWVNb2RlbCB7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9idWlsZFRhYmxlVmFsdWVNb2RlbF0g0KHRgtCw0YDRgiDRgdCx0L7RgNC60Lgg0LzQvtC00LXQu9C4INC00LvRjyDQodGC0L7RgNCwLiDQotC10LrRg9GJ0LjQtSDQu9C+0LrQsNC70YzQvdGL0LUgX3Jvd3M6Jywgc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpKTtcclxuICAgIFxyXG4gICAgY29uc3QgZ3JvdXBlZERhdGEgPSB0aGlzLl9idWlsZEdyb3VwZWRJdGVtcyh0aGlzLl9yb3dzLCB0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzIHx8IFtdLCAwKTtcclxuICAgIGNvbnN0IHRvdGFscyA9IHRoaXMuX2NhbGN1bGF0ZVRvdGFscyh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogZ3JvdXBlZERhdGEsXHJcbiAgICAgIHRvdGFsc1xyXG4gICAgfTtcclxuXHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9idWlsZFRhYmxlVmFsdWVNb2RlbF0g0KHRhNC+0YDQvNC40YDQvtCy0LDQvdC90LDRjyDQvNC+0LTQtdC70Ywg0LTQu9GPINC+0YLQv9GA0LDQstC60Lgg0LIg0KHRgtC+0YA6Jywgc3RydWN0dXJlZENsb25lKHRoaXMubW9kZWwpKTtcclxuICAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5tb2RlbCk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9idWlsZEdyb3VwZWRJdGVtcyhyb3dzOiBUYWJsZVJvd01vZGVsW10sIGdyb3VwRmllbGRzOiBzdHJpbmdbXSwgbGV2ZWw6IG51bWJlcik6IFRhYmxlSXRlbVtdIHtcclxuICAgIGlmICghZ3JvdXBGaWVsZHMubGVuZ3RoIHx8IGxldmVsID49IGdyb3VwRmllbGRzLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gcm93cy5tYXAocm93ID0+ICh7IC4uLnJvdywgaXRlbVR5cGU6IHJvdy5pdGVtVHlwZSA/PyBUYWJsZUl0ZW1UeXBlLlJvdyB9KSk7XHJcbiAgICB9XHJcblxyXG4gICAgY29uc3QgZ3JvdXBGaWVsZCA9IGdyb3VwRmllbGRzW2xldmVsXTtcclxuICAgIGNvbnN0IGdyb3VwcyA9IG5ldyBNYXA8c3RyaW5nLCB7IHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBWYWx1ZVN5c05hbWU6IHN0cmluZyB9PigpO1xyXG5cclxuICAgIGZvciAoY29uc3Qgcm93IG9mIHJvd3MpIHtcclxuICAgICAgY29uc3QgZmllbGRWYWx1ZSA9IHJvdy5kYXRhLmZpbmQoeCA9PiB4LnN5c05hbWUgPT09IGdyb3VwRmllbGQpPy52YWx1ZSA/PyBudWxsO1xyXG4gICAgICBjb25zdCBrZXkgPSBKU09OLnN0cmluZ2lmeShmaWVsZFZhbHVlKTtcclxuICAgICAgY29uc3QgZXhpc3RpbmcgPSBncm91cHMuZ2V0KGtleSkgPz8ge1xyXG4gICAgICAgIHJvd3M6IFtdLFxyXG4gICAgICAgIGdyb3VwVmFsdWVTeXNOYW1lOiB0aGlzLl9nZXRHcm91cFZhbHVlU3lzTmFtZShmaWVsZFZhbHVlLCBncm91cEZpZWxkKVxyXG4gICAgICB9O1xyXG4gICAgICBleGlzdGluZy5yb3dzLnB1c2gocm93KTtcclxuICAgICAgZ3JvdXBzLnNldChrZXksIGV4aXN0aW5nKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCByZXN1bHQ6IFRhYmxlSXRlbVtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBncm91cEl0ZW0gb2YgZ3JvdXBzLnZhbHVlcygpKSB7XHJcbiAgICAgIGNvbnN0IG5lc3RlZERhdGEgPSB0aGlzLl9idWlsZEdyb3VwZWRJdGVtcyhncm91cEl0ZW0ucm93cywgZ3JvdXBGaWVsZHMsIGxldmVsICsgMSk7XHJcbiAgICAgIGNvbnN0IGdyb3VwTW9kZWw6IFRhYmxlR3JvdXBNb2RlbCA9IHtcclxuICAgICAgICBpdGVtVHlwZTogVGFibGVJdGVtVHlwZS5Hcm91cCxcclxuICAgICAgICBkYXRhOiBuZXN0ZWREYXRhLFxyXG4gICAgICAgIHRvdGFsczogdGhpcy5fY2FsY3VsYXRlVG90YWxzKGdyb3VwSXRlbS5yb3dzLCBncm91cEl0ZW0uZ3JvdXBWYWx1ZVN5c05hbWUpXHJcbiAgICAgIH07XHJcblxyXG4gICAgICByZXN1bHQucHVzaChncm91cE1vZGVsKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcmVzdWx0O1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfY2FsY3VsYXRlVG90YWxzKHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBGaWVsZFN5c05hbWU/OiBzdHJpbmcpOiBDb21wb25lbnRWYWx1ZU1vZGVsW10ge1xyXG4gICAgY29uc3QgdG90YWxDb2x1bW5zID0gdGhpcy5fZ2V0VG90YWxDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcblxyXG4gICAgcmV0dXJuIHRvdGFsQ29sdW1ucy5tYXAoY29tcG9uZW50ID0+IHtcclxuICAgICAgY29uc3Qgc3VtID0gcm93cy5yZWR1Y2UoKGFjYywgcm93KSA9PiB7XHJcbiAgICAgICAgY29uc3QgdmFsdWUgPSByb3cuZGF0YS5maW5kKHggPT4geC5zeXNOYW1lID09PSBjb21wb25lbnQuc3lzTmFtZSk/LnZhbHVlO1xyXG4gICAgICAgIGNvbnN0IG51bWVyaWNWYWx1ZSA9IHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgPyB2YWx1ZSA6IE51bWJlcih2YWx1ZSk7XHJcblxyXG4gICAgICAgIHJldHVybiBOdW1iZXIuaXNGaW5pdGUobnVtZXJpY1ZhbHVlKSA/IGFjYyArIG51bWVyaWNWYWx1ZSA6IGFjYztcclxuICAgICAgfSwgMCk7XHJcblxyXG4gICAgICByZXR1cm4ge1xyXG4gICAgICAgIHN5c05hbWU6IHRoaXMuX2dldFRvdGFsU3lzTmFtZShjb21wb25lbnQuc3lzTmFtZSwgZ3JvdXBGaWVsZFN5c05hbWUpLFxyXG4gICAgICAgIHR5cGU6IGNvbXBvbmVudC50eXBlLFxyXG4gICAgICAgIHZhbHVlVHlwZTogY29tcG9uZW50LnZhbHVlVHlwZSxcclxuICAgICAgICB2YWx1ZTogc3VtXHJcbiAgICAgIH0gYXMgQ29tcG9uZW50VmFsdWVNb2RlbDtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VG90YWxTeXNOYW1lKGNvbHVtblN5c05hbWU6IHN0cmluZywgZ3JvdXBGaWVsZFN5c05hbWU/OiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKGdyb3VwRmllbGRTeXNOYW1lKSB7XHJcbiAgICAgIHJldHVybiBgJHtjb2x1bW5TeXNOYW1lfV8ke2dyb3VwRmllbGRTeXNOYW1lfV90b3RhbGA7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGAke2NvbHVtblN5c05hbWV9X3RvdGFsYDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2dldEdyb3VwVmFsdWVTeXNOYW1lKGZpZWxkVmFsdWU6IGFueSwgZmFsbGJhY2tTeXNOYW1lOiBzdHJpbmcpOiBzdHJpbmcge1xyXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoZmllbGRWYWx1ZSkgJiYgZmllbGRWYWx1ZS5sZW5ndGgpIHtcclxuICAgICAgY29uc3QgZmlyc3RWYWx1ZSA9IGZpZWxkVmFsdWVbMF07XHJcbiAgICAgIGlmICh0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGZpcnN0VmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBmaXJzdFZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKGZpcnN0VmFsdWUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGZpZWxkVmFsdWUgJiYgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdvYmplY3QnKSB7XHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS52YWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGZpZWxkVmFsdWUudmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBmaWVsZFZhbHVlLnZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgICByZXR1cm4gU3RyaW5nKGZpZWxkVmFsdWUudmFsdWUpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAodHlwZW9mIGZpZWxkVmFsdWUuc3lzTmFtZSA9PT0gJ3N0cmluZycgJiYgZmllbGRWYWx1ZS5zeXNOYW1lKSB7XHJcbiAgICAgICAgcmV0dXJuIGZpZWxkVmFsdWUuc3lzTmFtZTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ3N0cmluZycgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdudW1iZXInIHx8IHR5cGVvZiBmaWVsZFZhbHVlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgcmV0dXJuIFN0cmluZyhmaWVsZFZhbHVlKTtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gZmFsbGJhY2tTeXNOYW1lO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0VG90YWxDb2x1bW5zKGNvbXBvbmVudHM6IENvbXBvbmVudE1vZGVsQmFzZVtdKTogSW5wdXROdW1iZXJNb2RlbFtdIHtcclxuICAgIGNvbnN0IHJlc3VsdDogSW5wdXROdW1iZXJNb2RlbFtdID0gW107XHJcblxyXG4gICAgZm9yIChjb25zdCBjb21wb25lbnQgb2YgY29tcG9uZW50cykge1xyXG4gICAgICBpZiAoY29tcG9uZW50LnR5cGUgPT09IENvbXBvbmVudFR5cGUuSW5wdXROdW1iZXIgJiYgdGhpcy5zaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKGNvbXBvbmVudCBhcyBJbnB1dE51bWJlck1vZGVsKTtcclxuICAgICAgfVxyXG5cclxuICAgICAgaWYgKGNvbXBvbmVudC5jb21wb25lbnRzPy5sZW5ndGgpIHtcclxuICAgICAgICByZXN1bHQucHVzaCguLi50aGlzLl9nZXRUb3RhbENvbHVtbnMoY29tcG9uZW50LmNvbXBvbmVudHMpKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9leHRyYWN0Um93cyhpdGVtczogVGFibGVJdGVtW10gPSBbXSk6IFRhYmxlUm93TW9kZWxbXSB7XHJcbiAgICBjb25zdCByb3dzOiBUYWJsZVJvd01vZGVsW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGl0ZW0gb2YgaXRlbXMpIHtcclxuICAgICAgaWYgKHRoaXMuX2lzUm93KGl0ZW0pKSB7XHJcbiAgICAgICAgcm93cy5wdXNoKHtcclxuICAgICAgICAgIC4uLml0ZW0sXHJcbiAgICAgICAgICBpdGVtVHlwZTogVGFibGVJdGVtVHlwZS5Sb3dcclxuICAgICAgICB9KTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBjb25zdCBncm91cCA9IGl0ZW0gYXMgVGFibGVHcm91cE1vZGVsO1xyXG4gICAgICAgIGlmIChncm91cC5kYXRhPy5sZW5ndGgpIHtcclxuICAgICAgICAgIHJvd3MucHVzaCguLi50aGlzLl9leHRyYWN0Um93cyhncm91cC5kYXRhKSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJvd3M7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pc1JvdyhpdGVtOiBUYWJsZUl0ZW0pOiBpdGVtIGlzIFRhYmxlUm93TW9kZWwge1xyXG4gICAgY29uc3QgbWF5YmVSb3cgPSBpdGVtIGFzIFRhYmxlUm93TW9kZWw7XHJcbiAgICByZXR1cm4gdHlwZW9mIG1heWJlUm93LmlkID09PSAnc3RyaW5nJyAmJiBBcnJheS5pc0FycmF5KG1heWJlUm93LmRhdGEpO1xyXG4gIH1cclxufVxyXG4iLCJAaWYgKHNldHRpbmdzKSB7XHJcbiAgPGRpdiBjbGFzcz1cImlucHV0LXRhYmxlLWNvbnRlbnQgdy0xMDBcIj5cclxuICAgIEBpZiAoc2V0dGluZ3Mub3B0aW9ucy5sYWJlbCkge1xyXG4gICAgICA8bXJ4LWxhYmVsXHJcbiAgICAgICAgW3JlcXVpcmVkXT1cInNldHRpbmdzLm9wdGlvbnMucmVxdWlyZWRcIlxyXG4gICAgICAgIFt0b29sdGlwXT1cInNldHRpbmdzLm9wdGlvbnMudG9vbHRpcCB8fCAnJ1wiXHJcbiAgICAgID5cclxuICAgICAgICB7eyBzZXR0aW5ncy5vcHRpb25zLmxhYmVsIH19XHJcbiAgICAgIDwvbXJ4LWxhYmVsPlxyXG4gICAgfVxyXG5cclxuICAgIDxkeC1kYXRhLWdyaWRcclxuICAgICAgI2RhdGFHcmlkXHJcbiAgICAgIFtkYXRhU291cmNlXT1cImRhdGFTb3VyY2VcIlxyXG4gICAgICBbY29sdW1uc109XCJjb2x1bW5zXCJcclxuICAgICAgbm9EYXRhVGV4dD1cItCd0LXRgiDQtNCw0L3QvdGL0YVcIlxyXG4gICAgICBzdHlsZT1cIndpZHRoOiAxMDAlXCJcclxuICAgICAgW3dvcmRXcmFwRW5hYmxlZF09XCJ0cnVlXCJcclxuICAgICAgW2NvbHVtbkF1dG9XaWR0aF09XCJ0cnVlXCJcclxuICAgICAgW2NsYXNzLm5vRGF0YV09XCJpc1JlZE5vRGF0YVwiXHJcbiAgICA+XHJcbiAgICAgIEBpZighZGlzYWJsZWQpIHtcclxuICAgICAgICA8ZHhvLXRvb2xiYXI+XHJcbiAgICAgICAgICA8ZHhpLWl0ZW0gbG9jYXRpb249XCJhZnRlclwiPlxyXG4gICAgICAgICAgICA8ZGl2ICpkeFRlbXBsYXRlIGNsYXNzPVwiYWRkLXJvd1wiPlxyXG4gICAgICAgICAgICAgIDxtcngtYnV0dG9uXHJcbiAgICAgICAgICAgICAgICBbc2l6ZV09XCInbWVkaXVtJ1wiXHJcbiAgICAgICAgICAgICAgICBbdHlwZV09XCInc2Vjb25kYXJ5J1wiXHJcbiAgICAgICAgICAgICAgICBbY3VzdG9tQ2xhc3Nlc109XCInbWItMydcIlxyXG4gICAgICAgICAgICAgICAgKG1yeENsaWNrKT1cImNyZWF0ZVJvdygpXCJcclxuICAgICAgICAgICAgICA+e3tzZXR0aW5ncy5vcHRpb25zLmFkZEJ0blRpdGxlfX1cclxuICAgICAgICAgICAgICA8L21yeC1idXR0b24+XHJcbiAgICAgICAgICAgIDwvZGl2PlxyXG4gICAgICAgICAgPC9keGktaXRlbT5cclxuICAgICAgICA8L2R4by10b29sYmFyPlxyXG4gICAgICB9XHJcblxyXG4gICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGJ1dHRvbkRhdGEgb2YgJ2VkaXRCdXR0b25UZW1wbGF0ZSdcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZWRpdCBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZWRpdFJvdyhidXR0b25EYXRhKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2ICpkeFRlbXBsYXRlPVwibGV0IGJ1dHRvbkRhdGEgb2YgJ2RlbGV0ZUJ1dHRvblRlbXBsYXRlJ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1kZWxldGUgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhidXR0b25EYXRhKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICBAaWYgKGRhdGFTb3VyY2UubGVuZ3RoKSB7XHJcbiAgICAgICAgPGR4by1zdW1tYXJ5PlxyXG4gICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIHNldHRpbmdzLmNvbXBvbmVudHM7IHRyYWNrIGNvbXBvbmVudC5pZDsgbGV0IGZpcnN0ID0gJGZpcnN0KSB7XHJcbiAgICAgICAgICAgIEBpZiAoIWZpcnN0KSB7XHJcbiAgICAgICAgICAgICAgQGlmIChzaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgPGR4aS1ncm91cC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCLQmNGC0L7Qs9C+OiB7MH1cIlxyXG4gICAgICAgICAgICAgICAgICBbc2hvd0luR3JvdXBGb290ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgIFthbGlnbkJ5Q29sdW1uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgIDwvZHhpLWdyb3VwLWl0ZW0+XHJcblxyXG4gICAgICAgICAgICAgICAgPGR4aS10b3RhbC1pdGVtIFxyXG4gICAgICAgICAgICAgICAgICBbY29sdW1uXT1cImNvbXBvbmVudC5zeXNOYW1lXCIgXHJcbiAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCJ7MH1cIlxyXG4gICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBjb21wb25lbnQuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICBAaWYgKHNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICAgIDxkeGktZ3JvdXAtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwi0JjRgtC+0LPQvjogezB9XCJcclxuICAgICAgICAgICAgICAgICAgICBbc2hvd0luR3JvdXBGb290ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2FsaWduQnlDb2x1bW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgICA8L2R4aS1ncm91cC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgfVxyXG5cclxuICAgICAgICAgICAgICAgIEBmb3IgKGNvbXBvbmVudCBvZiBjb21wb25lbnQuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkKSB7XHJcbiAgICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgICA8ZHhpLWdyb3VwLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cItCY0YLQvtCz0L46IHswfVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbc2hvd0luR3JvdXBGb290ZXJdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbYWxpZ25CeUNvbHVtbl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC9keGktZ3JvdXAtaXRlbT5cclxuICAgICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH1cclxuICAgICAgICAgICAgfSBAZWxzZSB7XHJcbiAgICAgICAgICAgICAgQGlmIChoYXNBbnlUb3RhbCkgeyBcclxuICAgICAgICAgICAgICAgIDxkeGktdG90YWwtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIlxyXG4gICAgICAgICAgICAgICAgICAgIFtjc3NDbGFzc109XCIndGV4dC1ib2xkJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Rpc3BsYXlGb3JtYXRdPVwic2hvd1RvdGFsKGNvbXBvbmVudCkgPyAnezB9JyA6ICfQmNCi0J7Qk9CeJ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgW3N1bW1hcnlUeXBlXT1cInNob3dUb3RhbChjb21wb25lbnQpID8gJ3N1bScgOiB1bmRlZmluZWRcIlxyXG4gICAgICAgICAgICAgICAgPjwvZHhpLXRvdGFsLWl0ZW0+XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgPC9keG8tc3VtbWFyeT5cclxuICAgICAgfVxyXG4gICAgPC9keC1kYXRhLWdyaWQ+XHJcblxyXG4gICAgQGlmKCEhc2V0dGluZ3Mub3B0aW9ucy5tYXhSb3dzKSB7XHJcbiAgICAgIDxtcngtaGludC1lcnJvci1tZXNzYWdlXHJcbiAgICAgICAgbWVzc2FnZT1cItCc0LDQutGB0LjQvNCw0LvRjNC90L7QtSDQutC+0LvQuNGH0LXRgdGC0LLQviDRgdGC0YDQvtC6OiB7eyBzZXR0aW5ncy5vcHRpb25zLm1heFJvd3MgfX1cIlxyXG4gICAgICAgIFttYXhWYWx1ZV09XCJzZXR0aW5ncy5vcHRpb25zLm1heFJvd3NcIlxyXG4gICAgICAgIFt2YWx1ZV09XCJyb3dzQ291bnRcIlxyXG4gICAgICA+PC9tcngtaGludC1lcnJvci1tZXNzYWdlPlxyXG4gICAgfVxyXG5cclxuICAgIDxuZy10ZW1wbGF0ZSAjZWRpdFRlbXBsYXRlIGxldC1jZWxsSW5mbz1cImNlbGxJbmZvXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggYWxpZ24taXRlbXMtY2VudGVyIGp1c3RpZnktY29udGVudC1jZW50ZXJcIiBzdHlsZT1cImdhcDogNHB4XCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWVkaXQgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImVkaXRSb3coY2VsbEluZm8pXCI+PC9zcGFuPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1kZWxldGUgaWNvbi1mb250LTE2IGN1cnNvci1wb2ludGVyXCIgKGNsaWNrKT1cImRlbGV0ZVJvdyhjZWxsSW5mbylcIj48L3NwYW4+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICA8L2Rpdj5cclxufVxyXG5cclxuXHJcbiJdfQ==
|
|
525
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5wdXQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvbXlydGV4LWZvcm0vc3JjL2xpYi9tb2R1bGVzL29iamVjdC1mb3JtL2NvbXBvbmVudHMvZWxlbWVudHMvaW5wdXQvdGFibGUvaW5wdXQtdGFibGUuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFBRSxNQUFNLEVBQ3BCLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxhQUFhLEVBQUUsWUFBWSxFQUFFLE1BQU0sa0NBQWtDLENBQUM7QUFDL0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUVwQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDOUMsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFFN0MsT0FBTyxFQUtMLGFBQWEsRUFHZCxNQUFNLG9CQUFvQixDQUFDO0FBRTVCLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxtQkFBbUIsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQzNFLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDeEQsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLGdDQUFnQyxDQUFD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QkFDNUIsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sS0FBSyxHQUFHLElBQXVCLENBQUM7Z0JBQ3RDLElBQUksS0FBSyxDQUFDLElBQUksRUFBRSxNQUFNLEVBQUUsQ0FBQztvQkFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxZQUFZLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7Z0JBQzlDLENBQUM7WUFDSCxDQUFDO1FBQ0gsQ0FBQztRQUVELE9BQU8sSUFBSSxDQUFDO0lBQ2QsQ0FBQztJQUVPLE1BQU0sQ0FBQyxJQUFlO1FBQzVCLE1BQU0sUUFBUSxHQUFHLElBQXFCLENBQUM7UUFDdkMsT0FBTyxPQUFPLFFBQVEsQ0FBQyxFQUFFLEtBQUssUUFBUSxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3pFLENBQUM7K0dBbG1CVSxtQkFBbUI7bUdBQW5CLG1CQUFtQix5VUN6Q2hDLDh3SkF5SEE7OzRGRGhGYSxtQkFBbUI7a0JBTi9CLFNBQVM7K0JBQ0UsaUJBQWlCLG1CQUdWLHVCQUF1QixDQUFDLE1BQU07OEJBeUJ0QyxNQUFNO3NCQUFkLEtBQUs7Z0JBRU8sSUFBSTtzQkFBaEIsS0FBSztnQkFXa0MsUUFBUTtzQkFBL0MsU0FBUzt1QkFBQyxVQUFVLEVBQUUsRUFBQyxNQUFNLEVBQUUsS0FBSyxFQUFDO2dCQUNNLFlBQVk7c0JBQXZELFNBQVM7dUJBQUMsY0FBYyxFQUFFLEVBQUMsTUFBTSxFQUFFLEtBQUssRUFBQztnQkFFekIsT0FBTztzQkFBdkIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXHJcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgQ29tcG9uZW50LFxyXG4gIEV2ZW50RW1pdHRlciwgaW5qZWN0LFxyXG4gIElucHV0LFxyXG4gIE9uRGVzdHJveSxcclxuICBPbkluaXQsXHJcbiAgT3V0cHV0LFxyXG4gIFZpZXdDaGlsZFxyXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRUeXBlLCBEYXRlVHlwZUVudW0gfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9lbnVtcyc7XHJcbmltcG9ydCB7IFN0b3JlIH0gZnJvbSAnQG5ncngvc3RvcmUnO1xyXG5pbXBvcnQgeyBDb21wb25lbnRNb2RlbEJhc2UgfSBmcm9tICcuLi8uLi8uLi8uLi8uLi9zaGFyZWQtZm9ybS9tb2RlbHMnO1xyXG5pbXBvcnQgeyBkZWJvdW5jZVRpbWUgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IFN1YmplY3QsIFN1YnNjcmlwdGlvbiB9IGZyb20gJ3J4anMnO1xyXG5pbXBvcnQgeyBEeERhdGFHcmlkQ29tcG9uZW50IH0gZnJvbSAnZGV2ZXh0cmVtZS1hbmd1bGFyJztcclxuaW1wb3J0IHtcclxuICBDb21wb25lbnRWYWx1ZU1vZGVsLFxyXG4gIFNlY3Rpb25WYWx1ZU1vZGVsLFxyXG4gIFRhYmxlR3JvdXBNb2RlbCxcclxuICBUYWJsZUl0ZW0sXHJcbiAgVGFibGVJdGVtVHlwZSxcclxuICBUYWJsZVJvd01vZGVsLFxyXG4gIFRhYmxlVmFsdWVNb2RlbFxyXG59IGZyb20gJy4uLy4uLy4uLy4uL21vZGVscyc7XHJcbmltcG9ydCB7IElucHV0RGF0ZU1vZGVsLCBJbnB1dE51bWJlck1vZGVsLCBJbnB1dFNlbGVjdE1vZGVsLCBJbnB1dFRhYmxlTW9kZWwgfSBmcm9tICcuLi8uLi8uLi8uLi9tb2RlbHMvZWxlbWV0cy9pbnB1dHMnO1xyXG5pbXBvcnQgeyBvYmplY3RGb3JtQWN0aW9ucywgb2JqZWN0Rm9ybVNlbGVjdG9ycyB9IGZyb20gJy4uLy4uLy4uLy4uL3N0b3JlJztcclxuaW1wb3J0IHsgTW9kYWxTZXJ2aWNlIH0gZnJvbSAnQG15cnRleC1vcmcvdWknO1xyXG5pbXBvcnQgeyBJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQgfSBmcm9tICcuL2NvbXBvbmVudHMnO1xyXG5pbXBvcnQgeyBnZXRSb3dNb2RlbCB9IGZyb20gJy4vaGVscGVycy9nZXQtcm93LW1vZGVsLmhlbHBlcic7XHJcbmltcG9ydCB7IENvbHVtbk1vZGVsIH0gZnJvbSAnLi9tb2RlbHMvY29sdW1uLm1vZGVsJztcclxuaW1wb3J0IHsgUmVmZXJlbmNlU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL3JlZmVyZW5jZS5zZXJ2aWNlJztcclxuaW1wb3J0IEN1c3RvbVN0b3JlIGZyb20gJ2RldmV4dHJlbWUvZGF0YS9jdXN0b21fc3RvcmUnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdhcHAtaW5wdXQtdGFibGUnLFxyXG4gIHRlbXBsYXRlVXJsOiAnLi9pbnB1dC10YWJsZS5jb21wb25lbnQuaHRtbCcsXHJcbiAgc3R5bGVVcmxzOiBbJy4vaW5wdXQtdGFibGUuY29tcG9uZW50Lmxlc3MnXSxcclxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxyXG59KVxyXG5leHBvcnQgY2xhc3MgSW5wdXRUYWJsZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25EZXN0cm95IHtcclxuICB0eXBlID0gQ29tcG9uZW50VHlwZS5JbnB1dFRhYmxlO1xyXG5cclxuICBwcml2YXRlIF9yZWZlcmVuY2VTZXJ2aWNlOiBSZWZlcmVuY2VTZXJ2aWNlID0gaW5qZWN0KFJlZmVyZW5jZVNlcnZpY2UpO1xyXG5cclxuICBwcml2YXRlIF9sb29rdXBzQ2FjaGU6IE1hcDxzdHJpbmcsIGFueVtdPiA9IG5ldyBNYXAoKTtcclxuXHJcbiAgcHJpdmF0ZSBfc3RvcmU6IFN0b3JlID0gaW5qZWN0KFN0b3JlKTtcclxuICBwcml2YXRlIF9kZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYgPSBpbmplY3QoQ2hhbmdlRGV0ZWN0b3JSZWYpO1xyXG4gIHByaXZhdGUgX21vZGFsU2VydmljZTogTW9kYWxTZXJ2aWNlID0gaW5qZWN0KE1vZGFsU2VydmljZSk7XHJcblxyXG4gIHByaXZhdGUgX2NoYW5nZVN1YmplY3QkOiBTdWJqZWN0PFRhYmxlVmFsdWVNb2RlbD4gPSBuZXcgU3ViamVjdDxUYWJsZVZhbHVlTW9kZWw+KCk7XHJcbiAgcHJpdmF0ZSBfc3Vic2NyaXB0aW9ucyQ6IFN1YnNjcmlwdGlvbltdID0gW107XHJcblxyXG4gIHByaXZhdGUgX2lzQ2hlY2tSZXF1aXJlZDogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgX2NhbkVkaXRPYmplY3Q6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9yb3dzOiBUYWJsZVJvd01vZGVsW10gPSBbXTtcclxuXHJcbiAgcHVibGljIG1vZGVsITogVGFibGVWYWx1ZU1vZGVsO1xyXG4gIHB1YmxpYyBzZXR0aW5ncyE6IElucHV0VGFibGVNb2RlbDtcclxuICBwdWJsaWMgZGF0YVNvdXJjZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfVtdID0gW107XHJcbiAgcHVibGljIGNvbHVtbnM6IENvbHVtbk1vZGVsW10gPSBbXTtcclxuXHJcbiAgQElucHV0KCkgdmFsdWVzOiBTZWN0aW9uVmFsdWVNb2RlbFtdID0gW107XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRhKHNldHRpbmdzOiBDb21wb25lbnRNb2RlbEJhc2UpIHtcclxuICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncyBhcyBJbnB1dFRhYmxlTW9kZWw7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtzeXNOYW1lOiBzZXR0aW5ncy5zeXNOYW1lLCB0eXBlOiBzZXR0aW5ncy50eXBlLCBkYXRhOiBbXSwgdG90YWxzOiBbXX07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcblxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIHRoaXMuX2luaXRDb2x1bW5zKHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cyk7XHJcbiAgfVxyXG5cclxuICBAVmlld0NoaWxkKCdkYXRhR3JpZCcsIHtzdGF0aWM6IGZhbHNlfSkgZGF0YUdyaWQhOiBEeERhdGFHcmlkQ29tcG9uZW50O1xyXG4gIEBWaWV3Q2hpbGQoJ2VkaXRUZW1wbGF0ZScsIHtzdGF0aWM6IGZhbHNlfSkgZWRpdFRlbXBsYXRlITogYW55O1xyXG5cclxuICBAT3V0cHV0KCkgcHVibGljIGNoYW5nZWQ6IEV2ZW50RW1pdHRlcjxDb21wb25lbnRWYWx1ZU1vZGVsIHwgQ29tcG9uZW50VmFsdWVNb2RlbFtdPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q29tcG9uZW50VmFsdWVNb2RlbCB8IENvbXBvbmVudFZhbHVlTW9kZWxbXT4oKTtcclxuXHJcbiAgcHVibGljIGdldCByb3dzQ291bnQoKTogbnVtYmVyIHtcclxuICAgIHJldHVybiB0aGlzLl9yb3dzLmxlbmd0aCB8fCAwO1xyXG4gIH1cclxuXHJcbiAgZ2V0IGhhc0FueVRvdGFsKCk6IGJvb2xlYW4ge1xyXG4gICAgcmV0dXJuIHRoaXMuc2V0dGluZ3MuY29tcG9uZW50cy5zb21lKGMgPT5cclxuICAgICAgdGhpcy5zaG93VG90YWwoYykgfHwgYy5jb21wb25lbnRzPy5zb21lKGlubmVyID0+IHRoaXMuc2hvd1RvdGFsKGlubmVyKSlcclxuICAgICk7XHJcbiAgfVxyXG5cclxuICBnZXQgaXNSZWROb0RhdGEoKTogYm9vbGVhbiB7XHJcbiAgICByZXR1cm4gdGhpcy5faXNDaGVja1JlcXVpcmVkO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKTogdm9pZCB7XHJcbiAgICB0aGlzLl9pbml0TW9kZWwoKTtcclxuXHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5waXBlKFxyXG4gICAgICBkZWJvdW5jZVRpbWUoNzAwKSxcclxuICAgICkuc3Vic2NyaWJlKG1vZGVsID0+IHtcclxuICAgICAgdGhpcy5fc3RvcmUuZGlzcGF0Y2gob2JqZWN0Rm9ybUFjdGlvbnMudXBkYXRlVmFsdWVzKHt2YWx1ZTogbW9kZWx9KSk7XHJcbiAgICB9KTtcclxuXHJcbiAgICB0aGlzLl9zdWJzY3JpcHRpb25zJC5wdXNoKHRoaXMuX3N0b3JlLnNlbGVjdChvYmplY3RGb3JtU2VsZWN0b3JzLnNlbGVjdElzQ2hlY2tSZXF1aXJlZCkuc3Vic2NyaWJlKHJlc3VsdCA9PiB7XHJcbiAgICAgIHRoaXMuX2lzQ2hlY2tSZXF1aXJlZCA9IHJlc3VsdDtcclxuICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgfSkpO1xyXG5cclxuICAgIHRoaXMuX3N1YnNjcmlwdGlvbnMkLnB1c2godGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0Q2FuRWRpdE9iamVjdClcclxuICAgICAgLnN1YnNjcmliZShyZXN1bHQgPT4ge1xyXG4gICAgICAgIHRoaXMuX2NhbkVkaXRPYmplY3QgPSByZXN1bHQ7XHJcblxyXG4gICAgICAgIGlmICh0aGlzLnNldHRpbmdzPy5jb21wb25lbnRzKSB7XHJcbiAgICAgICAgICB0aGlzLl9pbml0Q29sdW1ucyh0aGlzLnNldHRpbmdzLmNvbXBvbmVudHMpO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gICAgICB9KSk7XHJcblxyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQucHVzaChcclxuICAgICAgdGhpcy5fc3RvcmUuc2VsZWN0KG9iamVjdEZvcm1TZWxlY3RvcnMuc2VsZWN0VmFsdWVNb2RlbCh0aGlzLnNldHRpbmdzKSlcclxuICAgICAgICAuc3Vic2NyaWJlKChyZXN1bHQ6IENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsIHwgKENvbXBvbmVudFZhbHVlTW9kZWwgfCBudWxsKVtdKSA9PiB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIGNvbnN0IGNsb25lUmVzdWx0ID0gc3RydWN0dXJlZENsb25lKHJlc3VsdCBhcyBUYWJsZVZhbHVlTW9kZWwgfCBudWxsKTtcclxuXHJcbiAgICAgICAgICAvLyDQndCw0YjQsCDQv9GA0L7QstC10YDQutCwINC/0L4gc3lzTmFtZSwg0LrQvtGC0L7RgNGD0Y4g0LzRiyDQtNC+0LHQsNCy0LjQu9C4INGA0LDQvdC10LVcclxuICAgICAgICAgIGlmIChjbG9uZVJlc3VsdCAmJiAhQXJyYXkuaXNBcnJheShjbG9uZVJlc3VsdCkgJiYgY2xvbmVSZXN1bHQuc3lzTmFtZSA9PT0gdGhpcy5zZXR0aW5ncy5zeXNOYW1lKSB7XHJcbiAgICAgICAgICAgIFxyXG4gICAgICAgICAgICAvLyAtLS0g0JLQntCiINCt0KLQntCiINCd0J7QktCr0Jkg0JHQm9Ce0Jog0JTQm9CvINCS0J7QodCh0KLQkNCd0J7QktCb0JXQndCY0K8g0JTQkNCiIC0tLVxyXG4gICAgICAgICAgICAvLyDQn9GA0L7QstC10YDRj9C10LwsINC10YHRgtGMINC70Lgg0LLQvtC+0LHRidC1INC00LDQvdC90YvQtSDQstC90YPRgtGA0Lgg0L/RgNC40YjQtdC00YjQtdC5INC80L7QtNC10LvQuFxyXG4gICAgICAgICAgICBpZiAoY2xvbmVSZXN1bHQuZGF0YSAmJiBBcnJheS5pc0FycmF5KGNsb25lUmVzdWx0LmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgY2xvbmVSZXN1bHQuZGF0YS5mb3JFYWNoKChyb3c6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgaWYgKHJvdy5kYXRhICYmIEFycmF5LmlzQXJyYXkocm93LmRhdGEpKSB7XHJcbiAgICAgICAgICAgICAgICAgIHJvdy5kYXRhLmZvckVhY2goKGNlbGw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICAgICAgICAgIC8vINCV0YHQu9C4INGC0LjQvyDQutC+0LzQv9C+0L3QtdC90YLQsCDigJQg0LTQsNGC0LAsINC30L3QsNGH0LXQvdC40LUg4oCUINGB0YLRgNC+0LrQsCDQuCDQsiDQvdC10Lkg0LXRgdGC0Ywg0L3QsNGIINGA0LDQt9C00LXQu9C40YLQtdC70YwgJy8nXHJcbiAgICAgICAgICAgICAgICAgICAgaWYgKGNlbGwudHlwZSA9PT0gJ2lucHV0RGF0ZScgJiYgdHlwZW9mIGNlbGwudmFsdWUgPT09ICdzdHJpbmcnICYmIGNlbGwudmFsdWUuaW5jbHVkZXMoJy8nKSkge1xyXG4gICAgICAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtUYWJsZSA8LSBTdG9yZSBQYXJzaW5nXSDQktC+0YHRgdGC0LDQvdCw0LLQu9C40LLQsNC10LwgcmFuZ2Ut0LTQsNGC0YMg0LjQtyDRgdGC0YDQvtC60Lgg0LTQu9GPICR7Y2VsbC5zeXNOYW1lfTpgLCBjZWxsLnZhbHVlKTtcclxuICAgICAgICAgICAgICAgICAgICAgIC8vINCg0LDQt9GA0LXQt9Cw0LXQvCDRgdGC0YDQvtC60YMgXCIyMDI2LTA1LTA1LzIwMjYtMDUtMDdcIiDQvtCx0YDQsNGC0L3QviDQsiDQvNCw0YHRgdC40LIgWycyMDI2LTA1LTA1JywgJzIwMjYtMDUtMDcnXVxyXG4gICAgICAgICAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IGNlbGwudmFsdWUuc3BsaXQoJy8nKTtcclxuICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cclxuXHJcbiAgICAgICAgICAgIC8vINCf0YDQvtCy0LXRgNGP0LXQvCwg0LjQt9C80LXQvdC40LvQuNGB0Ywg0LvQuCDQtNCw0L3QvdGL0LUg0L/QviDRgdGA0LDQstC90LXQvdC40Y4g0YEg0YLQtdC60YPRidC40LzQuFxyXG4gICAgICAgICAgICBjb25zdCBpc0RhdGFDaGFuZ2VkID0gSlNPTi5zdHJpbmdpZnkodGhpcy5tb2RlbD8uZGF0YSkgIT09IEpTT04uc3RyaW5naWZ5KGNsb25lUmVzdWx0LmRhdGEpO1xyXG5cclxuICAgICAgICAgICAgaWYgKGlzRGF0YUNoYW5nZWQpIHtcclxuICAgICAgICAgICAgICBjb25zb2xlLmxvZyhgW1RhYmxlIC0+IFN0b3JlIEFwcGx5XSBbJHt0aGlzLnNldHRpbmdzLnN5c05hbWV9XSDQodC40L3RhdGA0L7QvdC40LfQuNGA0YPQtdC8INGB0YLRgNC+0LrQuC5gKTtcclxuICAgICAgICAgICAgICB0aGlzLm1vZGVsID0gc3RydWN0dXJlZENsb25lKGNsb25lUmVzdWx0KTtcclxuICAgICAgICAgICAgICBcclxuICAgICAgICAgICAgICAvLyDQmNC30LLQu9C10LrQsNC10Lwg0YHRgtGA0L7QutC4ICjRgtC10L/QtdGA0Ywg0LLQvdGD0YLRgNC4IGNlbGwudmFsdWUg0YPQttC1INC70LXQttC40YIg0L/RgNCw0LLQuNC70YzQvdGL0Lkg0LzQsNGB0YHQuNCyLCDQuCDQvtC90Lgg0L3QtSDQt9Cw0L3Rg9C70Y/RgtGB0Y8hKVxyXG4gICAgICAgICAgICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9leHRyYWN0Um93cyh0aGlzLm1vZGVsLmRhdGEpO1xyXG4gICAgICAgICAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG4gICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pXHJcbiAgICApO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XHJcbiAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC51bnN1YnNjcmliZSgpO1xyXG4gICAgdGhpcy5fc3Vic2NyaXB0aW9ucyQuZm9yRWFjaCgoc3Vic2NyaXB0aW9uKSA9PiBzdWJzY3JpcHRpb24udW5zdWJzY3JpYmUoKSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY3JlYXRlUm93KCkge1xyXG4gICAgY29uc3QgaW5pdGlhbFJvd01vZGVsID0gZ2V0Um93TW9kZWwodGhpcy5zZXR0aW5ncyk7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IENyZWF0ZSBSb3ddINCY0YHRhdC+0LTQvdCw0Y8g0LzQvtC00LXQu9GMINC00LvRjyDQvdC+0LLQvtC5INGB0YLRgNC+0LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUoaW5pdGlhbFJvd01vZGVsKSk7XHJcblxyXG4gICAgdGhpcy5fbW9kYWxTZXJ2aWNlLm9wZW4oSW5wdXRUYWJsZU1vZGFsQ29tcG9uZW50LCB7XHJcbiAgICAgIHRpdGxlOiAn0KHQvtC30LTQsNC90LjQtSDRgdGC0YDQvtC60LgnLFxyXG4gICAgICBva1RleHQ6ICfQodC+0LfQtNCw0YLRjCcsXHJcbiAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxyXG4gICAgICByb3dNb2RlbDogZ2V0Um93TW9kZWwodGhpcy5zZXR0aW5ncyksXHJcbiAgICAgIGlzQ2hlY2tSZXF1aXJlZDogdGhpcy5faXNDaGVja1JlcXVpcmVkXHJcbiAgICB9KS5hZnRlckNsb3NlZCgpLnN1YnNjcmliZShyZXNvbHZlID0+IHtcclxuICAgICAgY29uc29sZS5sb2coJ1tUYWJsZSA8LSBNb2RhbCBDbG9zZWQgKENyZWF0ZSldINCg0LXQt9GD0LvRjNGC0LDRgiDQuNC3INC80L7QtNCw0LvQutC4OicsIHN0cnVjdHVyZWRDbG9uZShyZXNvbHZlKSk7XHJcblxyXG4gICAgICBpZiAocmVzb2x2ZSAmJiByZXNvbHZlLnJlc3VsdCAmJiByZXNvbHZlLnJvd01vZGVsKSB7XHJcbiAgICAgICAgXHJcbiAgICAgICAgLy8g0JrQoNCY0KLQmNCn0JXQodCa0JjQmSDQpdCQ0Jo6INCh0LrQu9C10LjQstCw0LXQvCDQvNCw0YHRgdC40LIg0LTQuNCw0L/QsNC30L7QvdCwINC00LDRgiDQsiDRgdGC0YDQvtC60YMg0L/QtdGA0LXQtCDQvtGC0L/RgNCw0LLQutC+0Lkg0LIg0KHRgtC+0YBcclxuICAgICAgICBpZiAocmVzb2x2ZS5yb3dNb2RlbC5kYXRhICYmIEFycmF5LmlzQXJyYXkocmVzb2x2ZS5yb3dNb2RlbC5kYXRhKSkge1xyXG4gICAgICAgICAgcmVzb2x2ZS5yb3dNb2RlbC5kYXRhLmZvckVhY2goKGNlbGw6IGFueSkgPT4ge1xyXG4gICAgICAgICAgICBpZiAoY2VsbC50eXBlID09PSAnaW5wdXREYXRlJyAmJiBBcnJheS5pc0FycmF5KGNlbGwudmFsdWUpKSB7XHJcbiAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtUYWJsZSA8LSBNb2RhbF0g0J3QsNC50LTQtdC90LAg0YDQtdC90LTQti3QtNCw0YLQsCDQsiAke2NlbGwuc3lzTmFtZX0uINCh0LrQu9C10LjQstCw0LXQvCDQsiDRgdGC0YDQvtC60YM6YCwgY2VsbC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgY2VsbC52YWx1ZSA9IGNlbGwudmFsdWUuam9pbignLycpOyAvLyDQn9GA0LXQstGA0LDRidCw0LXQvCBbJzIwMjYtMDUtMDUuLi4nLCAnMjAyNi0wNS0wNy4uLiddINCyIFwi0LTQsNGC0LAxL9C00LDRgtCwMlwiXHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH0pO1xyXG4gICAgICAgIH1cclxuXHJcbiAgICAgICAgLy8g0J3QsNC60LDRgtGL0LLQsNC10Lwg0L7QsdC90L7QstC70LXQvdC90YPRjiDQvNC+0LTQtdC70Ywg0LIg0LvQvtC60LDQu9GM0L3Ri9C1INGB0YLRgNC+0LrQuFxyXG4gICAgICAgIHRoaXMuX3Jvd3MgPSBbLi4uc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpLCByZXNvbHZlLnJvd01vZGVsXTtcclxuXHJcbiAgICAgICAgdGhpcy5faW5pdERhdGFTb3VyY2UodGhpcy5fcm93cyk7XHJcblxyXG4gICAgICAgIHRoaXMuX2NoYW5nZVN1YmplY3QkLm5leHQodGhpcy5fYnVpbGRUYWJsZVZhbHVlTW9kZWwoKSk7XHJcbiAgICAgIH1cclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGRlbGV0ZVJvdyhldmVudDogYW55KSB7XHJcbiAgICBjb25zdCBmaW5kUm93ID0gdGhpcy5fcm93cy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgIGlmIChmaW5kUm93KSB7XHJcbiAgICAgIHRoaXMuX3Jvd3MgPSB0aGlzLl9yb3dzLmZpbHRlcihpdGVtID0+IGl0ZW0uaWQgIT09IGV2ZW50LnJvdy5kYXRhLmlkKTtcclxuXHJcbiAgICAgIHRoaXMuX2luaXREYXRhU291cmNlKHRoaXMuX3Jvd3MpO1xyXG5cclxuICAgICAgdGhpcy5fY2hhbmdlU3ViamVjdCQubmV4dCh0aGlzLl9idWlsZFRhYmxlVmFsdWVNb2RlbCgpKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkaXNhYmxlZCgpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAhdGhpcy5fY2FuRWRpdE9iamVjdDtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBlZGl0Um93KGV2ZW50OiBhbnkpIHtcclxuICAgIGNvbnN0IGZpbmRSb3cgPSB0aGlzLl9yb3dzLmZpbmQoaXRlbSA9PiBpdGVtLmlkID09PSBldmVudC5yb3cuZGF0YS5pZCk7XHJcbiAgICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IEVkaXQgUm93XSDQlNCw0L3QvdGL0LUg0YHRgtGA0L7QutC4INC40Lcg0LrQu9C40LrQsCAoZXZlbnQucm93LmRhdGEpOicsIGV2ZW50LnJvdy5kYXRhKTtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gRWRpdCBSb3ddINCd0LDQudC00LXQvdC+INCyINC70L7QutCw0LvRjNC90L7QvCByb3dzOicsIHN0cnVjdHVyZWRDbG9uZShmaW5kUm93KSk7XHJcbiAgICAvLyBjb25zdCBmaW5kUm93OiBUYWJsZVJvd01vZGVsIHwgdW5kZWZpbmVkID0gdGhpcy5fcm93cy5maW5kKGl0ZW0gPT4gaXRlbS5pZCA9PT0gZXZlbnQucm93LmRhdGEuaWQpO1xyXG5cclxuICAgIGlmIChmaW5kUm93KSB7XHJcbiAgICAgIGNvbnN0IHJvd01vZGVsQ2xvbmUgPSBzdHJ1Y3R1cmVkQ2xvbmUoZmluZFJvdyk7XHJcblxyXG4gICAgICB0aGlzLl9tb2RhbFNlcnZpY2Uub3BlbihJbnB1dFRhYmxlTW9kYWxDb21wb25lbnQsIHtcclxuICAgICAgICB0aXRsZTogJ9Cg0LXQtNCw0LrRgtC40YDQvtCy0LDQvdC40LUg0YHRgtGA0L7QutC4JyxcclxuICAgICAgICBva1RleHQ6ICfQodC+0YXRgNCw0L3QuNGC0YwnLFxyXG4gICAgICAgIHNldHRpbmdzOiB0aGlzLnNldHRpbmdzLFxyXG4gICAgICAgIHJvd01vZGVsOiByb3dNb2RlbENsb25lXHJcbiAgICAgIH0pLmFmdGVyQ2xvc2VkKCkuc3Vic2NyaWJlKHJlc29sdmUgPT4ge1xyXG4gICAgICAgIGNvbnNvbGUubG9nKCdbVGFibGUgPC0gTW9kYWwgQ2xvc2VkIChDcmVhdGUpXSDQoNC10LfRg9C70YzRgtCw0YIg0LjQtyDQvNC+0LTQsNC70LrQuDonLCBzdHJ1Y3R1cmVkQ2xvbmUocmVzb2x2ZSkpO1xyXG5cclxuICAgICAgICBpZiAocmVzb2x2ZSAmJiByZXNvbHZlLnJlc3VsdCAmJiByZXNvbHZlLnJvd01vZGVsKSB7XHJcbiAgICAgICAgICBcclxuICAgICAgICAgIC8vINCa0KDQmNCi0JjQp9CV0KHQmtCY0Jkg0KXQkNCaOiDQodC60LvQtdC40LLQsNC10Lwg0LzQsNGB0YHQuNCyINC00LjQsNC/0LDQt9C+0L3QsCDQtNCw0YIg0LIg0YHRgtGA0L7QutGDINC/0LXRgNC10LQg0L7RgtC/0YDQsNCy0LrQvtC5INCyINCh0YLQvtGAXHJcbiAgICAgICAgICBpZiAocmVzb2x2ZS5yb3dNb2RlbC5kYXRhICYmIEFycmF5LmlzQXJyYXkocmVzb2x2ZS5yb3dNb2RlbC5kYXRhKSkge1xyXG4gICAgICAgICAgICByZXNvbHZlLnJvd01vZGVsLmRhdGEuZm9yRWFjaCgoY2VsbDogYW55KSA9PiB7XHJcbiAgICAgICAgICAgICAgaWYgKGNlbGwudHlwZSA9PT0gJ2lucHV0RGF0ZScgJiYgQXJyYXkuaXNBcnJheShjZWxsLnZhbHVlKSkge1xyXG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coYFtUYWJsZSA8LSBNb2RhbF0g0J3QsNC50LTQtdC90LAg0YDQtdC90LTQti3QtNCw0YLQsCDQsiAke2NlbGwuc3lzTmFtZX0uINCh0LrQu9C10LjQstCw0LXQvCDQsiDRgdGC0YDQvtC60YM6YCwgY2VsbC52YWx1ZSk7XHJcbiAgICAgICAgICAgICAgICBjZWxsLnZhbHVlID0gY2VsbC52YWx1ZS5qb2luKCcvJyk7IC8vINCf0YDQtdCy0YDQsNGJ0LDQtdC8IFsnMjAyNi0wNS0wNS4uLicsICcyMDI2LTA1LTA3Li4uJ10g0LIgXCLQtNCw0YLQsDEv0LTQsNGC0LAyXCJcclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH0pO1xyXG4gICAgICAgICAgfVxyXG5cclxuICAgICAgICAgIC8vINCd0LDQutCw0YLRi9Cy0LDQtdC8INC+0LHQvdC+0LLQu9C10L3QvdGD0Y4g0LzQvtC00LXQu9GMINCyINC70L7QutCw0LvRjNC90YvQtSDRgdGC0YDQvtC60LhcclxuICAgICAgICAgIHRoaXMuX3Jvd3MgPSBbLi4uc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpLCByZXNvbHZlLnJvd01vZGVsXTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9pbml0RGF0YVNvdXJjZSh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICAgICAgICB0aGlzLl9jaGFuZ2VTdWJqZWN0JC5uZXh0KHRoaXMuX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCkpO1xyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0Rm9ybWF0KGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKSB7XHJcbiAgICBzd2l0Y2ggKGNvbXBvbmVudC50eXBlKSB7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dERhdGU6XHJcbiAgICAgICAgc3dpdGNoICgoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnZpZXdUeXBlKSB7XHJcbiAgICAgICAgICBjYXNlIERhdGVUeXBlRW51bS5EYXRlVGltZTpcclxuICAgICAgICAgICAgcmV0dXJuICdkZC5NTS55eXl5IGhoOm1tJztcclxuICAgICAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgICAgIHJldHVybiAnZGQuTU0ueXl5eSc7XHJcbiAgICAgICAgfVxyXG4gICAgICBkZWZhdWx0OlxyXG4gICAgICAgIHJldHVybiAnJztcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBnZXREYXRhVHlwZShjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSkge1xyXG4gICAgc3dpdGNoIChjb21wb25lbnQudHlwZSkge1xyXG4gICAgICBjYXNlIENvbXBvbmVudFR5cGUuSW5wdXREYXRlOlxyXG4gICAgICAgIHJldHVybiAnZGF0ZSc7XHJcbiAgICAgIGNhc2UgQ29tcG9uZW50VHlwZS5JbnB1dFN3aXRjaDpcclxuICAgICAgICByZXR1cm4gJ2Jvb2xlYW4nXHJcbiAgICAgIGRlZmF1bHQ6XHJcbiAgICAgICAgcmV0dXJuICdzdHJpbmcnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHNob3dUb3RhbChjb21wb25lbnQ6IENvbXBvbmVudE1vZGVsQmFzZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0TnVtYmVyKSB7XHJcbiAgICAgIGNvbnN0IGVsZW1lbnQ6IElucHV0TnVtYmVyTW9kZWwgPSBjb21wb25lbnQgYXMgSW5wdXROdW1iZXJNb2RlbDtcclxuXHJcbiAgICAgIHJldHVybiBlbGVtZW50Lm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzVG90YWxDb2x1bW4oY29tcG9uZW50OiBDb21wb25lbnRNb2RlbEJhc2UpOiBib29sZWFuIHtcclxuICAgIHJldHVybiAoY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpLm9wdGlvbnMuaW5Ub3RhbHM7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0TW9kZWwoKSB7XHJcbiAgICB0aGlzLm1vZGVsID0ge1xyXG4gICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAgICAgZGF0YTogW10sXHJcbiAgICAgIHRvdGFsczogW11cclxuICAgIH07XHJcbiAgICB0aGlzLl9yb3dzID0gW107XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9pbml0RGF0YVNvdXJjZShkYXRhOiBUYWJsZVJvd01vZGVsW10pIHtcclxuICAgIGNvbnNvbGUubG9nKCdbVGFibGUgLT4gX2luaXREYXRhU291cmNlXSDQodCx0L7RgNC60LAgZGF0YVNvdXJjZSDQuNC3IHJvd3M6Jywgc3RydWN0dXJlZENsb25lKGRhdGEpKTtcclxuICAgIFxyXG4gICAgdGhpcy5kYXRhU291cmNlID0gZGF0YS5tYXAoKGl0ZW06IFRhYmxlUm93TW9kZWwpID0+IHtcclxuICAgICAgY29uc3QgbmV3RGF0YUl0ZW06IGFueSA9IHt9O1xyXG4gICAgICBcclxuICAgICAgZm9yIChsZXQgaSBpbiBpdGVtLmRhdGEpIHtcclxuICAgICAgICBjb25zdCBjZWxsID0gaXRlbS5kYXRhW2ldO1xyXG4gICAgICAgIC8vINCd0LDQv9GA0Y/QvNGD0Y4g0LHQtdGA0LXQvCDQt9C90LDRh9C10L3QuNC1INGP0YfQtdC50LrQuCAo0LHRg9C00Ywg0YLQviDRgdGC0YDQvtC60LAg0LjQu9C4INC80LDRgdGB0LjQsiDQtNCw0YIpXHJcbiAgICAgICAgbmV3RGF0YUl0ZW1bY2VsbC5zeXNOYW1lXSA9IGNlbGwudmFsdWU7XHJcbiAgICAgIH1cclxuICAgICAgXHJcbiAgICAgIG5ld0RhdGFJdGVtLmlkID0gaXRlbS5pZDtcclxuICAgICAgcmV0dXJuIG5ld0RhdGFJdGVtO1xyXG4gICAgfSk7XHJcblxyXG4gICAgY29uc29sZS5sb2coJ1tUYWJsZSAtPiBfaW5pdERhdGFTb3VyY2VdINCY0YLQvtCz0L7QstGL0LkgZGF0YVNvdXJjZSwg0L/QtdGA0LXQtNCw0L3QvdGL0Lkg0LIgRGF0YUdyaWQ6Jywgc3RydWN0dXJlZENsb25lKHRoaXMuZGF0YVNvdXJjZSkpO1xyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG5cclxuICAgIGlmICh0aGlzLmRhdGFHcmlkPy5pbnN0YW5jZSkge1xyXG4gICAgICB0aGlzLmRhdGFHcmlkLmluc3RhbmNlLnJlZnJlc2goKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2luaXRDb2x1bW5zKGNvbXBvbmVudHM6IENvbXBvbmVudE1vZGVsQmFzZVtdKSB7XHJcbiAgICB0aGlzLmNvbHVtbnMgPSBjb21wb25lbnRzLm1hcChjID0+IHRoaXMuX3RyYW5zZm9ybUNvbHVtbihzdHJ1Y3R1cmVkQ2xvbmUoYykpKTtcclxuXHJcbiAgICBpZiAoIXRoaXMuZGlzYWJsZWQpIHtcclxuICAgICAgdGhpcy5jb2x1bW5zLnB1c2goe1xyXG4gICAgICAgIGNhcHRpb246ICcnLFxyXG4gICAgICAgIHR5cGU6ICdidXR0b25zJyxcclxuICAgICAgICB3aWR0aDogODAsXHJcbiAgICAgICAgY3NzQ2xhc3M6ICdjdXN0b20tY2VsbC1jb250cm9scycsXHJcbiAgICAgICAgYnV0dG9uczogW1xyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ2VkaXRCdXR0b25UZW1wbGF0ZScsXHJcbiAgICAgICAgICAgIGhpbnQ6ICfQoNC10LTQsNC60YLQuNGA0L7QstCw0YLRjCcsXHJcbiAgICAgICAgICB9LFxyXG4gICAgICAgICAge1xyXG4gICAgICAgICAgICB0ZW1wbGF0ZTogJ2RlbGV0ZUJ1dHRvblRlbXBsYXRlJyxcclxuICAgICAgICAgICAgaGludDogJ9Cj0LTQsNC70LjRgtGMJyxcclxuICAgICAgICAgIH0sXHJcbiAgICAgICAgXSxcclxuICAgICAgfSk7XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHRoaXMuZGF0YUdyaWQ/Lmluc3RhbmNlKSB7XHJcbiAgICAgIHRoaXMuZGF0YUdyaWQuaW5zdGFuY2UucmVwYWludCgpO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGV0ZWN0b3IuZGV0ZWN0Q2hhbmdlcygpO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfdHJhbnNmb3JtQ29sdW1uKGNvbXBvbmVudDogQ29tcG9uZW50TW9kZWxCYXNlKTogQ29sdW1uTW9kZWwge1xyXG4gICAgY29uc3QgZGF0YVR5cGUgPSB0aGlzLmdldERhdGFUeXBlKGNvbXBvbmVudCk7XHJcblxyXG4gICAgY29uc3QgY29sdW1uOiBDb2x1bW5Nb2RlbCA9IHtcclxuICAgICAgY2FwdGlvbjogY29tcG9uZW50Lm9wdGlvbnMubGFiZWwgfHwgJycsXHJcbiAgICAgIGNvbHVtbnM6IGNvbXBvbmVudC5jb21wb25lbnRzLm1hcChjID0+IHRoaXMuX3RyYW5zZm9ybUNvbHVtbihzdHJ1Y3R1cmVkQ2xvbmUoYykpKSxcclxuICAgICAgZGF0YUZpZWxkOiBjb21wb25lbnQuc3lzTmFtZSxcclxuICAgICAgZGF0YVR5cGU6IHRoaXMuZ2V0RGF0YVR5cGUoY29tcG9uZW50KSxcclxuICAgICAgZm9ybWF0OiB0aGlzLmdldEZvcm1hdChjb21wb25lbnQpLFxyXG4gICAgICBtaW5XaWR0aDogMTYwXHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0RGF0ZSAmJiAoY29tcG9uZW50IGFzIElucHV0RGF0ZU1vZGVsKS5vcHRpb25zLnJhbmdlKSB7XHJcbiAgICAgIGNvbHVtbi5jYWxjdWxhdGVDZWxsVmFsdWUgPSAocm93RGF0YTogYW55KSA9PiB7XHJcbiAgICAgICAgY29uc3QgZGF0ZVJhbmdlID0gcm93RGF0YVtjb21wb25lbnQuc3lzTmFtZV07XHJcbiAgICAgICAgXHJcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoZGF0ZVJhbmdlKSAmJiBkYXRlUmFuZ2UubGVuZ3RoID09PSAyKSB7XHJcbiAgICAgICAgICBjb25zdCBmb3JtYXREYXRlID0gKGRhdGVTdHI6IHN0cmluZykgPT4ge1xyXG4gICAgICAgICAgICBpZiAoIWRhdGVTdHIpIHJldHVybiAnJztcclxuICAgICAgICAgICAgY29uc3QgZCA9IG5ldyBEYXRlKGRhdGVTdHIpO1xyXG4gICAgICAgICAgICBpZiAoaXNOYU4oZC5nZXRUaW1lKCkpKSByZXR1cm4gJyc7XHJcbiAgICAgICAgICAgIGNvbnN0IGRheSA9IFN0cmluZyhkLmdldERhdGUoKSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgY29uc3QgbW9udGggPSBTdHJpbmcoZC5nZXRNb250aCgpICsgMSkucGFkU3RhcnQoMiwgJzAnKTtcclxuICAgICAgICAgICAgY29uc3QgeWVhciA9IGQuZ2V0RnVsbFllYXIoKTtcclxuICAgICAgICAgICAgcmV0dXJuIGAke2RheX0uJHttb250aH0uJHt5ZWFyfWA7XHJcbiAgICAgICAgICB9O1xyXG5cclxuICAgICAgICAgIGNvbnN0IHN0YXJ0Rm9ybWF0dGVkID0gZm9ybWF0RGF0ZShkYXRlUmFuZ2VbMF0pO1xyXG4gICAgICAgICAgY29uc3QgZW5kRm9ybWF0dGVkID0gZm9ybWF0RGF0ZShkYXRlUmFuZ2VbMV0pO1xyXG5cclxuICAgICAgICAgIGlmIChzdGFydEZvcm1hdHRlZCAmJiBlbmRGb3JtYXR0ZWQpIHtcclxuICAgICAgICAgICAgcmV0dXJuIGAke3N0YXJ0Rm9ybWF0dGVkfSDigJQgJHtlbmRGb3JtYXR0ZWR9YDtcclxuICAgICAgICAgIH1cclxuICAgICAgICAgIHJldHVybiBzdGFydEZvcm1hdHRlZCB8fCBlbmRGb3JtYXR0ZWQgfHwgJyc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIFxyXG4gICAgICAgIHJldHVybiBkYXRlUmFuZ2UgfHwgJyc7XHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGRhdGFUeXBlID09PSAnYm9vbGVhbicpIHtcclxuICAgICAgY29sdW1uLmNhbGN1bGF0ZUNlbGxWYWx1ZSA9IChyb3dEYXRhOiBhbnkpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvd0RhdGFbY29tcG9uZW50LnN5c05hbWVdO1xyXG4gICAgICAgIC8vINCV0YHQu9C4IHRydWUg4oCUINCU0LAsINC10YHQu9C4IGZhbHNlLCBcIlwiINC40LvQuCBudWxsIOKAlCDQndC10YJcclxuICAgICAgICByZXR1cm4gISF2YWx1ZTsgXHJcbiAgICAgIH07XHJcblxyXG4gICAgICBjb2x1bW4ubG9va3VwID0ge1xyXG4gICAgICAgIGRhdGFTb3VyY2U6IFtcclxuICAgICAgICAgIHsgdmFsdWU6IHRydWUsIGRpc3BsYXlWYWx1ZTogJ9CU0LAnIH0sXHJcbiAgICAgICAgICB7IHZhbHVlOiBmYWxzZSwgZGlzcGxheVZhbHVlOiAn0J3QtdGCJyB9XHJcbiAgICAgICAgXSxcclxuICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgZGlzcGxheUV4cHI6ICdkaXNwbGF5VmFsdWUnXHJcbiAgICAgIH07XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKGNvbXBvbmVudC50eXBlID09PSBDb21wb25lbnRUeXBlLklucHV0U2VsZWN0KSB7XHJcbiAgICAgIGNvbnN0IHNlbGVjdE1vZGVsID0gY29tcG9uZW50IGFzIElucHV0U2VsZWN0TW9kZWw7XHJcblxyXG4gICAgICBpZiAoc2VsZWN0TW9kZWwub3B0aW9ucy5tYW51YWwpIHtcclxuICAgICAgICBjb2x1bW4ubG9va3VwID0ge1xyXG4gICAgICAgICAgZGF0YVNvdXJjZTogc2VsZWN0TW9kZWwub3B0aW9ucy5pdGVtcyxcclxuICAgICAgICAgIHZhbHVlRXhwcjogJ3ZhbHVlJyxcclxuICAgICAgICAgIGRpc3BsYXlFeHByOiAndGV4dCdcclxuICAgICAgICB9O1xyXG4gICAgICB9IGVsc2UgaWYgKHNlbGVjdE1vZGVsLm9wdGlvbnMuZGlyZWN0b3J5Py5bMF0pIHtcclxuICAgICAgICBjb25zdCBkaXJlY3RvcnlOYW1lID0gc2VsZWN0TW9kZWwub3B0aW9ucy5kaXJlY3RvcnlbMF07XHJcblxyXG4gICAgICAgIGNvbHVtbi5sb29rdXAgPSB7XHJcbiAgICAgICAgICAvLyDQntCx0L7RgNCw0YfQuNCy0LDQtdC8INCyIEN1c3RvbVN0b3JlINC00LvRjyDRgdC+0L7RgtCy0LXRgtGB0YLQstC40Y8g0YLQuNC/0LDQvCBEZXZFeHRyZW1lXHJcbiAgICAgICAgICBkYXRhU291cmNlOiBuZXcgQ3VzdG9tU3RvcmUoe1xyXG4gICAgICAgICAgICBrZXk6ICd2YWx1ZScsXHJcbiAgICAgICAgICAgIGxvYWQ6ICgpID0+IHRoaXMuZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lKSxcclxuICAgICAgICAgICAgYnlLZXk6IChrZXkpID0+IHRoaXMuZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lKS50aGVuKGl0ZW1zID0+IGl0ZW1zLmZpbmQoaSA9PiBpLnZhbHVlID09PSBrZXkpKVxyXG4gICAgICAgICAgfSksXHJcbiAgICAgICAgICB2YWx1ZUV4cHI6ICd2YWx1ZScsXHJcbiAgICAgICAgICBkaXNwbGF5RXhwcjogJ3RleHQnXHJcbiAgICAgICAgfTtcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIGlmICh0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaW5kSWR4ID0gdGhpcy5zZXR0aW5ncy5vcHRpb25zLmdyb3Vwcy5maW5kSW5kZXgoeCA9PiB4ID09PSBjb21wb25lbnQuc3lzTmFtZSk7XHJcblxyXG4gICAgICBpZiAoZmluZElkeCAhPT0gLTEpIHtcclxuICAgICAgICBjb2x1bW4uZ3JvdXBJbmRleCA9IGZpbmRJZHhcclxuICAgICAgfVxyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBjb2x1bW5cclxuICB9XHJcblxyXG4gIHByaXZhdGUgZ2V0TG9va3VwRGF0YShkaXJlY3RvcnlOYW1lOiBzdHJpbmcpOiBQcm9taXNlPGFueVtdPiB7XHJcbiAgICAvLyDQn9GA0L7QstC10YDRj9C10Lwg0LrRjdGIXHJcbiAgICBpZiAodGhpcy5fbG9va3Vwc0NhY2hlLmhhcyhkaXJlY3RvcnlOYW1lKSkge1xyXG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2xvb2t1cHNDYWNoZS5nZXQoZGlyZWN0b3J5TmFtZSkhKTtcclxuICAgIH1cclxuXHJcbiAgICAvLyDQl9Cw0L/RgNCw0YjQuNCy0LDQtdC8INC00LDQvdC90YvQtSAo0LjRgdC/0L7Qu9GM0LfRg9C10Lwg0YLQvtGCINC20LUgb2JqZWN0SWQsINGH0YLQviDQuCDQsiDQvNC+0LTQsNC70LrQtSlcclxuICAgIC8vINCj0LHQtdC00LjRgtC10YHRjCwg0YfRgtC+IG9iamVjdElkINC00L7RgdGC0YPQv9C10L0g0LIg0Y3RgtC+0Lwg0LrQvtC80L/QvtC90LXQvdGC0LVcclxuICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSkgPT4ge1xyXG4gICAgICB0aGlzLl9yZWZlcmVuY2VTZXJ2aWNlLmdldFJlZmVyZW5jZXMoZGlyZWN0b3J5TmFtZSwgKHRoaXMgYXMgYW55KS5vYmplY3RJZCkuc3Vic2NyaWJlKHtcclxuICAgICAgICBuZXh0OiAocmVzdWx0KSA9PiB7XHJcbiAgICAgICAgICBjb25zdCBpdGVtcyA9IChyZXN1bHQ/LnJvd3MgfHwgW10pLm1hcCgocm93OiBhbnkpID0+ICh7XHJcbiAgICAgICAgICAgIHZhbHVlOiByb3cuYSxcclxuICAgICAgICAgICAgdGV4dDogcm93LmJcclxuICAgICAgICAgIH0pKTtcclxuICAgICAgICAgIHRoaXMuX2xvb2t1cHNDYWNoZS5zZXQoZGlyZWN0b3J5TmFtZSwgaXRlbXMpO1xyXG4gICAgICAgICAgcmVzb2x2ZShpdGVtcyk7XHJcbiAgICAgICAgfSxcclxuICAgICAgICBlcnJvcjogKCkgPT4gcmVzb2x2ZShbXSlcclxuICAgICAgfSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIC8vIHByaXZhdGUgX2J1aWxkVGFibGVWYWx1ZU1vZGVsKCk6IFRhYmxlVmFsdWVNb2RlbCB7XHJcbiAgLy8gICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9idWlsZFRhYmxlVmFsdWVNb2RlbF0g0KHRgtCw0YDRgiDRgdCx0L7RgNC60Lgg0LzQvtC00LXQu9C4INC00LvRjyDQodGC0L7RgNCwLiDQotC10LrRg9GJ0LjQtSDQu9C+0LrQsNC70YzQvdGL0LUgX3Jvd3M6Jywgc3RydWN0dXJlZENsb25lKHRoaXMuX3Jvd3MpKTtcclxuICAgIFxyXG4gIC8vICAgY29uc3QgZ3JvdXBlZERhdGEgPSB0aGlzLl9idWlsZEdyb3VwZWRJdGVtcyh0aGlzLl9yb3dzLCB0aGlzLnNldHRpbmdzLm9wdGlvbnMuZ3JvdXBzIHx8IFtdLCAwKTtcclxuICAvLyAgIGNvbnN0IHRvdGFscyA9IHRoaXMuX2NhbGN1bGF0ZVRvdGFscyh0aGlzLl9yb3dzKTtcclxuXHJcbiAgLy8gICB0aGlzLm1vZGVsID0ge1xyXG4gIC8vICAgICBzeXNOYW1lOiB0aGlzLnNldHRpbmdzLnN5c05hbWUsXHJcbiAgLy8gICAgIHR5cGU6IHRoaXMuc2V0dGluZ3MudHlwZSxcclxuICAvLyAgICAgZGF0YTogZ3JvdXBlZERhdGEsXHJcbiAgLy8gICAgIHRvdGFsc1xyXG4gIC8vICAgfTtcclxuXHJcbiAgLy8gICBjb25zb2xlLmxvZygnW1RhYmxlIC0+IF9idWlsZFRhYmxlVmFsdWVNb2RlbF0g0KHRhNC+0YDQvNC40YDQvtCy0LDQvdC90LDRjyDQvNC+0LTQtdC70Ywg0LTQu9GPINC+0YLQv9GA0LDQstC60Lgg0LIg0KHRgtC+0YA6Jywgc3RydWN0dXJlZENsb25lKHRoaXMubW9kZWwpKTtcclxuICAvLyAgIHJldHVybiBzdHJ1Y3R1cmVkQ2xvbmUodGhpcy5tb2RlbCk7XHJcbiAgLy8gfVxyXG5cclxuICBwcml2YXRlIF9idWlsZFRhYmxlVmFsdWVNb2RlbCgpOiBUYWJsZVZhbHVlTW9kZWwge1xyXG4gICAgLy8g0JPQu9GD0LHQvtC60L7QtSDQutC70L7QvdC40YDQvtCy0LDQvdC40LUg0YHRgtGA0L7Quiwg0YfRgtC+0LHRiyDQvdC1INC40YHQv9C+0YDRgtC40YLRjCBVSSDQtNC+INC+0YLQv9GA0LDQstC60LhcclxuICAgIGNvbnN0IHJvd3NDbG9uZSA9IHN0cnVjdHVyZWRDbG9uZSh0aGlzLl9yb3dzKTtcclxuXHJcbiAgICAvLyDQn9GA0L7QsdC10LPQsNC10LzRgdGPINC/0L4g0Y/Rh9C10LnQutCw0Lwg0Lgg0LXRgdC70Lgg0LLQuNC00LjQvCDQvNCw0YHRgdC40LIg0LTQsNGCIChyYW5nZSkg4oCUINGB0LrQu9C10LjQstCw0LXQvCDQsiDRgdGC0YDQvtC60YNcclxuICAgIHJvd3NDbG9uZS5mb3JFYWNoKHJvdyA9PiB7XHJcbiAgICAgIGlmIChyb3cuZGF0YSkge1xyXG4gICAgICAgIHJvdy5kYXRhLmZvckVhY2goY2VsbCA9PiB7XHJcbiAgICAgICAgICBpZiAoY2VsbC50eXBlID09PSAnaW5wdXREYXRlJyAmJiBBcnJheS5pc0FycmF5KGNlbGwudmFsdWUpKSB7XHJcbiAgICAgICAgICAgIC8vINCh0LrQu9C10LjQstCw0LXQvCDQvNCw0YHRgdC40LIgWycyMDI2LTA1LTA1Li4uJywgJzIwMjYtMDUtMDcuLi4nXSDQsiDRgdGC0YDQvtC60YMgXCIyMDI2LTA1LTA1Li4uLzIwMjYtMDUtMDcuLi5cIlxyXG4gICAgICAgICAgICBjZWxsLnZhbHVlID0gY2VsbC52YWx1ZS5qb2luKCcvJyk7IFxyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH0pO1xyXG4gICAgICB9XHJcbiAgICB9KTtcclxuICAgIFxyXG4gICAgY29uc3QgZ3JvdXBlZERhdGEgPSB0aGlzLl9idWlsZEdyb3VwZWRJdGVtcyhyb3dzQ2xvbmUsIHRoaXMuc2V0dGluZ3Mub3B0aW9ucy5ncm91cHMgfHwgW10sIDApO1xyXG4gICAgY29uc3QgdG90YWxzID0gdGhpcy5fY2FsY3VsYXRlVG90YWxzKHJvd3NDbG9uZSk7XHJcblxyXG4gICAgdGhpcy5tb2RlbCA9IHtcclxuICAgICAgc3lzTmFtZTogdGhpcy5zZXR0aW5ncy5zeXNOYW1lLFxyXG4gICAgICB0eXBlOiB0aGlzLnNldHRpbmdzLnR5cGUsXHJcbiAgICAgIGRhdGE6IGdyb3VwZWREYXRhLFxyXG4gICAgICB0b3RhbHNcclxuICAgIH07XHJcblxyXG4gICAgcmV0dXJuIHN0cnVjdHVyZWRDbG9uZSh0aGlzLm1vZGVsKTtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2J1aWxkR3JvdXBlZEl0ZW1zKHJvd3M6IFRhYmxlUm93TW9kZWxbXSwgZ3JvdXBGaWVsZHM6IHN0cmluZ1tdLCBsZXZlbDogbnVtYmVyKTogVGFibGVJdGVtW10ge1xyXG4gICAgaWYgKCFncm91cEZpZWxkcy5sZW5ndGggfHwgbGV2ZWwgPj0gZ3JvdXBGaWVsZHMubGVuZ3RoKSB7XHJcbiAgICAgIHJldHVybiByb3dzLm1hcChyb3cgPT4gKHsgLi4ucm93LCBpdGVtVHlwZTogcm93Lml0ZW1UeXBlID8/IFRhYmxlSXRlbVR5cGUuUm93IH0pKTtcclxuICAgIH1cclxuXHJcbiAgICBjb25zdCBncm91cEZpZWxkID0gZ3JvdXBGaWVsZHNbbGV2ZWxdO1xyXG4gICAgY29uc3QgZ3JvdXBzID0gbmV3IE1hcDxzdHJpbmcsIHsgcm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cFZhbHVlU3lzTmFtZTogc3RyaW5nIH0+KCk7XHJcblxyXG4gICAgZm9yIChjb25zdCByb3cgb2Ygcm93cykge1xyXG4gICAgICBjb25zdCBmaWVsZFZhbHVlID0gcm93LmRhdGEuZmluZCh4ID0+IHguc3lzTmFtZSA9PT0gZ3JvdXBGaWVsZCk/LnZhbHVlID8/IG51bGw7XHJcbiAgICAgIGNvbnN0IGtleSA9IEpTT04uc3RyaW5naWZ5KGZpZWxkVmFsdWUpO1xyXG4gICAgICBjb25zdCBleGlzdGluZyA9IGdyb3Vwcy5nZXQoa2V5KSA/PyB7XHJcbiAgICAgICAgcm93czogW10sXHJcbiAgICAgICAgZ3JvdXBWYWx1ZVN5c05hbWU6IHRoaXMuX2dldEdyb3VwVmFsdWVTeXNOYW1lKGZpZWxkVmFsdWUsIGdyb3VwRmllbGQpXHJcbiAgICAgIH07XHJcbiAgICAgIGV4aXN0aW5nLnJvd3MucHVzaChyb3cpO1xyXG4gICAgICBncm91cHMuc2V0KGtleSwgZXhpc3RpbmcpO1xyXG4gICAgfVxyXG5cclxuICAgIGNvbnN0IHJlc3VsdDogVGFibGVJdGVtW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGdyb3VwSXRlbSBvZiBncm91cHMudmFsdWVzKCkpIHtcclxuICAgICAgY29uc3QgbmVzdGVkRGF0YSA9IHRoaXMuX2J1aWxkR3JvdXBlZEl0ZW1zKGdyb3VwSXRlbS5yb3dzLCBncm91cEZpZWxkcywgbGV2ZWwgKyAxKTtcclxuICAgICAgY29uc3QgZ3JvdXBNb2RlbDogVGFibGVHcm91cE1vZGVsID0ge1xyXG4gICAgICAgIGl0ZW1UeXBlOiBUYWJsZUl0ZW1UeXBlLkdyb3VwLFxyXG4gICAgICAgIGRhdGE6IG5lc3RlZERhdGEsXHJcbiAgICAgICAgdG90YWxzOiB0aGlzLl9jYWxjdWxhdGVUb3RhbHMoZ3JvdXBJdGVtLnJvd3MsIGdyb3VwSXRlbS5ncm91cFZhbHVlU3lzTmFtZSlcclxuICAgICAgfTtcclxuXHJcbiAgICAgIHJlc3VsdC5wdXNoKGdyb3VwTW9kZWwpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiByZXN1bHQ7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9jYWxjdWxhdGVUb3RhbHMocm93czogVGFibGVSb3dNb2RlbFtdLCBncm91cEZpZWxkU3lzTmFtZT86IHN0cmluZyk6IENvbXBvbmVudFZhbHVlTW9kZWxbXSB7XHJcbiAgICBjb25zdCB0b3RhbENvbHVtbnMgPSB0aGlzLl9nZXRUb3RhbENvbHVtbnModGhpcy5zZXR0aW5ncy5jb21wb25lbnRzKTtcclxuXHJcbiAgICByZXR1cm4gdG90YWxDb2x1bW5zLm1hcChjb21wb25lbnQgPT4ge1xyXG4gICAgICBjb25zdCBzdW0gPSByb3dzLnJlZHVjZSgoYWNjLCByb3cpID0+IHtcclxuICAgICAgICBjb25zdCB2YWx1ZSA9IHJvdy5kYXRhLmZpbmQoeCA9PiB4LnN5c05hbWUgPT09IGNvbXBvbmVudC5zeXNOYW1lKT8udmFsdWU7XHJcbiAgICAgICAgY29uc3QgbnVtZXJpY1ZhbHVlID0gdHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJyA/IHZhbHVlIDogTnVtYmVyKHZhbHVlKTtcclxuXHJcbiAgICAgICAgcmV0dXJuIE51bWJlci5pc0Zpbml0ZShudW1lcmljVmFsdWUpID8gYWNjICsgbnVtZXJpY1ZhbHVlIDogYWNjO1xyXG4gICAgICB9LCAwKTtcclxuXHJcbiAgICAgIHJldHVybiB7XHJcbiAgICAgICAgc3lzTmFtZTogdGhpcy5fZ2V0VG90YWxTeXNOYW1lKGNvbXBvbmVudC5zeXNOYW1lLCBncm91cEZpZWxkU3lzTmFtZSksXHJcbiAgICAgICAgdHlwZTogY29tcG9uZW50LnR5cGUsXHJcbiAgICAgICAgdmFsdWVUeXBlOiBjb21wb25lbnQudmFsdWVUeXBlLFxyXG4gICAgICAgIHZhbHVlOiBzdW1cclxuICAgICAgfSBhcyBDb21wb25lbnRWYWx1ZU1vZGVsO1xyXG4gICAgfSk7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUb3RhbFN5c05hbWUoY29sdW1uU3lzTmFtZTogc3RyaW5nLCBncm91cEZpZWxkU3lzTmFtZT86IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoZ3JvdXBGaWVsZFN5c05hbWUpIHtcclxuICAgICAgcmV0dXJuIGAke2NvbHVtblN5c05hbWV9XyR7Z3JvdXBGaWVsZFN5c05hbWV9X3RvdGFsYDtcclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gYCR7Y29sdW1uU3lzTmFtZX1fdG90YWxgO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSBfZ2V0R3JvdXBWYWx1ZVN5c05hbWUoZmllbGRWYWx1ZTogYW55LCBmYWxsYmFja1N5c05hbWU6IHN0cmluZyk6IHN0cmluZyB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShmaWVsZFZhbHVlKSAmJiBmaWVsZFZhbHVlLmxlbmd0aCkge1xyXG4gICAgICBjb25zdCBmaXJzdFZhbHVlID0gZmllbGRWYWx1ZVswXTtcclxuICAgICAgaWYgKHR5cGVvZiBmaXJzdFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmlyc3RWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpcnN0VmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcoZmlyc3RWYWx1ZSk7XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICBpZiAoZmllbGRWYWx1ZSAmJiB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ29iamVjdCcpIHtcclxuICAgICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlLnZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmllbGRWYWx1ZS52YWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpZWxkVmFsdWUudmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICAgIHJldHVybiBTdHJpbmcoZmllbGRWYWx1ZS52YWx1ZSk7XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIGlmICh0eXBlb2YgZmllbGRWYWx1ZS5zeXNOYW1lID09PSAnc3RyaW5nJyAmJiBmaWVsZFZhbHVlLnN5c05hbWUpIHtcclxuICAgICAgICByZXR1cm4gZmllbGRWYWx1ZS5zeXNOYW1lO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgaWYgKHR5cGVvZiBmaWVsZFZhbHVlID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgZmllbGRWYWx1ZSA9PT0gJ251bWJlcicgfHwgdHlwZW9mIGZpZWxkVmFsdWUgPT09ICdib29sZWFuJykge1xyXG4gICAgICByZXR1cm4gU3RyaW5nKGZpZWxkVmFsdWUpO1xyXG4gICAgfVxyXG5cclxuICAgIHJldHVybiBmYWxsYmFja1N5c05hbWU7XHJcbiAgfVxyXG5cclxuICBwcml2YXRlIF9nZXRUb3RhbENvbHVtbnMoY29tcG9uZW50czogQ29tcG9uZW50TW9kZWxCYXNlW10pOiBJbnB1dE51bWJlck1vZGVsW10ge1xyXG4gICAgY29uc3QgcmVzdWx0OiBJbnB1dE51bWJlck1vZGVsW10gPSBbXTtcclxuXHJcbiAgICBmb3IgKGNvbnN0IGNvbXBvbmVudCBvZiBjb21wb25lbnRzKSB7XHJcbiAgICAgIGlmIChjb21wb25lbnQudHlwZSA9PT0gQ29tcG9uZW50VHlwZS5JbnB1dE51bWJlciAmJiB0aGlzLnNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgcmVzdWx0LnB1c2goY29tcG9uZW50IGFzIElucHV0TnVtYmVyTW9kZWwpO1xyXG4gICAgICB9XHJcblxyXG4gICAgICBpZiAoY29tcG9uZW50LmNvbXBvbmVudHM/Lmxlbmd0aCkge1xyXG4gICAgICAgIHJlc3VsdC5wdXNoKC4uLnRoaXMuX2dldFRvdGFsQ29sdW1ucyhjb21wb25lbnQuY29tcG9uZW50cykpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIHJlc3VsdDtcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2V4dHJhY3RSb3dzKGl0ZW1zOiBUYWJsZUl0ZW1bXSA9IFtdKTogVGFibGVSb3dNb2RlbFtdIHtcclxuICAgIGNvbnN0IHJvd3M6IFRhYmxlUm93TW9kZWxbXSA9IFtdO1xyXG5cclxuICAgIGZvciAoY29uc3QgaXRlbSBvZiBpdGVtcykge1xyXG4gICAgICBpZiAodGhpcy5faXNSb3coaXRlbSkpIHtcclxuICAgICAgICByb3dzLnB1c2goe1xyXG4gICAgICAgICAgLi4uaXRlbSxcclxuICAgICAgICAgIGl0ZW1UeXBlOiBUYWJsZUl0ZW1UeXBlLlJvd1xyXG4gICAgICAgIH0pO1xyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGNvbnN0IGdyb3VwID0gaXRlbSBhcyBUYWJsZUdyb3VwTW9kZWw7XHJcbiAgICAgICAgaWYgKGdyb3VwLmRhdGE/Lmxlbmd0aCkge1xyXG4gICAgICAgICAgcm93cy5wdXNoKC4uLnRoaXMuX2V4dHJhY3RSb3dzKGdyb3VwLmRhdGEpKTtcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH1cclxuXHJcbiAgICByZXR1cm4gcm93cztcclxuICB9XHJcblxyXG4gIHByaXZhdGUgX2lzUm93KGl0ZW06IFRhYmxlSXRlbSk6IGl0ZW0gaXMgVGFibGVSb3dNb2RlbCB7XHJcbiAgICBjb25zdCBtYXliZVJvdyA9IGl0ZW0gYXMgVGFibGVSb3dNb2RlbDtcclxuICAgIHJldHVybiB0eXBlb2YgbWF5YmVSb3cuaWQgPT09ICdzdHJpbmcnICYmIEFycmF5LmlzQXJyYXkobWF5YmVSb3cuZGF0YSk7XHJcbiAgfVxyXG59XHJcbiIsIkBpZiAoc2V0dGluZ3MpIHtcclxuICA8ZGl2IGNsYXNzPVwiaW5wdXQtdGFibGUtY29udGVudCB3LTEwMFwiPlxyXG4gICAgQGlmIChzZXR0aW5ncy5vcHRpb25zLmxhYmVsKSB7XHJcbiAgICAgIDxtcngtbGFiZWxcclxuICAgICAgICBbcmVxdWlyZWRdPVwic2V0dGluZ3Mub3B0aW9ucy5yZXF1aXJlZFwiXHJcbiAgICAgICAgW3Rvb2x0aXBdPVwic2V0dGluZ3Mub3B0aW9ucy50b29sdGlwIHx8ICcnXCJcclxuICAgICAgPlxyXG4gICAgICAgIHt7IHNldHRpbmdzLm9wdGlvbnMubGFiZWwgfX1cclxuICAgICAgPC9tcngtbGFiZWw+XHJcbiAgICB9XHJcblxyXG4gICAgPGR4LWRhdGEtZ3JpZFxyXG4gICAgICAjZGF0YUdyaWRcclxuICAgICAgW2RhdGFTb3VyY2VdPVwiZGF0YVNvdXJjZVwiXHJcbiAgICAgIFtjb2x1bW5zXT1cImNvbHVtbnNcIlxyXG4gICAgICBub0RhdGFUZXh0PVwi0J3QtdGCINC00LDQvdC90YvRhVwiXHJcbiAgICAgIHN0eWxlPVwid2lkdGg6IDEwMCVcIlxyXG4gICAgICBbd29yZFdyYXBFbmFibGVkXT1cInRydWVcIlxyXG4gICAgICBbY29sdW1uQXV0b1dpZHRoXT1cInRydWVcIlxyXG4gICAgICBbY2xhc3Mubm9EYXRhXT1cImlzUmVkTm9EYXRhXCJcclxuICAgID5cclxuICAgICAgQGlmKCFkaXNhYmxlZCkge1xyXG4gICAgICAgIDxkeG8tdG9vbGJhcj5cclxuICAgICAgICAgIDxkeGktaXRlbSBsb2NhdGlvbj1cImFmdGVyXCI+XHJcbiAgICAgICAgICAgIDxkaXYgKmR4VGVtcGxhdGUgY2xhc3M9XCJhZGQtcm93XCI+XHJcbiAgICAgICAgICAgICAgPG1yeC1idXR0b25cclxuICAgICAgICAgICAgICAgIFtzaXplXT1cIidtZWRpdW0nXCJcclxuICAgICAgICAgICAgICAgIFt0eXBlXT1cIidzZWNvbmRhcnknXCJcclxuICAgICAgICAgICAgICAgIFtjdXN0b21DbGFzc2VzXT1cIidtYi0zJ1wiXHJcbiAgICAgICAgICAgICAgICAobXJ4Q2xpY2spPVwiY3JlYXRlUm93KClcIlxyXG4gICAgICAgICAgICAgID57e3NldHRpbmdzLm9wdGlvbnMuYWRkQnRuVGl0bGV9fVxyXG4gICAgICAgICAgICAgIDwvbXJ4LWJ1dHRvbj5cclxuICAgICAgICAgICAgPC9kaXY+XHJcbiAgICAgICAgICA8L2R4aS1pdGVtPlxyXG4gICAgICAgIDwvZHhvLXRvb2xiYXI+XHJcbiAgICAgIH1cclxuXHJcbiAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgYnV0dG9uRGF0YSBvZiAnZWRpdEJ1dHRvblRlbXBsYXRlJ1wiPlxyXG4gICAgICAgIDxzcGFuIGNsYXNzPVwibXJ4LWljb24gaWNvbi1lZGl0IGljb24tZm9udC0xNiBjdXJzb3ItcG9pbnRlclwiIChjbGljayk9XCJlZGl0Um93KGJ1dHRvbkRhdGEpXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIDxkaXYgKmR4VGVtcGxhdGU9XCJsZXQgYnV0dG9uRGF0YSBvZiAnZGVsZXRlQnV0dG9uVGVtcGxhdGUnXCI+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWRlbGV0ZSBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlUm93KGJ1dHRvbkRhdGEpXCI+PC9zcGFuPlxyXG4gICAgICA8L2Rpdj5cclxuXHJcbiAgICAgIEBpZiAoZGF0YVNvdXJjZS5sZW5ndGgpIHtcclxuICAgICAgICA8ZHhvLXN1bW1hcnk+XHJcbiAgICAgICAgICBAZm9yIChjb21wb25lbnQgb2Ygc2V0dGluZ3MuY29tcG9uZW50czsgdHJhY2sgY29tcG9uZW50LmlkOyBsZXQgZmlyc3QgPSAkZmlyc3QpIHtcclxuICAgICAgICAgICAgQGlmICghZmlyc3QpIHtcclxuICAgICAgICAgICAgICBAaWYgKHNob3dUb3RhbChjb21wb25lbnQpKSB7XHJcbiAgICAgICAgICAgICAgICA8ZHhpLWdyb3VwLWl0ZW1cclxuICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cItCY0YLQvtCz0L46IHswfVwiXHJcbiAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgW2FsaWduQnlDb2x1bW5dPVwidHJ1ZVwiPlxyXG4gICAgICAgICAgICAgICAgPC9keGktZ3JvdXAtaXRlbT5cclxuXHJcbiAgICAgICAgICAgICAgICA8ZHhpLXRvdGFsLWl0ZW0gXHJcbiAgICAgICAgICAgICAgICAgIFtjb2x1bW5dPVwiY29tcG9uZW50LnN5c05hbWVcIiBcclxuICAgICAgICAgICAgICAgICAgZGlzcGxheUZvcm1hdD1cInswfVwiXHJcbiAgICAgICAgICAgICAgICAgIHN1bW1hcnlUeXBlPVwic3VtXCJcclxuICAgICAgICAgICAgICAgID48L2R4aS10b3RhbC1pdGVtPlxyXG4gICAgICAgICAgICAgIH1cclxuXHJcbiAgICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIGNvbXBvbmVudC5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgIEBpZiAoc2hvd1RvdGFsKGNvbXBvbmVudCkpIHtcclxuICAgICAgICAgICAgICAgICAgPGR4aS1ncm91cC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgc3VtbWFyeVR5cGU9XCJzdW1cIlxyXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlGb3JtYXQ9XCLQmNGC0L7Qs9C+OiB7MH1cIlxyXG4gICAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICBbYWxpZ25CeUNvbHVtbl09XCJ0cnVlXCI+XHJcbiAgICAgICAgICAgICAgICAgIDwvZHhpLWdyb3VwLWl0ZW0+XHJcbiAgICAgICAgICAgICAgICB9XHJcblxyXG4gICAgICAgICAgICAgICAgQGZvciAoY29tcG9uZW50IG9mIGNvbXBvbmVudC5jb21wb25lbnRzOyB0cmFjayBjb21wb25lbnQuaWQpIHtcclxuICAgICAgICAgICAgICAgICAgQGlmIChzaG93VG90YWwoY29tcG9uZW50KSkge1xyXG4gICAgICAgICAgICAgICAgICAgIDxkeGktZ3JvdXAtaXRlbVxyXG4gICAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBzdW1tYXJ5VHlwZT1cInN1bVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5Rm9ybWF0PVwi0JjRgtC+0LPQvjogezB9XCJcclxuICAgICAgICAgICAgICAgICAgICAgIFtzaG93SW5Hcm91cEZvb3Rlcl09XCJ0cnVlXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFthbGlnbkJ5Q29sdW1uXT1cInRydWVcIj5cclxuICAgICAgICAgICAgICAgICAgICA8L2R4aS1ncm91cC1pdGVtPlxyXG4gICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgfVxyXG4gICAgICAgICAgICB9IEBlbHNlIHtcclxuICAgICAgICAgICAgICBAaWYgKGhhc0FueVRvdGFsKSB7IFxyXG4gICAgICAgICAgICAgICAgPGR4aS10b3RhbC1pdGVtXHJcbiAgICAgICAgICAgICAgICAgICAgW2NvbHVtbl09XCJjb21wb25lbnQuc3lzTmFtZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgW2Nzc0NsYXNzXT1cIid0ZXh0LWJvbGQnXCJcclxuICAgICAgICAgICAgICAgICAgICBbZGlzcGxheUZvcm1hdF09XCJzaG93VG90YWwoY29tcG9uZW50KSA/ICd7MH0nIDogJ9CY0KLQntCT0J4nXCJcclxuICAgICAgICAgICAgICAgICAgICBbc3VtbWFyeVR5cGVdPVwic2hvd1RvdGFsKGNvbXBvbmVudCkgPyAnc3VtJyA6IHVuZGVmaW5lZFwiXHJcbiAgICAgICAgICAgICAgICA+PC9keGktdG90YWwtaXRlbT5cclxuICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgIH1cclxuICAgICAgICAgIH1cclxuICAgICAgICA8L2R4by1zdW1tYXJ5PlxyXG4gICAgICB9XHJcbiAgICA8L2R4LWRhdGEtZ3JpZD5cclxuXHJcbiAgICBAaWYoISFzZXR0aW5ncy5vcHRpb25zLm1heFJvd3MpIHtcclxuICAgICAgPG1yeC1oaW50LWVycm9yLW1lc3NhZ2VcclxuICAgICAgICBtZXNzYWdlPVwi0JzQsNC60YHQuNC80LDQu9GM0L3QvtC1INC60L7Qu9C40YfQtdGB0YLQstC+INGB0YLRgNC+0Lo6IHt7IHNldHRpbmdzLm9wdGlvbnMubWF4Um93cyB9fVwiXHJcbiAgICAgICAgW21heFZhbHVlXT1cInNldHRpbmdzLm9wdGlvbnMubWF4Um93c1wiXHJcbiAgICAgICAgW3ZhbHVlXT1cInJvd3NDb3VudFwiXHJcbiAgICAgID48L21yeC1oaW50LWVycm9yLW1lc3NhZ2U+XHJcbiAgICB9XHJcblxyXG4gICAgPG5nLXRlbXBsYXRlICNlZGl0VGVtcGxhdGUgbGV0LWNlbGxJbmZvPVwiY2VsbEluZm9cIj5cclxuICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBhbGlnbi1pdGVtcy1jZW50ZXIganVzdGlmeS1jb250ZW50LWNlbnRlclwiIHN0eWxlPVwiZ2FwOiA0cHhcIj5cclxuICAgICAgICA8c3BhbiBjbGFzcz1cIm1yeC1pY29uIGljb24tZWRpdCBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZWRpdFJvdyhjZWxsSW5mbylcIj48L3NwYW4+XHJcbiAgICAgICAgPHNwYW4gY2xhc3M9XCJtcngtaWNvbiBpY29uLWRlbGV0ZSBpY29uLWZvbnQtMTYgY3Vyc29yLXBvaW50ZXJcIiAoY2xpY2spPVwiZGVsZXRlUm93KGNlbGxJbmZvKVwiPjwvc3Bhbj5cclxuICAgICAgPC9kaXY+XHJcbiAgICA8L25nLXRlbXBsYXRlPlxyXG4gIDwvZGl2PlxyXG59XHJcblxyXG5cclxuIl19
|
|
@@ -2431,23 +2431,34 @@ class InputTableComponent {
|
|
|
2431
2431
|
this._subscriptions$.push(this._store.select(selectValueModel(this.settings))
|
|
2432
2432
|
.subscribe((result) => {
|
|
2433
2433
|
const cloneResult = structuredClone(result);
|
|
2434
|
-
//
|
|
2434
|
+
// Наша проверка по sysName, которую мы добавили ранее
|
|
2435
2435
|
if (cloneResult && !Array.isArray(cloneResult) && cloneResult.sysName === this.settings.sysName) {
|
|
2436
|
-
//
|
|
2436
|
+
// --- ВОТ ЭТОТ НОВЫЙ БЛОК ДЛЯ ВОССТАНОВЛЕНИЯ ДАТ ---
|
|
2437
|
+
// Проверяем, есть ли вообще данные внутри пришедшей модели
|
|
2438
|
+
if (cloneResult.data && Array.isArray(cloneResult.data)) {
|
|
2439
|
+
cloneResult.data.forEach((row) => {
|
|
2440
|
+
if (row.data && Array.isArray(row.data)) {
|
|
2441
|
+
row.data.forEach((cell) => {
|
|
2442
|
+
// Если тип компонента — дата, значение — строка и в ней есть наш разделитель '/'
|
|
2443
|
+
if (cell.type === 'inputDate' && typeof cell.value === 'string' && cell.value.includes('/')) {
|
|
2444
|
+
console.log(`[Table <- Store Parsing] Восстанавливаем range-дату из строки для ${cell.sysName}:`, cell.value);
|
|
2445
|
+
// Разрезаем строку "2026-05-05/2026-05-07" обратно в массив ['2026-05-05', '2026-05-07']
|
|
2446
|
+
cell.value = cell.value.split('/');
|
|
2447
|
+
}
|
|
2448
|
+
});
|
|
2449
|
+
}
|
|
2450
|
+
});
|
|
2451
|
+
}
|
|
2452
|
+
// -------------------------------------------------
|
|
2453
|
+
// Проверяем, изменились ли данные по сравнению с текущими
|
|
2437
2454
|
const isDataChanged = JSON.stringify(this.model?.data) !== JSON.stringify(cloneResult.data);
|
|
2438
2455
|
if (isDataChanged) {
|
|
2439
|
-
console.log(`[Table -> Store Apply] [${this.settings.sysName}]
|
|
2456
|
+
console.log(`[Table -> Store Apply] [${this.settings.sysName}] Синхронизируем строки.`);
|
|
2440
2457
|
this.model = structuredClone(cloneResult);
|
|
2458
|
+
// Извлекаем строки (теперь внутри cell.value уже лежит правильный массив, и они не занулятся!)
|
|
2441
2459
|
this._rows = this._extractRows(this.model.data);
|
|
2442
2460
|
this._initDataSource(this._rows);
|
|
2443
2461
|
}
|
|
2444
|
-
else {
|
|
2445
|
-
console.log(`[Table -> Store Skip] [${this.settings.sysName}] Данные нашей таблицы идентичны. Пропускаем.`);
|
|
2446
|
-
}
|
|
2447
|
-
}
|
|
2448
|
-
else if (cloneResult && !Array.isArray(cloneResult)) {
|
|
2449
|
-
// Логируем игнорирование чужих таблиц (itb4, itb5)
|
|
2450
|
-
console.log(`[Table -> Store Ignore] Игнорируем Стор. Текущая таблица: ${this.settings.sysName}, Пришло для: ${cloneResult.sysName}`);
|
|
2451
2462
|
}
|
|
2452
2463
|
}));
|
|
2453
2464
|
}
|
|
@@ -2466,7 +2477,17 @@ class InputTableComponent {
|
|
|
2466
2477
|
isCheckRequired: this._isCheckRequired
|
|
2467
2478
|
}).afterClosed().subscribe(resolve => {
|
|
2468
2479
|
console.log('[Table <- Modal Closed (Create)] Результат из модалки:', structuredClone(resolve));
|
|
2469
|
-
if (resolve.result) {
|
|
2480
|
+
if (resolve && resolve.result && resolve.rowModel) {
|
|
2481
|
+
// КРИТИЧЕСКИЙ ХАК: Склеиваем массив диапазона дат в строку перед отправкой в Стор
|
|
2482
|
+
if (resolve.rowModel.data && Array.isArray(resolve.rowModel.data)) {
|
|
2483
|
+
resolve.rowModel.data.forEach((cell) => {
|
|
2484
|
+
if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
|
|
2485
|
+
console.log(`[Table <- Modal] Найдена рендж-дата в ${cell.sysName}. Склеиваем в строку:`, cell.value);
|
|
2486
|
+
cell.value = cell.value.join('/'); // Превращаем ['2026-05-05...', '2026-05-07...'] в "дата1/дата2"
|
|
2487
|
+
}
|
|
2488
|
+
});
|
|
2489
|
+
}
|
|
2490
|
+
// Накатываем обновленную модель в локальные строки
|
|
2470
2491
|
this._rows = [...structuredClone(this._rows), resolve.rowModel];
|
|
2471
2492
|
this._initDataSource(this._rows);
|
|
2472
2493
|
this._changeSubject$.next(this._buildTableValueModel());
|
|
@@ -2497,16 +2518,21 @@ class InputTableComponent {
|
|
|
2497
2518
|
settings: this.settings,
|
|
2498
2519
|
rowModel: rowModelClone
|
|
2499
2520
|
}).afterClosed().subscribe(resolve => {
|
|
2500
|
-
console.log('[Table <- Modal Closed (
|
|
2501
|
-
if (resolve.result) {
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2521
|
+
console.log('[Table <- Modal Closed (Create)] Результат из модалки:', structuredClone(resolve));
|
|
2522
|
+
if (resolve && resolve.result && resolve.rowModel) {
|
|
2523
|
+
// КРИТИЧЕСКИЙ ХАК: Склеиваем массив диапазона дат в строку перед отправкой в Стор
|
|
2524
|
+
if (resolve.rowModel.data && Array.isArray(resolve.rowModel.data)) {
|
|
2525
|
+
resolve.rowModel.data.forEach((cell) => {
|
|
2526
|
+
if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
|
|
2527
|
+
console.log(`[Table <- Modal] Найдена рендж-дата в ${cell.sysName}. Склеиваем в строку:`, cell.value);
|
|
2528
|
+
cell.value = cell.value.join('/'); // Превращаем ['2026-05-05...', '2026-05-07...'] в "дата1/дата2"
|
|
2529
|
+
}
|
|
2530
|
+
});
|
|
2509
2531
|
}
|
|
2532
|
+
// Накатываем обновленную модель в локальные строки
|
|
2533
|
+
this._rows = [...structuredClone(this._rows), resolve.rowModel];
|
|
2534
|
+
this._initDataSource(this._rows);
|
|
2535
|
+
this._changeSubject$.next(this._buildTableValueModel());
|
|
2510
2536
|
}
|
|
2511
2537
|
});
|
|
2512
2538
|
}
|
|
@@ -2698,17 +2724,41 @@ class InputTableComponent {
|
|
|
2698
2724
|
});
|
|
2699
2725
|
});
|
|
2700
2726
|
}
|
|
2727
|
+
// private _buildTableValueModel(): TableValueModel {
|
|
2728
|
+
// console.log('[Table -> _buildTableValueModel] Старт сборки модели для Стора. Текущие локальные _rows:', structuredClone(this._rows));
|
|
2729
|
+
// const groupedData = this._buildGroupedItems(this._rows, this.settings.options.groups || [], 0);
|
|
2730
|
+
// const totals = this._calculateTotals(this._rows);
|
|
2731
|
+
// this.model = {
|
|
2732
|
+
// sysName: this.settings.sysName,
|
|
2733
|
+
// type: this.settings.type,
|
|
2734
|
+
// data: groupedData,
|
|
2735
|
+
// totals
|
|
2736
|
+
// };
|
|
2737
|
+
// console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
|
|
2738
|
+
// return structuredClone(this.model);
|
|
2739
|
+
// }
|
|
2701
2740
|
_buildTableValueModel() {
|
|
2702
|
-
|
|
2703
|
-
const
|
|
2704
|
-
|
|
2741
|
+
// Глубокое клонирование строк, чтобы не испортить UI до отправки
|
|
2742
|
+
const rowsClone = structuredClone(this._rows);
|
|
2743
|
+
// Пробегаемся по ячейкам и если видим массив дат (range) — склеиваем в строку
|
|
2744
|
+
rowsClone.forEach(row => {
|
|
2745
|
+
if (row.data) {
|
|
2746
|
+
row.data.forEach(cell => {
|
|
2747
|
+
if (cell.type === 'inputDate' && Array.isArray(cell.value)) {
|
|
2748
|
+
// Склеиваем массив ['2026-05-05...', '2026-05-07...'] в строку "2026-05-05.../2026-05-07..."
|
|
2749
|
+
cell.value = cell.value.join('/');
|
|
2750
|
+
}
|
|
2751
|
+
});
|
|
2752
|
+
}
|
|
2753
|
+
});
|
|
2754
|
+
const groupedData = this._buildGroupedItems(rowsClone, this.settings.options.groups || [], 0);
|
|
2755
|
+
const totals = this._calculateTotals(rowsClone);
|
|
2705
2756
|
this.model = {
|
|
2706
2757
|
sysName: this.settings.sysName,
|
|
2707
2758
|
type: this.settings.type,
|
|
2708
2759
|
data: groupedData,
|
|
2709
2760
|
totals
|
|
2710
2761
|
};
|
|
2711
|
-
console.log('[Table -> _buildTableValueModel] Сформированная модель для отправки в Стор:', structuredClone(this.model));
|
|
2712
2762
|
return structuredClone(this.model);
|
|
2713
2763
|
}
|
|
2714
2764
|
_buildGroupedItems(rows, groupFields, level) {
|