tuain-ng-forms-lib 17.2.21 → 17.2.22

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (106) hide show
  1. package/.browserslistrc +16 -0
  2. package/.yarn/cache/nanoid-npm-4.0.0-924f5c6312-7d5946df5c.zip +0 -0
  3. package/.yarn/cache/tslib-npm-2.4.1-36f0ed04db-19480d6e03.zip +0 -0
  4. package/.yarn/cache/yn-npm-5.0.0-b001dab23c-f0ec7710d3.zip +0 -0
  5. package/.yarn/install-state.gz +0 -0
  6. package/karma.conf.js +44 -0
  7. package/ng-package.json +11 -0
  8. package/package.json +2 -16
  9. package/src/lib/classes/forms/action.ts +117 -0
  10. package/src/lib/classes/forms/element.ts +26 -0
  11. package/src/lib/classes/forms/field.ts +522 -0
  12. package/src/lib/classes/forms/form.constants.ts +28 -0
  13. package/src/lib/classes/forms/form.ts +692 -0
  14. package/src/lib/classes/forms/piece-propagate.ts +47 -0
  15. package/src/lib/classes/forms/piece.ts +164 -0
  16. package/src/lib/classes/forms/section.ts +165 -0
  17. package/src/lib/classes/forms/subsection.ts +109 -0
  18. package/src/lib/classes/forms/table/action.ts +41 -0
  19. package/src/lib/classes/forms/table/column.ts +94 -0
  20. package/src/lib/classes/forms/table/row-data.ts +121 -0
  21. package/src/lib/classes/forms/table/table.ts +582 -0
  22. package/src/lib/components/elements/action.component.ts +70 -0
  23. package/src/lib/components/elements/field.component.ts +115 -0
  24. package/src/lib/components/elements/layout/element.component.ts +14 -0
  25. package/src/lib/components/elements/layout/form-error.component.ts +11 -0
  26. package/src/lib/components/elements/layout/form-header.component.ts +14 -0
  27. package/src/lib/components/elements/layout/piece.component.ts +60 -0
  28. package/src/lib/components/elements/layout/section.component.ts +52 -0
  29. package/src/lib/components/elements/layout/sub-section.component.ts +52 -0
  30. package/src/lib/components/elements/tables/table-record-action.component.ts +66 -0
  31. package/src/lib/components/elements/tables/table-record-field.component.ts +20 -0
  32. package/src/lib/components/elements/tables/table.component.ts +112 -0
  33. package/src/lib/components/forms/basic-form.ts +1464 -0
  34. package/src/lib/services/event-manager.service.ts +45 -0
  35. package/src/lib/services/file-manager.service.ts +7 -0
  36. package/src/lib/services/form-manager.service.ts +89 -0
  37. package/src/lib/services/icon-dictionary.service.ts +159 -0
  38. package/src/lib/tuain-ng-forms-lib.module.ts +40 -0
  39. package/{public-api.d.ts → src/public-api.ts} +5 -0
  40. package/src/test.ts +27 -0
  41. package/tsconfig.lib.json +15 -0
  42. package/tsconfig.lib.prod.json +10 -0
  43. package/tsconfig.spec.json +17 -0
  44. package/esm2022/lib/classes/forms/action.mjs +0 -106
  45. package/esm2022/lib/classes/forms/element.mjs +0 -25
  46. package/esm2022/lib/classes/forms/field.mjs +0 -474
  47. package/esm2022/lib/classes/forms/form.constants.mjs +0 -26
  48. package/esm2022/lib/classes/forms/form.mjs +0 -608
  49. package/esm2022/lib/classes/forms/piece-propagate.mjs +0 -39
  50. package/esm2022/lib/classes/forms/piece.mjs +0 -134
  51. package/esm2022/lib/classes/forms/section.mjs +0 -151
  52. package/esm2022/lib/classes/forms/subsection.mjs +0 -99
  53. package/esm2022/lib/classes/forms/table/action.mjs +0 -38
  54. package/esm2022/lib/classes/forms/table/column.mjs +0 -74
  55. package/esm2022/lib/classes/forms/table/row-data.mjs +0 -116
  56. package/esm2022/lib/classes/forms/table/table.mjs +0 -535
  57. package/esm2022/lib/components/elements/action.component.mjs +0 -70
  58. package/esm2022/lib/components/elements/field.component.mjs +0 -115
  59. package/esm2022/lib/components/elements/layout/element.component.mjs +0 -21
  60. package/esm2022/lib/components/elements/layout/form-error.component.mjs +0 -23
  61. package/esm2022/lib/components/elements/layout/form-header.component.mjs +0 -23
  62. package/esm2022/lib/components/elements/layout/piece.component.mjs +0 -64
  63. package/esm2022/lib/components/elements/layout/section.component.mjs +0 -56
  64. package/esm2022/lib/components/elements/layout/sub-section.component.mjs +0 -56
  65. package/esm2022/lib/components/elements/tables/table-record-action.component.mjs +0 -72
  66. package/esm2022/lib/components/elements/tables/table-record-field.component.mjs +0 -31
  67. package/esm2022/lib/components/elements/tables/table.component.mjs +0 -109
  68. package/esm2022/lib/components/forms/basic-form.mjs +0 -1399
  69. package/esm2022/lib/services/event-manager.service.mjs +0 -43
  70. package/esm2022/lib/services/file-manager.service.mjs +0 -7
  71. package/esm2022/lib/services/form-manager.service.mjs +0 -81
  72. package/esm2022/lib/tuain-ng-forms-lib.module.mjs +0 -71
  73. package/esm2022/public-api.mjs +0 -19
  74. package/esm2022/tuain-ng-forms-lib.mjs +0 -5
  75. package/fesm2022/tuain-ng-forms-lib.mjs +0 -4593
  76. package/fesm2022/tuain-ng-forms-lib.mjs.map +0 -1
  77. package/index.d.ts +0 -5
  78. package/lib/classes/forms/action.d.ts +0 -40
  79. package/lib/classes/forms/element.d.ts +0 -9
  80. package/lib/classes/forms/field.d.ts +0 -206
  81. package/lib/classes/forms/form.constants.d.ts +0 -25
  82. package/lib/classes/forms/form.d.ts +0 -232
  83. package/lib/classes/forms/piece-propagate.d.ts +0 -13
  84. package/lib/classes/forms/piece.d.ts +0 -51
  85. package/lib/classes/forms/section.d.ts +0 -43
  86. package/lib/classes/forms/subsection.d.ts +0 -42
  87. package/lib/classes/forms/table/action.d.ts +0 -16
  88. package/lib/classes/forms/table/column.d.ts +0 -33
  89. package/lib/classes/forms/table/row-data.d.ts +0 -14
  90. package/lib/classes/forms/table/table.d.ts +0 -145
  91. package/lib/components/elements/action.component.d.ts +0 -22
  92. package/lib/components/elements/field.component.d.ts +0 -47
  93. package/lib/components/elements/layout/element.component.d.ts +0 -8
  94. package/lib/components/elements/layout/form-error.component.d.ts +0 -8
  95. package/lib/components/elements/layout/form-header.component.d.ts +0 -9
  96. package/lib/components/elements/layout/piece.component.d.ts +0 -18
  97. package/lib/components/elements/layout/section.component.d.ts +0 -13
  98. package/lib/components/elements/layout/sub-section.component.d.ts +0 -13
  99. package/lib/components/elements/tables/table-record-action.component.d.ts +0 -18
  100. package/lib/components/elements/tables/table-record-field.component.d.ts +0 -12
  101. package/lib/components/elements/tables/table.component.d.ts +0 -44
  102. package/lib/components/forms/basic-form.d.ts +0 -256
  103. package/lib/services/event-manager.service.d.ts +0 -11
  104. package/lib/services/file-manager.service.d.ts +0 -6
  105. package/lib/services/form-manager.service.d.ts +0 -28
  106. package/lib/tuain-ng-forms-lib.module.d.ts +0 -20
@@ -1,535 +0,0 @@
1
- import { Subject } from 'rxjs';
2
- import { elementTypes } from '../form.constants';
3
- import { FormElement } from '../element';
4
- import { RecordTableColumn } from './column';
5
- import { TableAction } from './action';
6
- import { TableRecordData } from './row-data';
7
- const TABLE_SORT_ASCENDING = 'asc';
8
- const TABLE_SORT_DESCENDING = 'desc';
9
- const attrs = {
10
- allSelected: { name: 'allSelected', propagate: 'allSelected' },
11
- tableCode: { name: 'tableCode', propagate: 'code' },
12
- clientPaging: { name: 'clientPaging', propagate: null },
13
- globalSearch: { name: 'globalSearch', propagate: 'globalSearch' },
14
- globalFilterString: { name: '_globalFilterString', propagate: 'globalFilterString' },
15
- sorting: { name: 'sorting', propagate: null },
16
- recordsPerPage: { name: 'recordsPerPage', propagate: 'recordsPerPage' },
17
- layout: { name: 'layout', propagate: 'layout' },
18
- columns: { name: 'columns', propagate: 'columns' },
19
- selectedRecords: { name: 'selectedRecords', propagate: 'selectedRecords' },
20
- currentPage: { name: 'currentPage', propagate: 'currentPage' },
21
- totalRecordsNumber: { name: 'totalRecordsNumber', propagate: 'totalRecordsNumber' },
22
- visibleRecords: { name: '_visibleRecords', propagate: 'visibleRecords' },
23
- waiting: { name: '_waiting', propagate: 'waiting' },
24
- };
25
- export class RecordTable extends FormElement {
26
- _inlineActionTrigger = new Subject();
27
- _globalActionTrigger = new Subject();
28
- _recordSelectionTrigger = new Subject();
29
- _selectionActionTrigger = new Subject();
30
- _getDataTrigger = new Subject();
31
- _tableColumnObj = {};
32
- _appendPages;
33
- _actions;
34
- _actionsObj = {};
35
- // Mecanismos de filtrado nueva versión
36
- _globalFilterString = '';
37
- globalFilterStrings = [];
38
- selectedRecords;
39
- restrictedId;
40
- layout = null;
41
- _globalSearch;
42
- _tableRecords;
43
- _tableRecordObj = {};
44
- _visibleRecords = [];
45
- _columns;
46
- _selectable;
47
- _selectionBackend;
48
- _selectionField;
49
- _allSelected = false;
50
- _tableCode = '';
51
- _tableTitle;
52
- _currentPage;
53
- _totalPages;
54
- _requestedPage;
55
- _recordsPerPage = 10;
56
- _totalRecordsNumber = 0;
57
- _recordsNumber = 0;
58
- _sorting;
59
- _waiting;
60
- _clientPaging = true;
61
- _sortable;
62
- constructor(tableReceived, formConfig) {
63
- super(tableReceived, formConfig);
64
- this.propagationCustomAttributes = this._formConfig?.propagationCustomAttributes?.tables ?? [];
65
- this.elementType = elementTypes.table;
66
- this._waiting = false;
67
- this._currentPage = 1;
68
- this._totalPages = 1;
69
- this._requestedPage = 1;
70
- this._columns = [];
71
- this._tableColumnObj = {};
72
- this._actions = [];
73
- this._actionsObj = {};
74
- this._tableRecords = [];
75
- this._globalSearch = false;
76
- this.restrictedId = null;
77
- this._tableTitle = tableReceived.tableTitle;
78
- this._appendPages = tableReceived?.append ?? false;
79
- this._selectable = tableReceived?.selectable ?? false;
80
- this._selectionBackend = tableReceived?.selectionBackend ?? false;
81
- this._sortable = tableReceived?.sortable ?? false;
82
- this.setAttr(attrs.allSelected, false);
83
- this.setAttr(attrs.tableCode, tableReceived.tableCode);
84
- this.setAttr(attrs.clientPaging, tableReceived?.clientPaging ?? true);
85
- this.setAttr(attrs.globalSearch, tableReceived?.simpleFilter ?? false);
86
- this.setAttr(attrs.globalFilterString, '');
87
- this.setAttr(attrs.sorting, { columnName: '', direction: '' });
88
- this.setAttr(attrs.recordsPerPage, formConfig.defaultRecordsPerPage);
89
- this.setAttr(attrs.layout, '');
90
- if (tableReceived.fields) {
91
- const columns = [];
92
- for (const columnReceived of tableReceived.fields) {
93
- const columnEnriched = {
94
- ...columnReceived,
95
- visibleStates: this.visibleStates,
96
- enabledStates: this.enabledStates
97
- };
98
- const columnDefinition = new RecordTableColumn(columnEnriched, this._formConfig);
99
- columns.push(columnDefinition);
100
- this._tableColumnObj[columnDefinition.fieldCode] = columnDefinition;
101
- }
102
- this.setAttr(attrs.columns, columns);
103
- }
104
- if (tableReceived.actions) {
105
- const tableActions = tableReceived.actions.map(objDef => {
106
- let visibleStates = objDef.visibleStates;
107
- let enabledStates = objDef.enabledStates;
108
- if (!visibleStates) {
109
- visibleStates = (objDef.actionModes || '').split(',')
110
- .map(state => state.trim())
111
- .filter(state => state.length > 0);
112
- enabledStates = (objDef.actionModes || '').split(',')
113
- .map(state => state.trim())
114
- .filter(state => state.length > 0);
115
- }
116
- return { ...objDef, visibleStates, enabledStates };
117
- });
118
- for (const actionReceived of tableActions) {
119
- const inlineAction = new TableAction(actionReceived, this._formConfig);
120
- this._actions.push(inlineAction);
121
- this._actionsObj[inlineAction.actionCode] = inlineAction;
122
- }
123
- }
124
- this._selectionField = (this._selectable) ? tableReceived?.selectionField : null;
125
- // Filtros predefinidos en el formulario
126
- if (tableReceived.filters) {
127
- for (let index = 0; index < tableReceived.filters.length; index++) {
128
- this.addFilterDefinition(tableReceived.filters[index].fieldCode, tableReceived.filters[index]);
129
- }
130
- }
131
- }
132
- get columnNames() { return Object.keys(this._tableColumnObj); }
133
- get inlineActionTrigger() { return this._inlineActionTrigger.asObservable(); }
134
- get globalActionTrigger() { return this._globalActionTrigger.asObservable(); }
135
- get selectionActionTrigger() { return this._selectionActionTrigger.asObservable(); }
136
- get recordSelectionTrigger() { return this._recordSelectionTrigger.asObservable(); }
137
- get getDataTrigger() { return this._getDataTrigger.asObservable(); }
138
- get globalSearch() { return this._globalSearch; }
139
- get tableRecords() { return this._tableRecords; }
140
- get tableRecordObj() { return this._tableRecordObj; }
141
- get visibleRecords() { return this._visibleRecords; }
142
- get columns() { return this._columns; }
143
- get selectable() { return this._selectable; }
144
- get selectionBackend() { return this._selectionBackend; }
145
- get selectionField() { return this._selectionField; }
146
- get allSelected() { return this._allSelected; }
147
- get tableCode() { return this._tableCode; }
148
- get tableTitle() { return this._tableTitle; }
149
- get currentPage() { return this._currentPage; }
150
- get totalPages() { return this._totalPages; }
151
- get requestedPage() { return this._requestedPage; }
152
- get recordsPerPage() { return this._recordsPerPage; }
153
- get totalRecordsNumber() { return this._totalRecordsNumber; }
154
- get recordsNumber() { return this._recordsNumber; }
155
- get sorting() { return this._sorting; }
156
- get waiting() { return this._waiting; }
157
- get clientPaging() { return this._clientPaging; }
158
- get sortable() { return this._sortable; }
159
- get globalFilterString() { return this._globalFilterString; }
160
- set globalFilterString(globalFilterString) { this._globalFilterString = globalFilterString; }
161
- set globalSearch(globalSearch) { this._globalSearch = globalSearch; }
162
- set tableRecords(tableRecords) { this._tableRecords = tableRecords; }
163
- set tableRecordObj(tableRecordObj) { this._tableRecordObj = tableRecordObj; }
164
- set visibleRecords(visibleRecords) { this._visibleRecords = visibleRecords ?? []; }
165
- set columns(columns) { this._columns = columns; }
166
- set selectable(selectable) { this._selectable = selectable; }
167
- set selectionBackend(selectionBackend) { this._selectionBackend = selectionBackend; }
168
- set selectionField(selectionField) { this._selectionField = selectionField; }
169
- set allSelected(allSelected) { this._allSelected = allSelected; }
170
- set tableCode(tableCode) { this._tableCode = tableCode; }
171
- set tableTitle(tableTitle) { this._tableTitle = tableTitle; }
172
- set currentPage(currentPage) { this._currentPage = currentPage; }
173
- set totalPages(totalPages) { this._totalPages = totalPages; }
174
- set requestedPage(requestedPage) { this._requestedPage = requestedPage; }
175
- set recordsPerPage(recordsPerPage) { this._recordsPerPage = recordsPerPage; }
176
- set totalRecordsNumber(totalRecordsNumber) { this._totalRecordsNumber = totalRecordsNumber; }
177
- set recordsNumber(recordsNumber) { this._recordsNumber = recordsNumber; }
178
- set sorting(sorting) { this._sorting = sorting; }
179
- set waiting(waiting) { this.setAttr(attrs.waiting, waiting); }
180
- set clientPaging(clientPaging) { this._clientPaging = clientPaging; }
181
- set sortable(sortable) { this._sortable = sortable; }
182
- getLayout() { return this.layout; }
183
- setLayout(layout) { this.setAttr(attrs.layout, layout); }
184
- hasActions() { return (this._actions.length > 0); }
185
- getSelectedRecords() { return this._tableRecords.filter(rec => rec.selected).map(rec => rec.recordId); }
186
- activateGlobalSearch() { this._globalSearch = true; }
187
- inactivateGlobalSearch() { this._globalSearch = false; }
188
- columnDefinition(fieldCode) { return this._tableColumnObj[fieldCode]; }
189
- putOnWait() { this.waiting = true; }
190
- freeWaiting() { this.waiting = false; }
191
- setWidget(widget) { this.widget = widget; }
192
- notifyGlobalAction(actionCode) {
193
- const tableEvent = {
194
- tableCode: this._tableCode,
195
- actionCode,
196
- actionDetail: null
197
- };
198
- this._globalActionTrigger.next(tableEvent);
199
- }
200
- notifyInlineAction(tableActionEvent) {
201
- const tableEvent = {
202
- tableCode: this._tableCode,
203
- actionCode: tableActionEvent.actionCode,
204
- actionDetail: {
205
- recordId: tableActionEvent.recordId,
206
- recordData: tableActionEvent.recordData
207
- }
208
- };
209
- this._inlineActionTrigger.next(tableEvent);
210
- }
211
- notifyRecordSelection(recordId) {
212
- const record = this.getTableRecord(recordId);
213
- if (!record) {
214
- return;
215
- }
216
- record.toggleSelect();
217
- this._requestedPage = this._currentPage ?? 1;
218
- const tableEvent = {
219
- tableCode: this._tableCode,
220
- actionCode: null,
221
- actionDetail: {
222
- recordId: record.recordId,
223
- recordData: record.recordData
224
- }
225
- };
226
- this._recordSelectionTrigger.next(tableEvent);
227
- }
228
- notifySelectionAction(actionCode) {
229
- const tableEvent = {
230
- tableCode: this._tableCode,
231
- actionCode,
232
- actionDetail: {
233
- selectedRecords: this.selectedRecords
234
- }
235
- };
236
- this._selectionActionTrigger.next(tableEvent);
237
- }
238
- notifyGetDataAction(requestedPage = null) {
239
- this.updateVisibleRecords();
240
- this._requestedPage = requestedPage || this._currentPage || 1;
241
- const tableEvent = {
242
- tableCode: this._tableCode,
243
- actionCode: null,
244
- actionDetail: null,
245
- };
246
- this._getDataTrigger.next(tableEvent);
247
- return null;
248
- }
249
- clean() {
250
- this._tableRecords = [];
251
- this.unSelectAll();
252
- this._tableRecordObj = {};
253
- this.updateVisibleRecords();
254
- }
255
- selectAll() {
256
- this.setAttr(attrs.allSelected, true);
257
- this._tableRecords.forEach(record => record.select());
258
- this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
259
- return true;
260
- }
261
- unSelectAll() {
262
- this.setAttr(attrs.allSelected, false);
263
- this._tableRecords.forEach(record => record.unselect());
264
- this.setAttr(attrs.selectedRecords, this.getSelectedRecords());
265
- return true;
266
- }
267
- setTableRecords(tableRecords, append = false, prepend = false) {
268
- if (!append) {
269
- this._tableRecords = [];
270
- this._tableRecordObj = {};
271
- this.setAttr(attrs.allSelected, false);
272
- this.setAttr(attrs.selectedRecords, []);
273
- }
274
- const newRecordsObj = { ...this._tableRecordObj };
275
- const newRecords = [...this._tableRecords];
276
- for (const tableRecord of tableRecords) {
277
- tableRecord.tableRecordId = tableRecord.tableRecordId ?? tableRecord.recordId ?? tableRecord.recordIdKey;
278
- const recordReceived = new TableRecordData(tableRecord, this._columns, this._selectionField);
279
- const recordIdKey = recordReceived.recordIdKey ?? recordReceived.recordIdKey;
280
- if (newRecordsObj[recordIdKey]) {
281
- continue;
282
- }
283
- if (prepend) {
284
- newRecords.unshift(recordReceived);
285
- }
286
- else {
287
- newRecords.push(recordReceived);
288
- }
289
- newRecordsObj[recordIdKey] = recordReceived;
290
- }
291
- this._tableRecords = newRecords;
292
- this._tableRecordObj = newRecordsObj;
293
- }
294
- appendRecords(records) { this.setTableRecords(records, true); }
295
- prependRecords(records) { this.setTableRecords(records, true, true); }
296
- replaceRecords(records) { this.setTableRecords(records, false); }
297
- setTableAppend(append) { this._appendPages = append; }
298
- changePage(requestedPage) {
299
- if (this._clientPaging) {
300
- this.setAttr(attrs.currentPage, requestedPage);
301
- this.updateVisibleRecords();
302
- }
303
- else {
304
- this.notifyGetDataAction(requestedPage);
305
- }
306
- }
307
- updateVisibleRecords() {
308
- let visibleRecords;
309
- if (this._clientPaging) {
310
- visibleRecords = this.getFilteredRecords();
311
- // Se valida si la página actual sigue siendo válida
312
- const totalRecords = visibleRecords.length;
313
- const recordsLastPage = totalRecords % this._recordsPerPage;
314
- const totalPages = Math.trunc(totalRecords / this._recordsPerPage + (recordsLastPage ? 1 : 0));
315
- if (this._currentPage > totalPages) {
316
- this._currentPage = totalPages || 1;
317
- }
318
- const sliceNumber1 = (this._currentPage - 1) * this._recordsPerPage;
319
- const sliceNumber2 = (this._currentPage - 1) * this._recordsPerPage + this._recordsPerPage;
320
- visibleRecords = visibleRecords.slice(sliceNumber1, sliceNumber2);
321
- this.setAttr(attrs.totalRecordsNumber, totalRecords);
322
- }
323
- else {
324
- visibleRecords = this._tableRecords;
325
- }
326
- this.setAttr(attrs.visibleRecords, visibleRecords ?? []);
327
- }
328
- updateFromServer(tableReceived) {
329
- this._requestedPage = 1;
330
- const { visible = true, totalPages = 1, recordsNumber, currentPage = 1, recordsPerPage, totalRecordsNumber, sortingColumn, sortingDirection, tableRecords, actions, fields, } = tableReceived;
331
- this.visible = visible;
332
- if (actions) {
333
- Object.keys(actions).forEach(actionCode => {
334
- const tblAction = this.getAction(actionCode);
335
- const actionReceived = actions[actionCode];
336
- if (actionReceived.visible === true || actionReceived.visible === false) {
337
- (actionReceived.visible === true) && tblAction.show();
338
- (actionReceived.visible === false) && tblAction.hide();
339
- }
340
- if (actionReceived.enabled === true || actionReceived.enabled === false) {
341
- (actionReceived.enabled === true) && tblAction.enable();
342
- (actionReceived.enabled === false) && tblAction.disable();
343
- }
344
- if (actionReceived.showOnStates) {
345
- actionReceived.showOnStates?.forEach(newState => {
346
- tblAction.addVisibleState(newState);
347
- });
348
- }
349
- if (actionReceived.hideOnStates) {
350
- actionReceived.hideOnStates?.forEach(newState => {
351
- tblAction.removeVisibleState(newState);
352
- });
353
- }
354
- if (actionReceived.enableOnStates) {
355
- actionReceived.enableOnStates?.forEach(newState => {
356
- tblAction.addEnabledState(newState);
357
- });
358
- }
359
- if (actionReceived.disableOnStates) {
360
- actionReceived.disableOnStates?.forEach(newState => {
361
- tblAction.removeEnabledState(newState);
362
- });
363
- }
364
- });
365
- }
366
- if (fields) {
367
- Object.keys(fields).forEach(fieldCode => {
368
- const tblField = this.columnDefinition(fieldCode);
369
- const fieldReceived = fields[fieldCode];
370
- if (fieldReceived.visible === true || fieldReceived.visible === false) {
371
- (fieldReceived.visible === true) && tblField.show();
372
- (fieldReceived.visible === false) && tblField.hide();
373
- }
374
- });
375
- }
376
- if (tableRecords) {
377
- this._totalPages = totalPages;
378
- this._recordsNumber = recordsNumber;
379
- this.setAttr(attrs.currentPage, +currentPage);
380
- this.setAttr(attrs.recordsPerPage, +recordsPerPage);
381
- this.setAttr(attrs.totalRecordsNumber, (this._clientPaging) ? tableRecords.length : +totalRecordsNumber);
382
- this.setAttr(attrs.sorting, {
383
- columnName: sortingColumn || '',
384
- direction: sortingDirection || ''
385
- });
386
- if (!this._appendPages) {
387
- this.replaceRecords(tableRecords);
388
- }
389
- else {
390
- this.appendRecords(tableRecords);
391
- }
392
- }
393
- this.freeWaiting();
394
- this.updateVisibleRecords();
395
- }
396
- getTableRecord(recordId) {
397
- const recordIdKey = (typeof recordId === 'object') ? JSON.stringify(recordId) : recordId;
398
- return (this._tableRecordObj && recordId && this._tableRecordObj[recordId])
399
- ? this._tableRecordObj[recordId] : null;
400
- }
401
- getAction(actionCode) {
402
- return (this._actionsObj && actionCode && this._actionsObj[actionCode])
403
- ? this._actionsObj[actionCode] : null;
404
- }
405
- getActions(actionClass = this._formConfig.tableActions.inline, actionTypes = null) {
406
- return this._actions.filter(actionDef => {
407
- const typeIncluded = (actionTypes) ? actionTypes.includes(actionDef.actionType) : true;
408
- return actionDef.actionClass === actionClass && typeIncluded;
409
- });
410
- }
411
- // Filtros
412
- setFilterById(id) {
413
- if (this.restrictedId === id) {
414
- return;
415
- }
416
- this.restrictedId = id;
417
- this.updateVisibleRecords();
418
- }
419
- cleanIdFilter() {
420
- if (this.restrictedId === null) {
421
- return;
422
- }
423
- this.restrictedId = null;
424
- this.updateVisibleRecords();
425
- }
426
- setGlobalFilterString(text, notifyComponent = true) {
427
- this.globalFilterStrings = text.split(' ').filter(t => t && t.trim().length > 0).map(t => t.trim()) ?? [];
428
- if (this._clientPaging) {
429
- this.changePage(1);
430
- }
431
- if (notifyComponent) {
432
- this.setAttr(attrs.globalFilterString, text.trim());
433
- }
434
- }
435
- addFilterDefinition(columnName, filterDefinition) {
436
- const tableColumn = this.columnDefinition(columnName);
437
- tableColumn && tableColumn.addFilterDefinition(filterDefinition);
438
- }
439
- getFilteredRecords() {
440
- let filteredRecords = this._tableRecords;
441
- if (this.restrictedId) {
442
- filteredRecords = filteredRecords.filter(record => record.recordId === this.restrictedId);
443
- }
444
- if (this.globalFilterStrings.length > 0) {
445
- filteredRecords = filteredRecords.filter(record => record.hasPattern(this.globalFilterStrings, this._tableColumnObj));
446
- }
447
- const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter);
448
- if (columnFilters.length > 0) {
449
- filteredRecords = filteredRecords.filter(record => record.hasCondition(columnFilters));
450
- }
451
- return filteredRecords;
452
- }
453
- getColumnFilter(columnName) {
454
- const tableColumn = this.columnDefinition(columnName);
455
- return tableColumn?.filter ?? null;
456
- }
457
- addColumnFilter(columnName, columnValues, operator = null) {
458
- const tableColumn = this.columnDefinition(columnName);
459
- const columnFilterDefinition = tableColumn?.filterDefinition ?? null;
460
- if (!columnFilterDefinition) {
461
- return;
462
- }
463
- tableColumn && tableColumn.addFilter(columnValues, operator);
464
- this.updateVisibleRecords();
465
- }
466
- removeColumnFilter(columnName) {
467
- const tableColumn = this.columnDefinition(columnName);
468
- tableColumn && tableColumn.removeFilter();
469
- this.updateVisibleRecords();
470
- }
471
- get currentFilter() {
472
- const compactFilter = {
473
- simpleFilterWords: this.globalFilterStrings,
474
- advancedFilter: [],
475
- };
476
- const columnFilters = this._columns.filter(column => column.filter).map(column => column.filter);
477
- for (let index = 0; index < columnFilters.length; index++) {
478
- const columnFilter = columnFilters[index];
479
- compactFilter.advancedFilter.push({
480
- fieldCode: columnFilter?.fieldCode,
481
- operator: columnFilter?.operator,
482
- fieldValue1: columnFilter?.values[0],
483
- fieldValue2: columnFilter?.values[1],
484
- });
485
- }
486
- return compactFilter;
487
- }
488
- // Ordenamiento de registros local
489
- sort(columnName, direction) {
490
- this.setRequiredOrder(columnName, direction);
491
- if (this._clientPaging) {
492
- this.localSortData();
493
- }
494
- else {
495
- this.notifyGetDataAction();
496
- }
497
- }
498
- setRequiredOrder(columnField, direction = null) {
499
- this.setAttr(attrs.sorting, {
500
- columnName: columnField,
501
- direction: (direction === 'ascend') ? TABLE_SORT_ASCENDING : TABLE_SORT_DESCENDING,
502
- });
503
- }
504
- localSortData() {
505
- if (!this._sorting.columnName || !this._sorting.direction) {
506
- return;
507
- }
508
- this._tableRecords.sort((a, b) => this.recordCompare(a, b, this._sorting.columnName, this._sorting.direction));
509
- //this.unSelectAll();
510
- this.updateVisibleRecords();
511
- }
512
- recordCompare(recordA, recordB, columnCompare, direction) {
513
- const recordAValue = recordA.getFieldValue(columnCompare);
514
- const recordBValue = recordB.getFieldValue(columnCompare);
515
- const recordAColumn = isNaN(recordAValue) ? recordAValue.toLocaleLowerCase() : +recordAValue;
516
- const recordBColumn = isNaN(recordBValue) ? recordBValue.toLocaleLowerCase() : +recordBValue;
517
- let result = 0;
518
- if (recordAColumn < recordBColumn) {
519
- result = -1;
520
- }
521
- else if (recordAColumn > recordBColumn) {
522
- result = 1;
523
- }
524
- return direction === TABLE_SORT_ASCENDING ? result : -result;
525
- }
526
- formStateChangeCustomSubscribe(form, formChangeSubject) {
527
- this._columns?.forEach(column => {
528
- column?.connectWithParentForm(form, formChangeSubject);
529
- });
530
- this._actions?.forEach(action => {
531
- action?.connectWithParentForm(form, formChangeSubject);
532
- });
533
- }
534
- }
535
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGFibGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy90dWFpbi1uZy1mb3Jtcy1saWIvc3JjL2xpYi9jbGFzc2VzL2Zvcm1zL3RhYmxlL3RhYmxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxZQUFZLENBQUM7QUFDekMsT0FBTyxFQUFFLGlCQUFpQixFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQzdDLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFDdkMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUU3QyxNQUFNLG9CQUFvQixHQUFHLEtBQUssQ0FBQztBQUNuQyxNQUFNLHFCQUFxQixHQUFHLE1BQU0sQ0FBQztBQUVyQyxNQUFNLEtBQUssR0FBRztJQUNaLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRTtJQUM5RCxTQUFTLEVBQUUsRUFBRSxJQUFJLEVBQUUsV0FBVyxFQUFFLFNBQVMsRUFBRSxNQUFNLEVBQUU7SUFDbkQsWUFBWSxFQUFFLEVBQUUsSUFBSSxFQUFFLGNBQWMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQ3ZELFlBQVksRUFBRSxFQUFFLElBQUksRUFBRSxjQUFjLEVBQUUsU0FBUyxFQUFFLGNBQWMsRUFBRTtJQUNqRSxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxxQkFBcUIsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7SUFDcEYsT0FBTyxFQUFFLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsSUFBSSxFQUFFO0lBQzdDLGNBQWMsRUFBRSxFQUFFLElBQUksRUFBRSxnQkFBZ0IsRUFBRSxTQUFTLEVBQUUsZ0JBQWdCLEVBQUU7SUFDdkUsTUFBTSxFQUFFLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxTQUFTLEVBQUUsUUFBUSxFQUFFO0lBQy9DLE9BQU8sRUFBRSxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsU0FBUyxFQUFFLFNBQVMsRUFBRTtJQUNsRCxlQUFlLEVBQUUsRUFBRSxJQUFJLEVBQUUsaUJBQWlCLEVBQUUsU0FBUyxFQUFFLGlCQUFpQixFQUFFO0lBQzFFLFdBQVcsRUFBRSxFQUFFLElBQUksRUFBRSxhQUFhLEVBQUUsU0FBUyxFQUFFLGFBQWEsRUFBRTtJQUM5RCxrQkFBa0IsRUFBRSxFQUFFLElBQUksRUFBRSxvQkFBb0IsRUFBRSxTQUFTLEVBQUUsb0JBQW9CLEVBQUU7SUFDbkYsY0FBYyxFQUFFLEVBQUUsSUFBSSxFQUFFLGlCQUFpQixFQUFFLFNBQVMsRUFBRSxnQkFBZ0IsRUFBRTtJQUN4RSxPQUFPLEVBQUUsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUU7Q0FDcEQsQ0FBQztBQWNGLE1BQU0sT0FBTyxXQUFZLFNBQVEsV0FBVztJQUN6QixvQkFBb0IsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO0lBQ2pELG9CQUFvQixHQUFHLElBQUksT0FBTyxFQUFjLENBQUM7SUFDakQsdUJBQXVCLEdBQUcsSUFBSSxPQUFPLEVBQWMsQ0FBQztJQUNwRCx1QkFBdUIsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO0lBQ3BELGVBQWUsR0FBRyxJQUFJLE9BQU8sRUFBYyxDQUFDO0lBQ3JELGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDckIsWUFBWSxDQUFVO0lBQ3RCLFFBQVEsQ0FBZ0I7SUFDeEIsV0FBVyxHQUFHLEVBQUUsQ0FBQztJQUV6Qix1Q0FBdUM7SUFDL0IsbUJBQW1CLEdBQVcsRUFBRSxDQUFDO0lBQ2pDLG1CQUFtQixHQUFhLEVBQUUsQ0FBQztJQUNuQyxlQUFlLENBQU07SUFDckIsWUFBWSxDQUFNO0lBQ2xCLE1BQU0sR0FBa0IsSUFBSSxDQUFDO0lBQzdCLGFBQWEsQ0FBVTtJQUN2QixhQUFhLENBQW9CO0lBQ2pDLGVBQWUsR0FBRyxFQUFFLENBQUM7SUFDckIsZUFBZSxHQUFzQixFQUFFLENBQUM7SUFDeEMsUUFBUSxDQUFzQjtJQUM5QixXQUFXLENBQVU7SUFDckIsaUJBQWlCLENBQVU7SUFDM0IsZUFBZSxDQUFTO0lBQ3hCLFlBQVksR0FBRyxLQUFLLENBQUM7SUFDckIsVUFBVSxHQUFXLEVBQUUsQ0FBQztJQUN4QixXQUFXLENBQVM7SUFDcEIsWUFBWSxDQUFTO0lBQ3JCLFdBQVcsQ0FBUztJQUNwQixjQUFjLENBQVM7SUFDdkIsZUFBZSxHQUFXLEVBQUUsQ0FBQztJQUM3QixtQkFBbUIsR0FBVyxDQUFDLENBQUM7SUFDaEMsY0FBYyxHQUFXLENBQUMsQ0FBQztJQUMzQixRQUFRLENBQU07SUFDZCxRQUFRLENBQVU7SUFDbEIsYUFBYSxHQUFZLElBQUksQ0FBQztJQUM5QixTQUFTLENBQVU7SUFFM0IsWUFBWSxhQUFhLEVBQUUsVUFBVTtRQUNuQyxLQUFLLENBQUMsYUFBYSxFQUFFLFVBQVUsQ0FBQyxDQUFDO1FBQ2pDLElBQUksQ0FBQywyQkFBMkIsR0FBRyxJQUFJLENBQUMsV0FBVyxFQUFFLDJCQUEyQixFQUFFLE1BQU0sSUFBSSxFQUFFLENBQUM7UUFDL0YsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO1FBQ3RDLElBQUksQ0FBQyxRQUFRLEdBQUcsS0FBSyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxZQUFZLEdBQUcsQ0FBQyxDQUFDO1FBQ3RCLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDO1FBQ3JCLElBQUksQ0FBQyxjQUFjLEdBQUcsQ0FBQyxDQUFDO1FBQ3hCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFDO1FBQzFCLElBQUksQ0FBQyxRQUFRLEdBQUcsRUFBRSxDQUFDO1FBQ25CLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDO1FBQzNCLElBQUksQ0FBQyxZQUFZLEdBQUcsSUFBSSxDQUFDO1FBRXpCLElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxDQUFDLFVBQVUsQ0FBQztRQUM1QyxJQUFJLENBQUMsWUFBWSxHQUFHLGFBQWEsRUFBRSxNQUFNLElBQUksS0FBSyxDQUFDO1FBQ25ELElBQUksQ0FBQyxXQUFXLEdBQUcsYUFBYSxFQUFFLFVBQVUsSUFBSSxLQUFLLENBQUM7UUFDdEQsSUFBSSxDQUFDLGlCQUFpQixHQUFHLGFBQWEsRUFBRSxnQkFBZ0IsSUFBSSxLQUFLLENBQUM7UUFDbEUsSUFBSSxDQUFDLFNBQVMsR0FBRyxhQUFhLEVBQUUsUUFBUSxJQUFJLEtBQUssQ0FBQztRQUVsRCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN2RCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVksSUFBSSxJQUFJLENBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxZQUFZLEVBQUUsYUFBYSxFQUFFLFlBQVksSUFBSSxLQUFLLENBQUMsQ0FBQztRQUN2RSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsRUFBRSxVQUFVLEVBQUUsRUFBRSxFQUFFLFNBQVMsRUFBRSxFQUFFLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxVQUFVLENBQUMscUJBQXFCLENBQUMsQ0FBQztRQUNyRSxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxNQUFNLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFFL0IsSUFBSSxhQUFhLENBQUMsTUFBTSxFQUFFLENBQUM7WUFDekIsTUFBTSxPQUFPLEdBQXdCLEVBQUUsQ0FBQztZQUN4QyxLQUFLLE1BQU0sY0FBYyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEVBQUUsQ0FBQztnQkFDbEQsTUFBTSxjQUFjLEdBQUc7b0JBQ3JCLEdBQUcsY0FBYztvQkFDakIsYUFBYSxFQUFFLElBQUksQ0FBQyxhQUFhO29CQUNqQyxhQUFhLEVBQUUsSUFBSSxDQUFDLGFBQWE7aUJBQ2xDLENBQUM7Z0JBQ0YsTUFBTSxnQkFBZ0IsR0FBc0IsSUFBSSxpQkFBaUIsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUNwRyxPQUFPLENBQUMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLENBQUM7Z0JBQy9CLElBQUksQ0FBQyxlQUFlLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLEdBQUcsZ0JBQWdCLENBQUM7WUFDdEUsQ0FBQztZQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQztRQUN2QyxDQUFDO1FBQ0QsSUFBSSxhQUFhLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDMUIsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLEVBQUU7Z0JBQ3RELElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQ3pDLElBQUksYUFBYSxHQUFHLE1BQU0sQ0FBQyxhQUFhLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztvQkFDbkIsYUFBYSxHQUFHLENBQUMsTUFBTSxDQUFDLFdBQVcsSUFBSSxFQUFFLENBQUMsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDO3lCQUNsRCxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7eUJBQzFCLE1BQU0sQ0FBQyxLQUFLLENBQUMsRUFBRSxDQUFDLEtBQUssQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7b0JBQ3JDLGFBQWEsR0FBRyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQzt5QkFDbEQsR0FBRyxDQUFDLEtBQUssQ0FBQyxFQUFFLENBQUMsS0FBSyxDQUFDLElBQUksRUFBRSxDQUFDO3lCQUMxQixNQUFNLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO2dCQUN2QyxDQUFDO2dCQUNELE9BQU8sRUFBRSxHQUFHLE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLENBQUM7WUFDckQsQ0FBQyxDQUFDLENBQUM7WUFDSCxLQUFLLE1BQU0sY0FBYyxJQUFJLFlBQVksRUFBRSxDQUFDO2dCQUMxQyxNQUFNLFlBQVksR0FBRyxJQUFJLFdBQVcsQ0FBQyxjQUFjLEVBQUUsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDO2dCQUN2RSxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztnQkFDakMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsVUFBVSxDQUFDLEdBQUcsWUFBWSxDQUFDO1lBQzNELENBQUM7UUFDSCxDQUFDO1FBQ0QsSUFBSSxDQUFDLGVBQWUsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxFQUFFLGNBQWMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1FBQ2pGLHdDQUF3QztRQUN4QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUMxQixLQUFLLElBQUksS0FBSyxHQUFHLENBQUMsRUFBRSxLQUFLLEdBQUcsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUUsQ0FBQztnQkFDbEUsSUFBSSxDQUFDLG1CQUFtQixDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsU0FBUyxFQUFFLGFBQWEsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQztZQUNqRyxDQUFDO1FBQ0gsQ0FBQztJQUNILENBQUM7SUFFRCxJQUFJLFdBQVcsS0FBSyxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUMvRCxJQUFJLG1CQUFtQixLQUFLLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxJQUFJLG1CQUFtQixLQUFLLE9BQU8sSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUM5RSxJQUFJLHNCQUFzQixLQUFLLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixJQUFJLHNCQUFzQixLQUFLLE9BQU8sSUFBSSxDQUFDLHVCQUF1QixDQUFDLFlBQVksRUFBRSxDQUFDLENBQUMsQ0FBQztJQUNwRixJQUFJLGNBQWMsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsWUFBWSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBRXBFLElBQUksWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFBSSxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUNqRCxJQUFJLGNBQWMsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsQ0FBQyxDQUFDO0lBQ3JELElBQUksY0FBYyxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDckQsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2QyxJQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksZ0JBQWdCLEtBQUssT0FBTyxJQUFJLENBQUMsaUJBQWlCLENBQUMsQ0FBQyxDQUFDO0lBQ3pELElBQUksY0FBYyxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7SUFDckQsSUFBSSxXQUFXLEtBQUssT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMvQyxJQUFJLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDO0lBQzNDLElBQUksVUFBVSxLQUFLLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDN0MsSUFBSSxXQUFXLEtBQUssT0FBTyxJQUFJLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUMvQyxJQUFJLFVBQVUsS0FBSyxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQzdDLElBQUksYUFBYSxLQUFLLE9BQU8sSUFBSSxDQUFDLGNBQWMsQ0FBQyxDQUFDLENBQUM7SUFDbkQsSUFBSSxjQUFjLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQztJQUNyRCxJQUFJLGtCQUFrQixLQUFLLE9BQU8sSUFBSSxDQUFDLG1CQUFtQixDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQ25ELElBQUksT0FBTyxLQUFLLE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUM7SUFDdkMsSUFBSSxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQztJQUN2QyxJQUFJLFlBQVksS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ2pELElBQUksUUFBUSxLQUFLLE9BQU8sSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFFekMsSUFBSSxrQkFBa0IsS0FBSyxPQUFPLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLENBQUM7SUFDN0QsSUFBSSxrQkFBa0IsQ0FBQyxrQkFBa0IsSUFBSSxJQUFJLENBQUMsbUJBQW1CLEdBQUcsa0JBQWtCLENBQUMsQ0FBQyxDQUFDO0lBRTdGLElBQUksWUFBWSxDQUFDLFlBQVksSUFBSSxJQUFJLENBQUMsYUFBYSxHQUFHLFlBQVksQ0FBQyxDQUFDLENBQUM7SUFDckUsSUFBSSxZQUFZLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNyRSxJQUFJLGNBQWMsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQUksY0FBYyxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsZUFBZSxHQUFHLGNBQWMsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDO0lBQ25GLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFBSSxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLGdCQUFnQixDQUFDLGdCQUFnQixJQUFJLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxnQkFBZ0IsQ0FBQyxDQUFDLENBQUM7SUFDckYsSUFBSSxjQUFjLENBQUMsY0FBYyxJQUFJLElBQUksQ0FBQyxlQUFlLEdBQUcsY0FBYyxDQUFDLENBQUMsQ0FBQztJQUM3RSxJQUFJLFdBQVcsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLElBQUksU0FBUyxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxHQUFHLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDekQsSUFBSSxVQUFVLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDLENBQUMsQ0FBQztJQUM3RCxJQUFJLFdBQVcsQ0FBQyxXQUFXLElBQUksSUFBSSxDQUFDLFlBQVksR0FBRyxXQUFXLENBQUMsQ0FBQyxDQUFDO0lBQ2pFLElBQUksVUFBVSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQyxDQUFDLENBQUM7SUFDN0QsSUFBSSxhQUFhLENBQUMsYUFBYSxJQUFJLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDLENBQUMsQ0FBQztJQUN6RSxJQUFJLGNBQWMsQ0FBQyxjQUFjLElBQUksSUFBSSxDQUFDLGVBQWUsR0FBRyxjQUFjLENBQUMsQ0FBQyxDQUFDO0lBQzdFLElBQUksa0JBQWtCLENBQUMsa0JBQWtCLElBQUksSUFBSSxDQUFDLG1CQUFtQixHQUFHLGtCQUFrQixDQUFDLENBQUMsQ0FBQztJQUM3RixJQUFJLGFBQWEsQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGNBQWMsR0FBRyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQ3pFLElBQUksT0FBTyxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDakQsSUFBSSxPQUFPLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLE9BQU8sRUFBRSxPQUFPLENBQUMsQ0FBQSxDQUFDLENBQUM7SUFDN0QsSUFBSSxZQUFZLENBQUMsWUFBWSxJQUFJLElBQUksQ0FBQyxhQUFhLEdBQUcsWUFBWSxDQUFDLENBQUMsQ0FBQztJQUNyRSxJQUFJLFFBQVEsQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFNBQVMsR0FBRyxRQUFRLENBQUMsQ0FBQyxDQUFDO0lBRXJELFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBQ25DLFNBQVMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsTUFBTSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN6RCxVQUFVLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUNuRCxrQkFBa0IsS0FBSyxPQUFPLElBQUksQ0FBQyxhQUFhLENBQUMsTUFBTSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDeEcsb0JBQW9CLEtBQUssSUFBSSxDQUFDLGFBQWEsR0FBRyxJQUFJLENBQUMsQ0FBQyxDQUFDO0lBQ3JELHNCQUFzQixLQUFLLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLENBQUMsQ0FBQztJQUN4RCxnQkFBZ0IsQ0FBQyxTQUFTLElBQXVCLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7SUFDMUYsU0FBUyxLQUFLLElBQUksQ0FBQyxPQUFPLEdBQUcsSUFBSSxDQUFDLENBQUMsQ0FBQztJQUNwQyxXQUFXLEtBQUssSUFBSSxDQUFDLE9BQU8sR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDO0lBQ3ZDLFNBQVMsQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDO0lBRTNDLGtCQUFrQixDQUFDLFVBQVU7UUFDM0IsTUFBTSxVQUFVLEdBQWU7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFVBQVU7WUFDVixZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLG9CQUFvQixDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsQ0FBQztJQUM3QyxDQUFDO0lBRUQsa0JBQWtCLENBQUMsZ0JBQWtDO1FBQ25ELE1BQU0sVUFBVSxHQUFlO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixVQUFVLEVBQUUsZ0JBQWdCLENBQUMsVUFBVTtZQUN2QyxZQUFZLEVBQUU7Z0JBQ1osUUFBUSxFQUFFLGdCQUFnQixDQUFDLFFBQVE7Z0JBQ25DLFVBQVUsRUFBRSxnQkFBZ0IsQ0FBQyxVQUFVO2FBQ3hDO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyxvQkFBb0IsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDN0MsQ0FBQztJQUVELHFCQUFxQixDQUFDLFFBQVE7UUFDNUIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQyxRQUFRLENBQUMsQ0FBQztRQUM3QyxJQUFJLENBQUMsTUFBTSxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUN4QixNQUFNLENBQUMsWUFBWSxFQUFFLENBQUM7UUFDdEIsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsWUFBWSxJQUFJLENBQUMsQ0FBQztRQUM3QyxNQUFNLFVBQVUsR0FBZTtZQUM3QixTQUFTLEVBQUUsSUFBSSxDQUFDLFVBQVU7WUFDMUIsVUFBVSxFQUFFLElBQUk7WUFDaEIsWUFBWSxFQUFFO2dCQUNaLFFBQVEsRUFBRSxNQUFNLENBQUMsUUFBUTtnQkFDekIsVUFBVSxFQUFFLE1BQU0sQ0FBQyxVQUFVO2FBQzlCO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELHFCQUFxQixDQUFDLFVBQVU7UUFDOUIsTUFBTSxVQUFVLEdBQWU7WUFDN0IsU0FBUyxFQUFFLElBQUksQ0FBQyxVQUFVO1lBQzFCLFVBQVU7WUFDVixZQUFZLEVBQUU7Z0JBQ1osZUFBZSxFQUFFLElBQUksQ0FBQyxlQUFlO2FBQ3RDO1NBQ0YsQ0FBQztRQUNGLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7SUFDaEQsQ0FBQztJQUVELG1CQUFtQixDQUFDLGFBQWEsR0FBRyxJQUFJO1FBQ3RDLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO1FBQzVCLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxJQUFJLElBQUksQ0FBQyxZQUFZLElBQUksQ0FBQyxDQUFDO1FBQzlELE1BQU0sVUFBVSxHQUFlO1lBQzdCLFNBQVMsRUFBRSxJQUFJLENBQUMsVUFBVTtZQUMxQixVQUFVLEVBQUUsSUFBSTtZQUNoQixZQUFZLEVBQUUsSUFBSTtTQUNuQixDQUFDO1FBQ0YsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEMsT0FBTyxJQUFJLENBQUM7SUFDZCxDQUFDO0lBRUQsS0FBSztRQUNILElBQUksQ0FBQyxhQUFhLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztRQUNuQixJQUFJLENBQUMsZUFBZSxHQUFHLEVBQUUsQ0FBQztRQUMxQixJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsU0FBUztRQUNQLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxJQUFJLENBQUMsQ0FBQztRQUN0QyxJQUFJLENBQUMsYUFBYSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQyxDQUFDO1FBQ3RELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQyxDQUFDO1FBQy9ELE9BQU8sSUFBSSxDQUFDO0lBRWQsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsS0FBSyxDQUFDLENBQUM7UUFDdkMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxlQUFlLEVBQUUsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUMsQ0FBQztRQUMvRCxPQUFPLElBQUksQ0FBQztJQUNkLENBQUM7SUFFRCxlQUFlLENBQUMsWUFBWSxFQUFFLE1BQU0sR0FBRyxLQUFLLEVBQUUsT0FBTyxHQUFHLEtBQUs7UUFDM0QsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDO1lBQ1osSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUM7WUFDeEIsSUFBSSxDQUFDLGVBQWUsR0FBRyxFQUFFLENBQUM7WUFDMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsV0FBVyxFQUFFLEtBQUssQ0FBQyxDQUFDO1lBQ3ZDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGVBQWUsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUMxQyxDQUFDO1FBQ0QsTUFBTSxhQUFhLEdBQUcsRUFBRSxHQUFHLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQztRQUNsRCxNQUFNLFVBQVUsR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDO1FBQzNDLEtBQUssTUFBTSxXQUFXLElBQUksWUFBWSxFQUFFLENBQUM7WUFDdkMsV0FBVyxDQUFDLGFBQWEsR0FBRyxXQUFXLENBQUMsYUFBYSxJQUFJLFdBQVcsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLFdBQVcsQ0FBQztZQUN6RyxNQUFNLGNBQWMsR0FBb0IsSUFBSSxlQUFlLENBQUMsV0FBVyxFQUFFLElBQUksQ0FBQyxRQUFRLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDO1lBQzlHLE1BQU0sV0FBVyxHQUFHLGNBQWMsQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLFdBQVcsQ0FBQztZQUM3RSxJQUFJLGFBQWEsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDO2dCQUMvQixTQUFTO1lBQ1gsQ0FBQztZQUNELElBQUksT0FBTyxFQUFFLENBQUM7Z0JBQ1osVUFBVSxDQUFDLE9BQU8sQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNyQyxDQUFDO2lCQUFNLENBQUM7Z0JBQ04sVUFBVSxDQUFDLElBQUksQ0FBQyxjQUFjLENBQUMsQ0FBQztZQUNsQyxDQUFDO1lBQ0QsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLGNBQWMsQ0FBQztRQUM5QyxDQUFDO1FBQ0QsSUFBSSxDQUFDLGFBQWEsR0FBRyxVQUFVLENBQUM7UUFDaEMsSUFBSSxDQUFDLGVBQWUsR0FBRyxhQUFhLENBQUM7SUFDdkMsQ0FBQztJQUVELGFBQWEsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUMsQ0FBQyxDQUFDO0lBQy9ELGNBQWMsQ0FBQyxPQUFPLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUN0RSxjQUFjLENBQUMsT0FBTyxJQUFJLElBQUksQ0FBQyxlQUFlLENBQUMsT0FBTyxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQztJQUVqRSxjQUFjLENBQUMsTUFBZSxJQUFJLElBQUksQ0FBQyxZQUFZLEdBQUcsTUFBTSxDQUFBLENBQUMsQ0FBQztJQUU5RCxVQUFVLENBQUMsYUFBYTtRQUN0QixJQUFJLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztZQUN2QixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFDL0MsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7UUFDOUIsQ0FBQzthQUFNLENBQUM7WUFDTixJQUFJLENBQUMsbUJBQW1CLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUMsQ0FBQztJQUNILENBQUM7SUFFRCxvQkFBb0I7UUFDbEIsSUFBSSxjQUFxQixDQUFDO1FBQzFCLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQ3ZCLGNBQWMsR0FBRyxJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztZQUMzQyxvREFBb0Q7WUFDcEQsTUFBTSxZQUFZLEdBQUcsY0FBYyxDQUFDLE1BQU0sQ0FBQztZQUMzQyxNQUFNLGVBQWUsR0FBRyxZQUFZLEdBQUcsSUFBSSxDQUFDLGVBQWUsQ0FBQztZQUM1RCxNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDL0YsSUFBSSxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsRUFBRSxDQUFDO2dCQUNuQyxJQUFJLENBQUMsWUFBWSxHQUFHLFVBQVUsSUFBSSxDQUFDLENBQUM7WUFDdEMsQ0FBQztZQUNELE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDO1lBQ3BFLE1BQU0sWUFBWSxHQUFHLENBQUMsSUFBSSxDQUFDLFlBQVksR0FBRyxDQUFDLENBQUMsR0FBRyxJQUFJLENBQUMsZUFBZSxHQUFHLElBQUksQ0FBQyxlQUFlLENBQUE7WUFDMUYsY0FBYyxHQUFHLGNBQWMsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUFFLFlBQVksQ0FBQyxDQUFDO1lBQ2xFLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLFlBQVksQ0FBQyxDQUFDO1FBQ3ZELENBQUM7YUFBTSxDQUFDO1lBQ04sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDdEMsQ0FBQztRQUNELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxjQUFjLElBQUksRUFBRSxDQUFDLENBQUM7SUFDM0QsQ0FBQztJQUVELGdCQUFnQixDQUFDLGFBQWE7UUFDNUIsSUFBSSxDQUFDLGNBQWMsR0FBRyxDQUFDLENBQUM7UUFDeEIsTUFBTSxFQUFFLE9BQU8sR0FBRyxJQUFJLEVBQUUsVUFBVSxHQUFHLENBQUMsRUFBRSxhQUFhLEVBQUUsV0FBVyxHQUFHLENBQUMsRUFBRSxjQUFjLEVBQ3BGLGtCQUFrQixFQUFFLGFBQWEsRUFBRSxnQkFBZ0IsRUFBRSxZQUFZLEVBQ2pFLE9BQU8sRUFBRSxNQUFNLEdBQ2hCLEdBQUcsYUFBYSxDQUFDO1FBQ2xCLElBQUksQ0FBQyxPQUFPLEdBQUcsT0FBTyxDQUFDO1FBQ3ZCLElBQUksT0FBTyxFQUFFLENBQUM7WUFDWixNQUFNLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsRUFBRTtnQkFDeEMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQztnQkFDN0MsTUFBTSxjQUFjLEdBQUcsT0FBTyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2dCQUMzQyxJQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLGNBQWMsQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3hFLENBQUMsY0FBYyxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3RELENBQUMsY0FBYyxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3pELENBQUM7Z0JBQ0QsSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLElBQUksSUFBSSxjQUFjLENBQUMsT0FBTyxLQUFLLEtBQUssRUFBRSxDQUFDO29CQUN4RSxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssSUFBSSxDQUFDLElBQUksU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDO29CQUN4RCxDQUFDLGNBQWMsQ0FBQyxPQUFPLEtBQUssS0FBSyxDQUFDLElBQUksU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO2dCQUM1RCxDQUFDO2dCQUNELElBQUksY0FBYyxDQUFDLFlBQVksRUFBRSxDQUFDO29CQUNoQyxjQUFjLENBQUMsWUFBWSxFQUFFLE9BQU8sQ0FBQyxRQUFRLENBQUMsRUFBRTt3QkFDOUMsU0FBUyxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDdEMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLGNBQWMsQ0FBQyxZQUFZLEVBQUUsQ0FBQztvQkFDaEMsY0FBYyxDQUFDLFlBQVksRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQzlDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDekMsQ0FBQyxDQUFDLENBQUM7Z0JBQ0wsQ0FBQztnQkFDRCxJQUFJLGNBQWMsQ0FBQyxjQUFjLEVBQUUsQ0FBQztvQkFDbEMsY0FBYyxDQUFDLGNBQWMsRUFBRSxPQUFPLENBQUMsUUFBUSxDQUFDLEVBQUU7d0JBQ2hELFNBQVMsQ0FBQyxlQUFlLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3RDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBQ0QsSUFBSSxjQUFjLENBQUMsZUFBZSxFQUFFLENBQUM7b0JBQ25DLGNBQWMsQ0FBQyxlQUFlLEVBQUUsT0FBTyxDQUFDLFFBQVEsQ0FBQyxFQUFFO3dCQUNqRCxTQUFTLENBQUMsa0JBQWtCLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ3pDLENBQUMsQ0FBQyxDQUFDO2dCQUNMLENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLE1BQU0sRUFBRSxDQUFDO1lBQ1gsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxPQUFPLENBQUMsU0FBUyxDQUFDLEVBQUU7Z0JBQ3RDLE1BQU0sUUFBUSxHQUFHLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQztnQkFDbEQsTUFBTSxhQUFhLEdBQUcsTUFBTSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dCQUN4QyxJQUFJLGFBQWEsQ0FBQyxPQUFPLEtBQUssSUFBSSxJQUFJLGFBQWEsQ0FBQyxPQUFPLEtBQUssS0FBSyxFQUFFLENBQUM7b0JBQ3RFLENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxJQUFJLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7b0JBQ3BELENBQUMsYUFBYSxDQUFDLE9BQU8sS0FBSyxLQUFLLENBQUMsSUFBSSxRQUFRLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3ZELENBQUM7WUFDSCxDQUFDLENBQUMsQ0FBQztRQUNMLENBQUM7UUFDRCxJQUFJLFlBQVksRUFBRSxDQUFDO1lBQ2pCLElBQUksQ0FBQyxXQUFXLEdBQUcsVUFBVSxDQUFDO1lBQzlCLElBQUksQ0FBQyxjQUFjLEdBQUcsYUFBYSxDQUFDO1lBQ3BDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLFdBQVcsRUFBRSxDQUFDLFdBQVcsQ0FBQyxDQUFDO1lBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGNBQWMsRUFBRSxDQUFDLGNBQWMsQ0FBQyxDQUFDO1lBQ3BELElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLGtCQUFrQixFQUFFLENBQUMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQyxZQUFZLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLGtCQUFrQixDQUFDLENBQUM7WUFDekcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUMxQixVQUFVLEVBQUUsYUFBYSxJQUFJLEVBQUU7Z0JBQy9CLFNBQVMsRUFBRSxnQkFBZ0IsSUFBSSxFQUFFO2FBQ2xDLENBQUMsQ0FBQztZQUNILElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7Z0JBQ3ZCLElBQUksQ0FBQyxjQUFjLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDcEMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLElBQUksQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7WUFDbkMsQ0FBQztRQUNILENBQUM7UUFDRCxJQUFJLENBQUMsV0FBVyxFQUFFLENBQUM7UUFDbkIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGNBQWMsQ0FBQyxRQUFRO1FBQ3JCLE1BQU0sV0FBVyxHQUFHLENBQUMsT0FBTyxRQUFRLEtBQUssUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsQ0FBQztRQUN6RixPQUFPLENBQUMsSUFBSSxDQUFDLGVBQWUsSUFBSSxRQUFRLElBQUksSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN6RSxDQUFDLENBQUMsSUFBSSxDQUFDLGVBQWUsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzVDLENBQUM7SUFFRCxTQUFTLENBQUMsVUFBVTtRQUNsQixPQUFPLENBQUMsSUFBSSxDQUFDLFdBQVcsSUFBSSxVQUFVLElBQUksSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQztZQUNyRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO0lBQzFDLENBQUM7SUFFRCxVQUFVLENBQUMsY0FBc0IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsTUFBTSxFQUFFLGNBQXdCLElBQUk7UUFDakcsT0FBTyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsRUFBRTtZQUN0QyxNQUFNLFlBQVksR0FBRyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDO1lBQ3ZGLE9BQU8sU0FBUyxDQUFDLFdBQVcsS0FBSyxXQUFXLElBQUksWUFBWSxDQUFDO1FBQy9ELENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVELFVBQVU7SUFFVixhQUFhLENBQUMsRUFBRTtRQUNkLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxFQUFFLEVBQUUsQ0FBQztZQUFDLE9BQU87UUFBQyxDQUFDO1FBQ3pDLElBQUksQ0FBQyxZQUFZLEdBQUcsRUFBRSxDQUFDO1FBQ3ZCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhO1FBQ1gsSUFBSSxJQUFJLENBQUMsWUFBWSxLQUFLLElBQUksRUFBRSxDQUFDO1lBQUMsT0FBTztRQUFDLENBQUM7UUFDM0MsSUFBSSxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUM7UUFDekIsSUFBSSxDQUFDLG9CQUFvQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELHFCQUFxQixDQUFDLElBQUksRUFBRSxlQUFlLEdBQUcsSUFBSTtRQUNoRCxJQUFJLENBQUMsbUJBQW1CLEdBQUcsSUFBSSxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUM7UUFDMUcsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNyQixDQUFDO1FBQ0QsSUFBSSxlQUFlLEVBQUUsQ0FBQztZQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxrQkFBa0IsRUFBRSxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQztRQUN0RCxDQUFDO0lBQ0gsQ0FBQztJQUVELG1CQUFtQixDQUFDLFVBQVUsRUFBRSxnQkFBZ0I7UUFDOUMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELFdBQVcsSUFBSSxXQUFXLENBQUMsbUJBQW1CLENBQUMsZ0JBQWdCLENBQUMsQ0FBQztJQUNuRSxDQUFDO0lBRUQsa0JBQWtCO1FBQ2hCLElBQUksZUFBZSxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUM7UUFDekMsSUFBSSxJQUFJLENBQUMsWUFBWSxFQUFFLENBQUM7WUFDdEIsZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsUUFBUSxLQUFLLElBQUksQ0FBQyxZQUFZLENBQUMsQ0FBQztRQUM1RixDQUFDO1FBQ0QsSUFBSSxJQUFJLENBQUMsbUJBQW1CLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRSxDQUFDO1lBQ3hDLGVBQWUsR0FBRyxlQUFlLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQyxJQUFJLENBQUMsbUJBQW1CLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxDQUFDLENBQUM7UUFDeEgsQ0FBQztRQUNELE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUNqRyxJQUFJLGFBQWEsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFLENBQUM7WUFDN0IsZUFBZSxHQUFHLGVBQWUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUM7UUFDekYsQ0FBQztRQUNELE9BQU8sZUFBZSxDQUFDO0lBQ3pCLENBQUM7SUFFRCxlQUFlLENBQUMsVUFBa0I7UUFDaEMsTUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsQ0FBQyxDQUFDO1FBQ3RELE9BQU8sV0FBVyxFQUFFLE1BQU0sSUFBSSxJQUFJLENBQUM7SUFDckMsQ0FBQztJQUVELGVBQWUsQ0FBQyxVQUFrQixFQUFFLFlBQXlCLEVBQUUsV0FBMEIsSUFBSTtRQUMzRixNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsTUFBTSxzQkFBc0IsR0FBRyxXQUFXLEVBQUUsZ0JBQWdCLElBQUksSUFBSSxDQUFDO1FBQ3JFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1lBQzVCLE9BQU87UUFDVCxDQUFDO1FBQ0QsV0FBVyxJQUFJLFdBQVcsQ0FBQyxTQUFTLENBQUMsWUFBWSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQzdELElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxrQkFBa0IsQ0FBQyxVQUFrQjtRQUNuQyxNQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsVUFBVSxDQUFDLENBQUM7UUFDdEQsV0FBVyxJQUFJLFdBQVcsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUMxQyxJQUFJLENBQUMsb0JBQW9CLEVBQUUsQ0FBQztJQUM5QixDQUFDO0lBRUQsSUFBSSxhQUFhO1FBQ2YsTUFBTSxhQUFhLEdBQVE7WUFDekIsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLG1CQUFtQjtZQUMzQyxjQUFjLEVBQUUsRUFBRTtTQUNuQixDQUFDO1FBQ0YsTUFBTSxhQUFhLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUUsQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQ2pHLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBRyxhQUFhLENBQUMsTUFBTSxFQUFFLEtBQUssRUFBRSxFQUFFLENBQUM7WUFDMUQsTUFBTSxZQUFZLEdBQUcsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO1lBQzFDLGFBQWEsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDO2dCQUNoQyxTQUFTLEVBQUUsWUFBWSxFQUFFLFNBQVM7Z0JBQ2xDLFFBQVEsRUFBRSxZQUFZLEVBQUUsUUFBUTtnQkFDaEMsV0FBVyxFQUFFLFlBQVksRUFBRSxNQUFNLENBQUMsQ0FBQyxDQUFDO2dCQUNwQyxXQUFXLEVBQUUsWUFBWSxFQUFFLE1BQU0sQ0FBQyxDQUFDLENBQUM7YUFDckMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUNELE9BQU8sYUFBYSxDQUFDO0lBQ3ZCLENBQUM7SUFFRCxrQ0FBa0M7SUFFbEMsSUFBSSxDQUFDLFVBQVUsRUFBRSxTQUFTO1FBQ3hCLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxVQUFVLEVBQUUsU0FBUyxDQUFDLENBQUM7UUFDN0MsSUFBSSxJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDdkIsSUFBSSxDQUFDLGFBQWEsRUFBRSxDQUFBO1FBQ3RCLENBQUM7YUFBTSxDQUFDO1lBQ04sSUFBSSxDQUFDLG1CQUFtQixFQUFFLENBQUM7UUFDN0IsQ0FBQztJQUNILENBQUM7SUFFRCxnQkFBZ0IsQ0FBQyxXQUFXLEVBQUUsU0FBUyxHQUFHLElBQUk7UUFDNUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFO1lBQzFCLFVBQVUsRUFBRSxXQUFXO1lBQ3ZCLFNBQVMsRUFBRSxDQUFDLFNBQVMsS0FBSyxRQUFRLENBQUMsQ0FBQyxDQUFDLENBQUMsb0JBQW9CLENBQUMsQ0FBQyxDQUFDLHFCQUFxQjtTQUNuRixDQUFDLENBQUM7SUFDTCxDQUFDO0lBRUQsYUFBYTtRQUNYLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFLENBQUM7WUFBQyxPQUFPO1FBQUMsQ0FBQztRQUN0RSxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQyxFQUFFLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUM7UUFDL0cscUJBQXFCO1FBQ3JCLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxDQUFDO0lBQzlCLENBQUM7SUFFRCxhQUFhLENBQUMsT0FBd0IsRUFBRSxPQUF3QixFQUFFLGFBQWEsRUFBRSxTQUFTO1FBQ3hGLE1BQU0sWUFBWSxHQUFHLE9BQU8sQ0FBQyxhQUFhLENBQUMsYUFBYSxDQUFDLENBQUM7UUFDMUQsTUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsQ0FBQztRQUMxRCxNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUM3RixNQUFNLGFBQWEsR0FBRyxLQUFLLENBQUMsWUFBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQztRQUM3RixJQUFJLE1BQU0sR0FBRyxDQUFDLENBQUM7UUFDZixJQUFJLGFBQWEsR0FBRyxhQUFhLEVBQUUsQ0FBQztZQUNsQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUM7UUFDZCxDQUFDO2FBQU0sSUFBSSxhQUFhLEdBQUcsYUFBYSxFQUFFLENBQUM7WUFDekMsTUFBTSxHQUFHLENBQUMsQ0FBQztRQUNiLENBQUM7UUFDRCxPQUFPLFNBQVMsS0FBSyxvQkFBb0IsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQztJQUMvRCxDQUFDO0lBRVEsOEJBQThCLENBQUMsSUFBSSxFQUFFLGlCQUFpQjtRQUM3RCxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5QixNQUFNLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7UUFDSCxJQUFJLENBQUMsUUFBUSxFQUFFLE9BQU8sQ0FBQyxNQUFNLENBQUMsRUFBRTtZQUM5QixNQUFNLEVBQUUscUJBQXFCLENBQUMsSUFBSSxFQUFFLGlCQUFpQixDQUFDLENBQUM7UUFDekQsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0NBQ0YiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBTdWJqZWN0IH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBlbGVtZW50VHlwZXMgfSBmcm9tICcuLi9mb3JtLmNvbnN0YW50cyc7XG5pbXBvcnQgeyBGb3JtRWxlbWVudCB9IGZyb20gJy4uL2VsZW1lbnQnO1xuaW1wb3J0IHsgUmVjb3JkVGFibGVDb2x1bW4gfSBmcm9tICcuL2NvbHVtbic7XG5pbXBvcnQgeyBUYWJsZUFjdGlvbiB9IGZyb20gJy4vYWN0aW9uJztcbmltcG9ydCB7IFRhYmxlUmVjb3JkRGF0YSB9IGZyb20gJy4vcm93LWRhdGEnO1xuXG5jb25zdCBUQUJMRV9TT1JUX0FTQ0VORElORyA9ICdhc2MnO1xuY29uc3QgVEFCTEVfU09SVF9ERVNDRU5ESU5HID0gJ2Rlc2MnO1xuXG5jb25zdCBhdHRycyA9IHtcbiAgYWxsU2VsZWN0ZWQ6IHsgbmFtZTogJ2FsbFNlbGVjdGVkJywgcHJvcGFnYXRlOiAnYWxsU2VsZWN0ZWQnIH0sXG4gIHRhYmxlQ29kZTogeyBuYW1lOiAndGFibGVDb2RlJywgcHJvcGFnYXRlOiAnY29kZScgfSxcbiAgY2xpZW50UGFnaW5nOiB7IG5hbWU6ICdjbGllbnRQYWdpbmcnLCBwcm9wYWdhdGU6IG51bGwgfSxcbiAgZ2xvYmFsU2VhcmNoOiB7IG5hbWU6ICdnbG9iYWxTZWFyY2gnLCBwcm9wYWdhdGU6ICdnbG9iYWxTZWFyY2gnIH0sXG4gIGdsb2JhbEZpbHRlclN0cmluZzogeyBuYW1lOiAnX2dsb2JhbEZpbHRlclN0cmluZycsIHByb3BhZ2F0ZTogJ2dsb2JhbEZpbHRlclN0cmluZycgfSxcbiAgc29ydGluZzogeyBuYW1lOiAnc29ydGluZycsIHByb3BhZ2F0ZTogbnVsbCB9LFxuICByZWNvcmRzUGVyUGFnZTogeyBuYW1lOiAncmVjb3Jkc1BlclBhZ2UnLCBwcm9wYWdhdGU6ICdyZWNvcmRzUGVyUGFnZScgfSxcbiAgbGF5b3V0OiB7IG5hbWU6ICdsYXlvdXQnLCBwcm9wYWdhdGU6ICdsYXlvdXQnIH0sXG4gIGNvbHVtbnM6IHsgbmFtZTogJ2NvbHVtbnMnLCBwcm9wYWdhdGU6ICdjb2x1bW5zJyB9LFxuICBzZWxlY3RlZFJlY29yZHM6IHsgbmFtZTogJ3NlbGVjdGVkUmVjb3JkcycsIHByb3BhZ2F0ZTogJ3NlbGVjdGVkUmVjb3JkcycgfSxcbiAgY3VycmVudFBhZ2U6IHsgbmFtZTogJ2N1cnJlbnRQYWdlJywgcHJvcGFnYXRlOiAnY3VycmVudFBhZ2UnIH0sXG4gIHRvdGFsUmVjb3Jkc051bWJlcjogeyBuYW1lOiAndG90YWxSZWNvcmRzTnVtYmVyJywgcHJvcGFnYXRlOiAndG90YWxSZWNvcmRzTnVtYmVyJyB9LFxuICB2aXNpYmxlUmVjb3JkczogeyBuYW1lOiAnX3Zpc2libGVSZWNvcmRzJywgcHJvcGFnYXRlOiAndmlzaWJsZVJlY29yZHMnIH0sXG4gIHdhaXRpbmc6IHsgbmFtZTogJ193YWl0aW5nJywgcHJvcGFnYXRlOiAnd2FpdGluZycgfSxcbn07XG5cbmV4cG9ydCBpbnRlcmZhY2UgVGFibGVBY3Rpb25FdmVudCB7XG4gIGFjdGlvbkNvZGU6IHN0cmluZztcbiAgcmVjb3JkSWQ6IGFueTtcbiAgcmVjb3JkRGF0YTogYW55O1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFRhYmxlRXZlbnQge1xuICB0YWJsZUNvZGU6IHN0cmluZztcbiAgYWN0aW9uQ29kZTogc3RyaW5nIHwgbnVsbDtcbiAgYWN0aW9uRGV0YWlsOiBhbnk7XG59XG5cbmV4cG9ydCBjbGFzcyBSZWNvcmRUYWJsZSBleHRlbmRzIEZvcm1FbGVtZW50IHtcbiAgcHJpdmF0ZSByZWFkb25seSBfaW5saW5lQWN0aW9uVHJpZ2dlciA9IG5ldyBTdWJqZWN0PFRhYmxlRXZlbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dsb2JhbEFjdGlvblRyaWdnZXIgPSBuZXcgU3ViamVjdDxUYWJsZUV2ZW50PigpO1xuICBwcml2YXRlIHJlYWRvbmx5IF9yZWNvcmRTZWxlY3Rpb25UcmlnZ2VyID0gbmV3IFN1YmplY3Q8VGFibGVFdmVudD4oKTtcbiAgcHJpdmF0ZSByZWFkb25seSBfc2VsZWN0aW9uQWN0aW9uVHJpZ2dlciA9IG5ldyBTdWJqZWN0PFRhYmxlRXZlbnQ+KCk7XG4gIHByaXZhdGUgcmVhZG9ubHkgX2dldERhdGFUcmlnZ2VyID0gbmV3IFN1YmplY3Q8VGFibGVFdmVudD4oKTtcbiAgcHJpdmF0ZSBfdGFibGVDb2x1bW5PYmogPSB7fTtcbiAgcHJpdmF0ZSBfYXBwZW5kUGFnZXM6IGJvb2xlYW47XG4gIHByaXZhdGUgX2FjdGlvbnM6IFRhYmxlQWN0aW9uW107XG4gIHByaXZhdGUgX2FjdGlvbnNPYmogPSB7fTtcblxuICAvLyBNZWNhbmlzbW9zIGRlIGZpbHRyYWRvIG51ZXZhIHZlcnNpw7NuXG4gIHByaXZhdGUgX2dsb2JhbEZpbHRlclN0cmluZzogc3RyaW5nID0gJyc7XG4gIHByaXZhdGUgZ2xvYmFsRmlsdGVyU3RyaW5nczogc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBzZWxlY3RlZFJlY29yZHM6IGFueTtcbiAgcHJpdmF0ZSByZXN0cmljdGVkSWQ6IGFueTtcbiAgcHJpdmF0ZSBsYXlvdXQ6IHN0cmluZyB8IG51bGwgPSBudWxsO1xuICBwcml2YXRlIF9nbG9iYWxTZWFyY2g6IGJvb2xlYW47XG4gIHByaXZhdGUgX3RhYmxlUmVjb3JkczogVGFibGVSZWNvcmREYXRhW107XG4gIHByaXZhdGUgX3RhYmxlUmVjb3JkT2JqID0ge307XG4gIHByaXZhdGUgX3Zpc2libGVSZWNvcmRzOiBUYWJsZVJlY29yZERhdGFbXSA9IFtdO1xuICBwcml2YXRlIF9jb2x1bW5zOiBSZWNvcmRUYWJsZUNvbHVtbltdO1xuICBwcml2YXRlIF9zZWxlY3RhYmxlOiBib29sZWFuO1xuICBwcml2YXRlIF9zZWxlY3Rpb25CYWNrZW5kOiBib29sZWFuO1xuICBwcml2YXRlIF9zZWxlY3Rpb25GaWVsZDogc3RyaW5nO1xuICBwcml2YXRlIF9hbGxTZWxlY3RlZCA9IGZhbHNlO1xuICBwcml2YXRlIF90YWJsZUNvZGU6IHN0cmluZyA9ICcnO1xuICBwcml2YXRlIF90YWJsZVRpdGxlOiBzdHJpbmc7XG4gIHByaXZhdGUgX2N1cnJlbnRQYWdlOiBudW1iZXI7XG4gIHByaXZhdGUgX3RvdGFsUGFnZXM6IG51bWJlcjtcbiAgcHJpdmF0ZSBfcmVxdWVzdGVkUGFnZTogbnVtYmVyO1xuICBwcml2YXRlIF9yZWNvcmRzUGVyUGFnZTogbnVtYmVyID0gMTA7XG4gIHByaXZhdGUgX3RvdGFsUmVjb3Jkc051bWJlcjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfcmVjb3Jkc051bWJlcjogbnVtYmVyID0gMDtcbiAgcHJpdmF0ZSBfc29ydGluZzogYW55O1xuICBwcml2YXRlIF93YWl0aW5nOiBib29sZWFuO1xuICBwcml2YXRlIF9jbGllbnRQYWdpbmc6IGJvb2xlYW4gPSB0cnVlO1xuICBwcml2YXRlIF9zb3J0YWJsZTogYm9vbGVhbjtcblxuICBjb25zdHJ1Y3Rvcih0YWJsZVJlY2VpdmVkLCBmb3JtQ29uZmlnKSB7XG4gICAgc3VwZXIodGFibGVSZWNlaXZlZCwgZm9ybUNvbmZpZyk7XG4gICAgdGhpcy5wcm9wYWdhdGlvbkN1c3RvbUF0dHJpYnV0ZXMgPSB0aGlzLl9mb3JtQ29uZmlnPy5wcm9wYWdhdGlvbkN1c3RvbUF0dHJpYnV0ZXM/LnRhYmxlcyA/PyBbXTtcbiAgICB0aGlzLmVsZW1lbnRUeXBlID0gZWxlbWVudFR5cGVzLnRhYmxlO1xuICAgIHRoaXMuX3dhaXRpbmcgPSBmYWxzZTtcbiAgICB0aGlzLl9jdXJyZW50UGFnZSA9IDE7XG4gICAgdGhpcy5fdG90YWxQYWdlcyA9IDE7XG4gICAgdGhpcy5fcmVxdWVzdGVkUGFnZSA9IDE7XG4gICAgdGhpcy5fY29sdW1ucyA9IFtdO1xuICAgIHRoaXMuX3RhYmxlQ29sdW1uT2JqID0ge307XG4gICAgdGhpcy5fYWN0aW9ucyA9IFtdO1xuICAgIHRoaXMuX2FjdGlvbnNPYmogPSB7fTtcbiAgICB0aGlzLl90YWJsZVJlY29yZHMgPSBbXTtcbiAgICB0aGlzLl9nbG9iYWxTZWFyY2ggPSBmYWxzZTtcbiAgICB0aGlzLnJlc3RyaWN0ZWRJZCA9IG51bGw7XG5cbiAgICB0aGlzLl90YWJsZVRpdGxlID0gdGFibGVSZWNlaXZlZC50YWJsZVRpdGxlO1xuICAgIHRoaXMuX2FwcGVuZFBhZ2VzID0gdGFibGVSZWNlaXZlZD8uYXBwZW5kID8/IGZhbHNlO1xuICAgIHRoaXMuX3NlbGVjdGFibGUgPSB0YWJsZVJlY2VpdmVkPy5zZWxlY3RhYmxlID8/IGZhbHNlO1xuICAgIHRoaXMuX3NlbGVjdGlvbkJhY2tlbmQgPSB0YWJsZVJlY2VpdmVkPy5zZWxlY3Rpb25CYWNrZW5kID8/IGZhbHNlO1xuICAgIHRoaXMuX3NvcnRhYmxlID0gdGFibGVSZWNlaXZlZD8uc29ydGFibGUgPz8gZmFsc2U7XG5cbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWxsU2VsZWN0ZWQsIGZhbHNlKTtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMudGFibGVDb2RlLCB0YWJsZVJlY2VpdmVkLnRhYmxlQ29kZSk7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLmNsaWVudFBhZ2luZywgdGFibGVSZWNlaXZlZD8uY2xpZW50UGFnaW5nID8/IHRydWUpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5nbG9iYWxTZWFyY2gsIHRhYmxlUmVjZWl2ZWQ/LnNpbXBsZUZpbHRlciA/PyBmYWxzZSk7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLmdsb2JhbEZpbHRlclN0cmluZywgJycpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5zb3J0aW5nLCB7IGNvbHVtbk5hbWU6ICcnLCBkaXJlY3Rpb246ICcnIH0pO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5yZWNvcmRzUGVyUGFnZSwgZm9ybUNvbmZpZy5kZWZhdWx0UmVjb3Jkc1BlclBhZ2UpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5sYXlvdXQsICcnKTtcblxuICAgIGlmICh0YWJsZVJlY2VpdmVkLmZpZWxkcykge1xuICAgICAgY29uc3QgY29sdW1uczogUmVjb3JkVGFibGVDb2x1bW5bXSA9IFtdO1xuICAgICAgZm9yIChjb25zdCBjb2x1bW5SZWNlaXZlZCBvZiB0YWJsZVJlY2VpdmVkLmZpZWxkcykge1xuICAgICAgICBjb25zdCBjb2x1bW5FbnJpY2hlZCA9IHtcbiAgICAgICAgICAuLi5jb2x1bW5SZWNlaXZlZCxcbiAgICAgICAgICB2aXNpYmxlU3RhdGVzOiB0aGlzLnZpc2libGVTdGF0ZXMsXG4gICAgICAgICAgZW5hYmxlZFN0YXRlczogdGhpcy5lbmFibGVkU3RhdGVzXG4gICAgICAgIH07XG4gICAgICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb246IFJlY29yZFRhYmxlQ29sdW1uID0gbmV3IFJlY29yZFRhYmxlQ29sdW1uKGNvbHVtbkVucmljaGVkLCB0aGlzLl9mb3JtQ29uZmlnKTtcbiAgICAgICAgY29sdW1ucy5wdXNoKGNvbHVtbkRlZmluaXRpb24pO1xuICAgICAgICB0aGlzLl90YWJsZUNvbHVtbk9ialtjb2x1bW5EZWZpbml0aW9uLmZpZWxkQ29kZV0gPSBjb2x1bW5EZWZpbml0aW9uO1xuICAgICAgfVxuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLmNvbHVtbnMsIGNvbHVtbnMpO1xuICAgIH1cbiAgICBpZiAodGFibGVSZWNlaXZlZC5hY3Rpb25zKSB7XG4gICAgICBjb25zdCB0YWJsZUFjdGlvbnMgPSB0YWJsZVJlY2VpdmVkLmFjdGlvbnMubWFwKG9iakRlZiA9PiB7XG4gICAgICAgIGxldCB2aXNpYmxlU3RhdGVzID0gb2JqRGVmLnZpc2libGVTdGF0ZXM7XG4gICAgICAgIGxldCBlbmFibGVkU3RhdGVzID0gb2JqRGVmLmVuYWJsZWRTdGF0ZXM7XG4gICAgICAgIGlmICghdmlzaWJsZVN0YXRlcykge1xuICAgICAgICAgIHZpc2libGVTdGF0ZXMgPSAob2JqRGVmLmFjdGlvbk1vZGVzIHx8ICcnKS5zcGxpdCgnLCcpXG4gICAgICAgICAgICAubWFwKHN0YXRlID0+IHN0YXRlLnRyaW0oKSlcbiAgICAgICAgICAgIC5maWx0ZXIoc3RhdGUgPT4gc3RhdGUubGVuZ3RoID4gMCk7XG4gICAgICAgICAgZW5hYmxlZFN0YXRlcyA9IChvYmpEZWYuYWN0aW9uTW9kZXMgfHwgJycpLnNwbGl0KCcsJylcbiAgICAgICAgICAgIC5tYXAoc3RhdGUgPT4gc3RhdGUudHJpbSgpKVxuICAgICAgICAgICAgLmZpbHRlcihzdGF0ZSA9PiBzdGF0ZS5sZW5ndGggPiAwKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4geyAuLi5vYmpEZWYsIHZpc2libGVTdGF0ZXMsIGVuYWJsZWRTdGF0ZXMgfTtcbiAgICAgIH0pO1xuICAgICAgZm9yIChjb25zdCBhY3Rpb25SZWNlaXZlZCBvZiB0YWJsZUFjdGlvbnMpIHtcbiAgICAgICAgY29uc3QgaW5saW5lQWN0aW9uID0gbmV3IFRhYmxlQWN0aW9uKGFjdGlvblJlY2VpdmVkLCB0aGlzLl9mb3JtQ29uZmlnKTtcbiAgICAgICAgdGhpcy5fYWN0aW9ucy5wdXNoKGlubGluZUFjdGlvbik7XG4gICAgICAgIHRoaXMuX2FjdGlvbnNPYmpbaW5saW5lQWN0aW9uLmFjdGlvbkNvZGVdID0gaW5saW5lQWN0aW9uO1xuICAgICAgfVxuICAgIH1cbiAgICB0aGlzLl9zZWxlY3Rpb25GaWVsZCA9ICh0aGlzLl9zZWxlY3RhYmxlKSA/IHRhYmxlUmVjZWl2ZWQ/LnNlbGVjdGlvbkZpZWxkIDogbnVsbDtcbiAgICAvLyBGaWx0cm9zIHByZWRlZmluaWRvcyBlbiBlbCBmb3JtdWxhcmlvXG4gICAgaWYgKHRhYmxlUmVjZWl2ZWQuZmlsdGVycykge1xuICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IHRhYmxlUmVjZWl2ZWQuZmlsdGVycy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgdGhpcy5hZGRGaWx0ZXJEZWZpbml0aW9uKHRhYmxlUmVjZWl2ZWQuZmlsdGVyc1tpbmRleF0uZmllbGRDb2RlLCB0YWJsZVJlY2VpdmVkLmZpbHRlcnNbaW5kZXhdKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBnZXQgY29sdW1uTmFtZXMoKSB7IHJldHVybiBPYmplY3Qua2V5cyh0aGlzLl90YWJsZUNvbHVtbk9iaik7IH1cbiAgZ2V0IGlubGluZUFjdGlvblRyaWdnZXIoKSB7IHJldHVybiB0aGlzLl9pbmxpbmVBY3Rpb25UcmlnZ2VyLmFzT2JzZXJ2YWJsZSgpOyB9XG4gIGdldCBnbG9iYWxBY3Rpb25UcmlnZ2VyKCkgeyByZXR1cm4gdGhpcy5fZ2xvYmFsQWN0aW9uVHJpZ2dlci5hc09ic2VydmFibGUoKTsgfVxuICBnZXQgc2VsZWN0aW9uQWN0aW9uVHJpZ2dlcigpIHsgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkFjdGlvblRyaWdnZXIuYXNPYnNlcnZhYmxlKCk7IH1cbiAgZ2V0IHJlY29yZFNlbGVjdGlvblRyaWdnZXIoKSB7IHJldHVybiB0aGlzLl9yZWNvcmRTZWxlY3Rpb25UcmlnZ2VyLmFzT2JzZXJ2YWJsZSgpOyB9XG4gIGdldCBnZXREYXRhVHJpZ2dlcigpIHsgcmV0dXJuIHRoaXMuX2dldERhdGFUcmlnZ2VyLmFzT2JzZXJ2YWJsZSgpOyB9XG5cbiAgZ2V0IGdsb2JhbFNlYXJjaCgpIHsgcmV0dXJuIHRoaXMuX2dsb2JhbFNlYXJjaDsgfVxuICBnZXQgdGFibGVSZWNvcmRzKCkgeyByZXR1cm4gdGhpcy5fdGFibGVSZWNvcmRzOyB9XG4gIGdldCB0YWJsZVJlY29yZE9iaigpIHsgcmV0dXJuIHRoaXMuX3RhYmxlUmVjb3JkT2JqOyB9XG4gIGdldCB2aXNpYmxlUmVjb3JkcygpIHsgcmV0dXJuIHRoaXMuX3Zpc2libGVSZWNvcmRzOyB9XG4gIGdldCBjb2x1bW5zKCkgeyByZXR1cm4gdGhpcy5fY29sdW1uczsgfVxuICBnZXQgc2VsZWN0YWJsZSgpIHsgcmV0dXJuIHRoaXMuX3NlbGVjdGFibGU7IH1cbiAgZ2V0IHNlbGVjdGlvbkJhY2tlbmQoKSB7IHJldHVybiB0aGlzLl9zZWxlY3Rpb25CYWNrZW5kOyB9XG4gIGdldCBzZWxlY3Rpb25GaWVsZCgpIHsgcmV0dXJuIHRoaXMuX3NlbGVjdGlvbkZpZWxkOyB9XG4gIGdldCBhbGxTZWxlY3RlZCgpIHsgcmV0dXJuIHRoaXMuX2FsbFNlbGVjdGVkOyB9XG4gIGdldCB0YWJsZUNvZGUoKSB7IHJldHVybiB0aGlzLl90YWJsZUNvZGU7IH1cbiAgZ2V0IHRhYmxlVGl0bGUoKSB7IHJldHVybiB0aGlzLl90YWJsZVRpdGxlOyB9XG4gIGdldCBjdXJyZW50UGFnZSgpIHsgcmV0dXJuIHRoaXMuX2N1cnJlbnRQYWdlOyB9XG4gIGdldCB0b3RhbFBhZ2VzKCkgeyByZXR1cm4gdGhpcy5fdG90YWxQYWdlczsgfVxuICBnZXQgcmVxdWVzdGVkUGFnZSgpIHsgcmV0dXJuIHRoaXMuX3JlcXVlc3RlZFBhZ2U7IH1cbiAgZ2V0IHJlY29yZHNQZXJQYWdlKCkgeyByZXR1cm4gdGhpcy5fcmVjb3Jkc1BlclBhZ2U7IH1cbiAgZ2V0IHRvdGFsUmVjb3Jkc051bWJlcigpIHsgcmV0dXJuIHRoaXMuX3RvdGFsUmVjb3Jkc051bWJlcjsgfVxuICBnZXQgcmVjb3Jkc051bWJlcigpIHsgcmV0dXJuIHRoaXMuX3JlY29yZHNOdW1iZXI7IH1cbiAgZ2V0IHNvcnRpbmcoKSB7IHJldHVybiB0aGlzLl9zb3J0aW5nOyB9XG4gIGdldCB3YWl0aW5nKCkgeyByZXR1cm4gdGhpcy5fd2FpdGluZzsgfVxuICBnZXQgY2xpZW50UGFnaW5nKCkgeyByZXR1cm4gdGhpcy5fY2xpZW50UGFnaW5nOyB9XG4gIGdldCBzb3J0YWJsZSgpIHsgcmV0dXJuIHRoaXMuX3NvcnRhYmxlOyB9XG5cbiAgZ2V0IGdsb2JhbEZpbHRlclN0cmluZygpIHsgcmV0dXJuIHRoaXMuX2dsb2JhbEZpbHRlclN0cmluZzsgfVxuICBzZXQgZ2xvYmFsRmlsdGVyU3RyaW5nKGdsb2JhbEZpbHRlclN0cmluZykgeyB0aGlzLl9nbG9iYWxGaWx0ZXJTdHJpbmcgPSBnbG9iYWxGaWx0ZXJTdHJpbmc7IH1cblxuICBzZXQgZ2xvYmFsU2VhcmNoKGdsb2JhbFNlYXJjaCkgeyB0aGlzLl9nbG9iYWxTZWFyY2ggPSBnbG9iYWxTZWFyY2g7IH1cbiAgc2V0IHRhYmxlUmVjb3Jkcyh0YWJsZVJlY29yZHMpIHsgdGhpcy5fdGFibGVSZWNvcmRzID0gdGFibGVSZWNvcmRzOyB9XG4gIHNldCB0YWJsZVJlY29yZE9iaih0YWJsZVJlY29yZE9iaikgeyB0aGlzLl90YWJsZVJlY29yZE9iaiA9IHRhYmxlUmVjb3JkT2JqOyB9XG4gIHNldCB2aXNpYmxlUmVjb3Jkcyh2aXNpYmxlUmVjb3JkcykgeyB0aGlzLl92aXNpYmxlUmVjb3JkcyA9IHZpc2libGVSZWNvcmRzID8/IFtdOyB9XG4gIHNldCBjb2x1bW5zKGNvbHVtbnMpIHsgdGhpcy5fY29sdW1ucyA9IGNvbHVtbnM7IH1cbiAgc2V0IHNlbGVjdGFibGUoc2VsZWN0YWJsZSkgeyB0aGlzLl9zZWxlY3RhYmxlID0gc2VsZWN0YWJsZTsgfVxuICBzZXQgc2VsZWN0aW9uQmFja2VuZChzZWxlY3Rpb25CYWNrZW5kKSB7IHRoaXMuX3NlbGVjdGlvbkJhY2tlbmQgPSBzZWxlY3Rpb25CYWNrZW5kOyB9XG4gIHNldCBzZWxlY3Rpb25GaWVsZChzZWxlY3Rpb25GaWVsZCkgeyB0aGlzLl9zZWxlY3Rpb25GaWVsZCA9IHNlbGVjdGlvbkZpZWxkOyB9XG4gIHNldCBhbGxTZWxlY3RlZChhbGxTZWxlY3RlZCkgeyB0aGlzLl9hbGxTZWxlY3RlZCA9IGFsbFNlbGVjdGVkOyB9XG4gIHNldCB0YWJsZUNvZGUodGFibGVDb2RlKSB7IHRoaXMuX3RhYmxlQ29kZSA9IHRhYmxlQ29kZTsgfVxuICBzZXQgdGFibGVUaXRsZSh0YWJsZVRpdGxlKSB7IHRoaXMuX3RhYmxlVGl0bGUgPSB0YWJsZVRpdGxlOyB9XG4gIHNldCBjdXJyZW50UGFnZShjdXJyZW50UGFnZSkgeyB0aGlzLl9jdXJyZW50UGFnZSA9IGN1cnJlbnRQYWdlOyB9XG4gIHNldCB0b3RhbFBhZ2VzKHRvdGFsUGFnZXMpIHsgdGhpcy5fdG90YWxQYWdlcyA9IHRvdGFsUGFnZXM7IH1cbiAgc2V0IHJlcXVlc3RlZFBhZ2UocmVxdWVzdGVkUGFnZSkgeyB0aGlzLl9yZXF1ZXN0ZWRQYWdlID0gcmVxdWVzdGVkUGFnZTsgfVxuICBzZXQgcmVjb3Jkc1BlclBhZ2UocmVjb3Jkc1BlclBhZ2UpIHsgdGhpcy5fcmVjb3Jkc1BlclBhZ2UgPSByZWNvcmRzUGVyUGFnZTsgfVxuICBzZXQgdG90YWxSZWNvcmRzTnVtYmVyKHRvdGFsUmVjb3Jkc051bWJlcikgeyB0aGlzLl90b3RhbFJlY29yZHNOdW1iZXIgPSB0b3RhbFJlY29yZHNOdW1iZXI7IH1cbiAgc2V0IHJlY29yZHNOdW1iZXIocmVjb3Jkc051bWJlcikgeyB0aGlzLl9yZWNvcmRzTnVtYmVyID0gcmVjb3Jkc051bWJlcjsgfVxuICBzZXQgc29ydGluZyhzb3J0aW5nKSB7IHRoaXMuX3NvcnRpbmcgPSBzb3J0aW5nOyB9XG4gIHNldCB3YWl0aW5nKHdhaXRpbmcpIHsgdGhpcy5zZXRBdHRyKGF0dHJzLndhaXRpbmcsIHdhaXRpbmcpIH1cbiAgc2V0IGNsaWVudFBhZ2luZyhjbGllbnRQYWdpbmcpIHsgdGhpcy5fY2xpZW50UGFnaW5nID0gY2xpZW50UGFnaW5nOyB9XG4gIHNldCBzb3J0YWJsZShzb3J0YWJsZSkgeyB0aGlzLl9zb3J0YWJsZSA9IHNvcnRhYmxlOyB9XG5cbiAgZ2V0TGF5b3V0KCkgeyByZXR1cm4gdGhpcy5sYXlvdXQ7IH1cbiAgc2V0TGF5b3V0KGxheW91dCkgeyB0aGlzLnNldEF0dHIoYXR0cnMubGF5b3V0LCBsYXlvdXQpOyB9XG4gIGhhc0FjdGlvbnMoKSB7IHJldHVybiAodGhpcy5fYWN0aW9ucy5sZW5ndGggPiAwKTsgfVxuICBnZXRTZWxlY3RlZFJlY29yZHMoKSB7IHJldHVybiB0aGlzLl90YWJsZVJlY29yZHMuZmlsdGVyKHJlYyA9PiByZWMuc2VsZWN0ZWQpLm1hcChyZWMgPT4gcmVjLnJlY29yZElkKTsgfVxuICBhY3RpdmF0ZUdsb2JhbFNlYXJjaCgpIHsgdGhpcy5fZ2xvYmFsU2VhcmNoID0gdHJ1ZTsgfVxuICBpbmFjdGl2YXRlR2xvYmFsU2VhcmNoKCkgeyB0aGlzLl9nbG9iYWxTZWFyY2ggPSBmYWxzZTsgfVxuICBjb2x1bW5EZWZpbml0aW9uKGZpZWxkQ29kZSk6IFJlY29yZFRhYmxlQ29sdW1uIHsgcmV0dXJuIHRoaXMuX3RhYmxlQ29sdW1uT2JqW2ZpZWxkQ29kZV07IH1cbiAgcHV0T25XYWl0KCkgeyB0aGlzLndhaXRpbmcgPSB0cnVlOyB9XG4gIGZyZWVXYWl0aW5nKCkgeyB0aGlzLndhaXRpbmcgPSBmYWxzZTsgfVxuICBzZXRXaWRnZXQod2lkZ2V0KSB7IHRoaXMud2lkZ2V0ID0gd2lkZ2V0OyB9XG5cbiAgbm90aWZ5R2xvYmFsQWN0aW9uKGFjdGlvbkNvZGUpIHtcbiAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUV2ZW50ID0ge1xuICAgICAgdGFibGVDb2RlOiB0aGlzLl90YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgYWN0aW9uRGV0YWlsOiBudWxsXG4gICAgfTtcbiAgICB0aGlzLl9nbG9iYWxBY3Rpb25UcmlnZ2VyLm5leHQodGFibGVFdmVudCk7XG4gIH1cblxuICBub3RpZnlJbmxpbmVBY3Rpb24odGFibGVBY3Rpb25FdmVudDogVGFibGVBY3Rpb25FdmVudCkge1xuICAgIGNvbnN0IHRhYmxlRXZlbnQ6IFRhYmxlRXZlbnQgPSB7XG4gICAgICB0YWJsZUNvZGU6IHRoaXMuX3RhYmxlQ29kZSxcbiAgICAgIGFjdGlvbkNvZGU6IHRhYmxlQWN0aW9uRXZlbnQuYWN0aW9uQ29kZSxcbiAgICAgIGFjdGlvbkRldGFpbDoge1xuICAgICAgICByZWNvcmRJZDogdGFibGVBY3Rpb25FdmVudC5yZWNvcmRJZCxcbiAgICAgICAgcmVjb3JkRGF0YTogdGFibGVBY3Rpb25FdmVudC5yZWNvcmREYXRhXG4gICAgICB9XG4gICAgfTtcbiAgICB0aGlzLl9pbmxpbmVBY3Rpb25UcmlnZ2VyLm5leHQodGFibGVFdmVudCk7XG4gIH1cblxuICBub3RpZnlSZWNvcmRTZWxlY3Rpb24ocmVjb3JkSWQpIHtcbiAgICBjb25zdCByZWNvcmQgPSB0aGlzLmdldFRhYmxlUmVjb3JkKHJlY29yZElkKTtcbiAgICBpZiAoIXJlY29yZCkgeyByZXR1cm47IH1cbiAgICByZWNvcmQudG9nZ2xlU2VsZWN0KCk7XG4gICAgdGhpcy5fcmVxdWVzdGVkUGFnZSA9IHRoaXMuX2N1cnJlbnRQYWdlID8/IDE7XG4gICAgY29uc3QgdGFibGVFdmVudDogVGFibGVFdmVudCA9IHtcbiAgICAgIHRhYmxlQ29kZTogdGhpcy5fdGFibGVDb2RlLFxuICAgICAgYWN0aW9uQ29kZTogbnVsbCxcbiAgICAgIGFjdGlvbkRldGFpbDoge1xuICAgICAgICByZWNvcmRJZDogcmVjb3JkLnJlY29yZElkLFxuICAgICAgICByZWNvcmREYXRhOiByZWNvcmQucmVjb3JkRGF0YVxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5fcmVjb3JkU2VsZWN0aW9uVHJpZ2dlci5uZXh0KHRhYmxlRXZlbnQpO1xuICB9XG5cbiAgbm90aWZ5U2VsZWN0aW9uQWN0aW9uKGFjdGlvbkNvZGUpIHtcbiAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUV2ZW50ID0ge1xuICAgICAgdGFibGVDb2RlOiB0aGlzLl90YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlLFxuICAgICAgYWN0aW9uRGV0YWlsOiB7XG4gICAgICAgIHNlbGVjdGVkUmVjb3JkczogdGhpcy5zZWxlY3RlZFJlY29yZHNcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuX3NlbGVjdGlvbkFjdGlvblRyaWdnZXIubmV4dCh0YWJsZUV2ZW50KTtcbiAgfVxuXG4gIG5vdGlmeUdldERhdGFBY3Rpb24ocmVxdWVzdGVkUGFnZSA9IG51bGwpIHtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gICAgdGhpcy5fcmVxdWVzdGVkUGFnZSA9IHJlcXVlc3RlZFBhZ2UgfHwgdGhpcy5fY3VycmVudFBhZ2UgfHwgMTtcbiAgICBjb25zdCB0YWJsZUV2ZW50OiBUYWJsZUV2ZW50ID0ge1xuICAgICAgdGFibGVDb2RlOiB0aGlzLl90YWJsZUNvZGUsXG4gICAgICBhY3Rpb25Db2RlOiBudWxsLFxuICAgICAgYWN0aW9uRGV0YWlsOiBudWxsLFxuICAgIH07XG4gICAgdGhpcy5fZ2V0RGF0YVRyaWdnZXIubmV4dCh0YWJsZUV2ZW50KTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIGNsZWFuKCkge1xuICAgIHRoaXMuX3RhYmxlUmVjb3JkcyA9IFtdO1xuICAgIHRoaXMudW5TZWxlY3RBbGwoKTtcbiAgICB0aGlzLl90YWJsZVJlY29yZE9iaiA9IHt9O1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIHNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWxsU2VsZWN0ZWQsIHRydWUpO1xuICAgIHRoaXMuX3RhYmxlUmVjb3Jkcy5mb3JFYWNoKHJlY29yZCA9PiByZWNvcmQuc2VsZWN0KCkpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5zZWxlY3RlZFJlY29yZHMsIHRoaXMuZ2V0U2VsZWN0ZWRSZWNvcmRzKCkpO1xuICAgIHJldHVybiB0cnVlO1xuXG4gIH1cblxuICB1blNlbGVjdEFsbCgpIHtcbiAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWxsU2VsZWN0ZWQsIGZhbHNlKTtcbiAgICB0aGlzLl90YWJsZVJlY29yZHMuZm9yRWFjaChyZWNvcmQgPT4gcmVjb3JkLnVuc2VsZWN0KCkpO1xuICAgIHRoaXMuc2V0QXR0cihhdHRycy5zZWxlY3RlZFJlY29yZHMsIHRoaXMuZ2V0U2VsZWN0ZWRSZWNvcmRzKCkpO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgc2V0VGFibGVSZWNvcmRzKHRhYmxlUmVjb3JkcywgYXBwZW5kID0gZmFsc2UsIHByZXBlbmQgPSBmYWxzZSkge1xuICAgIGlmICghYXBwZW5kKSB7XG4gICAgICB0aGlzLl90YWJsZVJlY29yZHMgPSBbXTtcbiAgICAgIHRoaXMuX3RhYmxlUmVjb3JkT2JqID0ge307XG4gICAgICB0aGlzLnNldEF0dHIoYXR0cnMuYWxsU2VsZWN0ZWQsIGZhbHNlKTtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5zZWxlY3RlZFJlY29yZHMsIFtdKTtcbiAgICB9XG4gICAgY29uc3QgbmV3UmVjb3Jkc09iaiA9IHsgLi4udGhpcy5fdGFibGVSZWNvcmRPYmogfTtcbiAgICBjb25zdCBuZXdSZWNvcmRzID0gWy4uLnRoaXMuX3RhYmxlUmVjb3Jkc107XG4gICAgZm9yIChjb25zdCB0YWJsZVJlY29yZCBvZiB0YWJsZVJlY29yZHMpIHtcbiAgICAgIHRhYmxlUmVjb3JkLnRhYmxlUmVjb3JkSWQgPSB0YWJsZVJlY29yZC50YWJsZVJlY29yZElkID8/IHRhYmxlUmVjb3JkLnJlY29yZElkID8/IHRhYmxlUmVjb3JkLnJlY29yZElkS2V5O1xuICAgICAgY29uc3QgcmVjb3JkUmVjZWl2ZWQ6IFRhYmxlUmVjb3JkRGF0YSA9IG5ldyBUYWJsZVJlY29yZERhdGEodGFibGVSZWNvcmQsIHRoaXMuX2NvbHVtbnMsIHRoaXMuX3NlbGVjdGlvbkZpZWxkKTtcbiAgICAgIGNvbnN0IHJlY29yZElkS2V5ID0gcmVjb3JkUmVjZWl2ZWQucmVjb3JkSWRLZXkgPz8gcmVjb3JkUmVjZWl2ZWQucmVjb3JkSWRLZXk7XG4gICAgICBpZiAobmV3UmVjb3Jkc09ialtyZWNvcmRJZEtleV0pIHtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgICBpZiAocHJlcGVuZCkge1xuICAgICAgICBuZXdSZWNvcmRzLnVuc2hpZnQocmVjb3JkUmVjZWl2ZWQpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgbmV3UmVjb3Jkcy5wdXNoKHJlY29yZFJlY2VpdmVkKTtcbiAgICAgIH1cbiAgICAgIG5ld1JlY29yZHNPYmpbcmVjb3JkSWRLZXldID0gcmVjb3JkUmVjZWl2ZWQ7XG4gICAgfVxuICAgIHRoaXMuX3RhYmxlUmVjb3JkcyA9IG5ld1JlY29yZHM7XG4gICAgdGhpcy5fdGFibGVSZWNvcmRPYmogPSBuZXdSZWNvcmRzT2JqO1xuICB9XG5cbiAgYXBwZW5kUmVjb3JkcyhyZWNvcmRzKSB7IHRoaXMuc2V0VGFibGVSZWNvcmRzKHJlY29yZHMsIHRydWUpOyB9XG4gIHByZXBlbmRSZWNvcmRzKHJlY29yZHMpIHsgdGhpcy5zZXRUYWJsZVJlY29yZHMocmVjb3JkcywgdHJ1ZSwgdHJ1ZSk7IH1cbiAgcmVwbGFjZVJlY29yZHMocmVjb3JkcykgeyB0aGlzLnNldFRhYmxlUmVjb3JkcyhyZWNvcmRzLCBmYWxzZSk7IH1cblxuICBzZXRUYWJsZUFwcGVuZChhcHBlbmQ6IGJvb2xlYW4pIHsgdGhpcy5fYXBwZW5kUGFnZXMgPSBhcHBlbmQgfVxuXG4gIGNoYW5nZVBhZ2UocmVxdWVzdGVkUGFnZSkge1xuICAgIGlmICh0aGlzLl9jbGllbnRQYWdpbmcpIHtcbiAgICAgIHRoaXMuc2V0QXR0cihhdHRycy5jdXJyZW50UGFnZSwgcmVxdWVzdGVkUGFnZSk7XG4gICAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMubm90aWZ5R2V0RGF0YUFjdGlvbihyZXF1ZXN0ZWRQYWdlKTtcbiAgICB9XG4gIH1cblxuICB1cGRhdGVWaXNpYmxlUmVjb3JkcygpIHtcbiAgICBsZXQgdmlzaWJsZVJlY29yZHM6IGFueVtdO1xuICAgIGlmICh0aGlzLl9jbGllbnRQYWdpbmcpIHtcbiAgICAgIHZpc2libGVSZWNvcmRzID0gdGhpcy5nZXRGaWx0ZXJlZFJlY29yZHMoKTtcbiAgICAgIC8vIFNlIHZhbGlkYSBzaSBsYSBww6FnaW5hIGFjdHVhbCBzaWd1ZSBzaWVuZG8gdsOhbGlkYVxuICAgICAgY29uc3QgdG90YWxSZWNvcmRzID0gdmlzaWJsZVJlY29yZHMubGVuZ3RoO1xuICAgICAgY29uc3QgcmVjb3Jkc0xhc3RQYWdlID0gdG90YWxSZWNvcmRzICUgdGhpcy5fcmVjb3Jkc1BlclBhZ2U7XG4gICAgICBjb25zdCB0b3RhbFBhZ2VzID0gTWF0aC50cnVuYyh0b3RhbFJlY29yZHMgLyB0aGlzLl9yZWNvcmRzUGVyUGFnZSArIChyZWNvcmRzTGFzdFBhZ2UgPyAxIDogMCkpO1xuICAgICAgaWYgKHRoaXMuX2N1cnJlbnRQYWdlID4gdG90YWxQYWdlcykge1xuICAgICAgICB0aGlzLl9jdXJyZW50UGFnZSA9IHRvdGFsUGFnZXMgfHwgMTtcbiAgICAgIH1cbiAgICAgIGNvbnN0IHNsaWNlTnVtYmVyMSA9ICh0aGlzLl9jdXJyZW50UGFnZSAtIDEpICogdGhpcy5fcmVjb3Jkc1BlclBhZ2U7XG4gICAgICBjb25zdCBzbGljZU51bWJlcjIgPSAodGhpcy5fY3VycmVudFBhZ2UgLSAxKSAqIHRoaXMuX3JlY29yZHNQZXJQYWdlICsgdGhpcy5fcmVjb3Jkc1BlclBhZ2VcbiAgICAgIHZpc2libGVSZWNvcmRzID0gdmlzaWJsZVJlY29yZHMuc2xpY2Uoc2xpY2VOdW1iZXIxLCBzbGljZU51bWJlcjIpO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLnRvdGFsUmVjb3Jkc051bWJlciwgdG90YWxSZWNvcmRzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdmlzaWJsZVJlY29yZHMgPSB0aGlzLl90YWJsZVJlY29yZHM7XG4gICAgfVxuICAgIHRoaXMuc2V0QXR0cihhdHRycy52aXNpYmxlUmVjb3JkcywgdmlzaWJsZVJlY29yZHMgPz8gW10pO1xuICB9XG5cbiAgdXBkYXRlRnJvbVNlcnZlcih0YWJsZVJlY2VpdmVkKSB7XG4gICAgdGhpcy5fcmVxdWVzdGVkUGFnZSA9IDE7XG4gICAgY29uc3QgeyB2aXNpYmxlID0gdHJ1ZSwgdG90YWxQYWdlcyA9IDEsIHJlY29yZHNOdW1iZXIsIGN1cnJlbnRQYWdlID0gMSwgcmVjb3Jkc1BlclBhZ2UsXG4gICAgICB0b3RhbFJlY29yZHNOdW1iZXIsIHNvcnRpbmdDb2x1bW4sIHNvcnRpbmdEaXJlY3Rpb24sIHRhYmxlUmVjb3JkcyxcbiAgICAgIGFjdGlvbnMsIGZpZWxkcyxcbiAgICB9ID0gdGFibGVSZWNlaXZlZDtcbiAgICB0aGlzLnZpc2libGUgPSB2aXNpYmxlO1xuICAgIGlmIChhY3Rpb25zKSB7XG4gICAgICBPYmplY3Qua2V5cyhhY3Rpb25zKS5mb3JFYWNoKGFjdGlvbkNvZGUgPT4ge1xuICAgICAgICBjb25zdCB0YmxBY3Rpb24gPSB0aGlzLmdldEFjdGlvbihhY3Rpb25Db2RlKTtcbiAgICAgICAgY29uc3QgYWN0aW9uUmVjZWl2ZWQgPSBhY3Rpb25zW2FjdGlvbkNvZGVdO1xuICAgICAgICBpZiAoYWN0aW9uUmVjZWl2ZWQudmlzaWJsZSA9PT0gdHJ1ZSB8fCBhY3Rpb25SZWNlaXZlZC52aXNpYmxlID09PSBmYWxzZSkge1xuICAgICAgICAgIChhY3Rpb25SZWNlaXZlZC52aXNpYmxlID09PSB0cnVlKSAmJiB0YmxBY3Rpb24uc2hvdygpO1xuICAgICAgICAgIChhY3Rpb25SZWNlaXZlZC52aXNpYmxlID09PSBmYWxzZSkgJiYgdGJsQWN0aW9uLmhpZGUoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uUmVjZWl2ZWQuZW5hYmxlZCA9PT0gdHJ1ZSB8fCBhY3Rpb25SZWNlaXZlZC5lbmFibGVkID09PSBmYWxzZSkge1xuICAgICAgICAgIChhY3Rpb25SZWNlaXZlZC5lbmFibGVkID09PSB0cnVlKSAmJiB0YmxBY3Rpb24uZW5hYmxlKCk7XG4gICAgICAgICAgKGFjdGlvblJlY2VpdmVkLmVuYWJsZWQgPT09IGZhbHNlKSAmJiB0YmxBY3Rpb24uZGlzYWJsZSgpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChhY3Rpb25SZWNlaXZlZC5zaG93T25TdGF0ZXMpIHtcbiAgICAgICAgICBhY3Rpb25SZWNlaXZlZC5zaG93T25TdGF0ZXM/LmZvckVhY2gobmV3U3RhdGUgPT4ge1xuICAgICAgICAgICAgdGJsQWN0aW9uLmFkZFZpc2libGVTdGF0ZShuZXdTdGF0ZSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGFjdGlvblJlY2VpdmVkLmhpZGVPblN0YXRlcykge1xuICAgICAgICAgIGFjdGlvblJlY2VpdmVkLmhpZGVPblN0YXRlcz8uZm9yRWFjaChuZXdTdGF0ZSA9PiB7XG4gICAgICAgICAgICB0YmxBY3Rpb24ucmVtb3ZlVmlzaWJsZVN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uUmVjZWl2ZWQuZW5hYmxlT25TdGF0ZXMpIHtcbiAgICAgICAgICBhY3Rpb25SZWNlaXZlZC5lbmFibGVPblN0YXRlcz8uZm9yRWFjaChuZXdTdGF0ZSA9PiB7XG4gICAgICAgICAgICB0YmxBY3Rpb24uYWRkRW5hYmxlZFN0YXRlKG5ld1N0YXRlKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoYWN0aW9uUmVjZWl2ZWQuZGlzYWJsZU9uU3RhdGVzKSB7XG4gICAgICAgICAgYWN0aW9uUmVjZWl2ZWQuZGlzYWJsZU9uU3RhdGVzPy5mb3JFYWNoKG5ld1N0YXRlID0+IHtcbiAgICAgICAgICAgIHRibEFjdGlvbi5yZW1vdmVFbmFibGVkU3RhdGUobmV3U3RhdGUpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9KTtcbiAgICB9XG4gICAgaWYgKGZpZWxkcykge1xuICAgICAgT2JqZWN0LmtleXMoZmllbGRzKS5mb3JFYWNoKGZpZWxkQ29kZSA9PiB7XG4gICAgICAgIGNvbnN0IHRibEZpZWxkID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uKGZpZWxkQ29kZSk7XG4gICAgICAgIGNvbnN0IGZpZWxkUmVjZWl2ZWQgPSBmaWVsZHNbZmllbGRDb2RlXTtcbiAgICAgICAgaWYgKGZpZWxkUmVjZWl2ZWQudmlzaWJsZSA9PT0gdHJ1ZSB8fCBmaWVsZFJlY2VpdmVkLnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgICAgKGZpZWxkUmVjZWl2ZWQudmlzaWJsZSA9PT0gdHJ1ZSkgJiYgdGJsRmllbGQuc2hvdygpO1xuICAgICAgICAgIChmaWVsZFJlY2VpdmVkLnZpc2libGUgPT09IGZhbHNlKSAmJiB0YmxGaWVsZC5oaWRlKCk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH1cbiAgICBpZiAodGFibGVSZWNvcmRzKSB7XG4gICAgICB0aGlzLl90b3RhbFBhZ2VzID0gdG90YWxQYWdlcztcbiAgICAgIHRoaXMuX3JlY29yZHNOdW1iZXIgPSByZWNvcmRzTnVtYmVyO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLmN1cnJlbnRQYWdlLCArY3VycmVudFBhZ2UpO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLnJlY29yZHNQZXJQYWdlLCArcmVjb3Jkc1BlclBhZ2UpO1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLnRvdGFsUmVjb3Jkc051bWJlciwgKHRoaXMuX2NsaWVudFBhZ2luZykgPyB0YWJsZVJlY29yZHMubGVuZ3RoIDogK3RvdGFsUmVjb3Jkc051bWJlcik7XG4gICAgICB0aGlzLnNldEF0dHIoYXR0cnMuc29ydGluZywge1xuICAgICAgICBjb2x1bW5OYW1lOiBzb3J0aW5nQ29sdW1uIHx8ICcnLFxuICAgICAgICBkaXJlY3Rpb246IHNvcnRpbmdEaXJlY3Rpb24gfHwgJydcbiAgICAgIH0pO1xuICAgICAgaWYgKCF0aGlzLl9hcHBlbmRQYWdlcykge1xuICAgICAgICB0aGlzLnJlcGxhY2VSZWNvcmRzKHRhYmxlUmVjb3Jkcyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmFwcGVuZFJlY29yZHModGFibGVSZWNvcmRzKTtcbiAgICAgIH1cbiAgICB9XG4gICAgdGhpcy5mcmVlV2FpdGluZygpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIGdldFRhYmxlUmVjb3JkKHJlY29yZElkKSB7XG4gICAgY29uc3QgcmVjb3JkSWRLZXkgPSAodHlwZW9mIHJlY29yZElkID09PSAnb2JqZWN0JykgPyBKU09OLnN0cmluZ2lmeShyZWNvcmRJZCkgOiByZWNvcmRJZDtcbiAgICByZXR1cm4gKHRoaXMuX3RhYmxlUmVjb3JkT2JqICYmIHJlY29yZElkICYmIHRoaXMuX3RhYmxlUmVjb3JkT2JqW3JlY29yZElkXSlcbiAgICAgID8gdGhpcy5fdGFibGVSZWNvcmRPYmpbcmVjb3JkSWRdIDogbnVsbDtcbiAgfVxuXG4gIGdldEFjdGlvbihhY3Rpb25Db2RlKSB7XG4gICAgcmV0dXJuICh0aGlzLl9hY3Rpb25zT2JqICYmIGFjdGlvbkNvZGUgJiYgdGhpcy5fYWN0aW9uc09ialthY3Rpb25Db2RlXSlcbiAgICAgID8gdGhpcy5fYWN0aW9uc09ialthY3Rpb25Db2RlXSA6IG51bGw7XG4gIH1cblxuICBnZXRBY3Rpb25zKGFjdGlvbkNsYXNzOiBzdHJpbmcgPSB0aGlzLl9mb3JtQ29uZmlnLnRhYmxlQWN0aW9ucy5pbmxpbmUsIGFjdGlvblR5cGVzOiBzdHJpbmdbXSA9IG51bGwpIHtcbiAgICByZXR1cm4gdGhpcy5fYWN0aW9ucy5maWx0ZXIoYWN0aW9uRGVmID0+IHtcbiAgICAgIGNvbnN0IHR5cGVJbmNsdWRlZCA9IChhY3Rpb25UeXBlcykgPyBhY3Rpb25UeXBlcy5pbmNsdWRlcyhhY3Rpb25EZWYuYWN0aW9uVHlwZSkgOiB0cnVlO1xuICAgICAgcmV0dXJuIGFjdGlvbkRlZi5hY3Rpb25DbGFzcyA9PT0gYWN0aW9uQ2xhc3MgJiYgdHlwZUluY2x1ZGVkO1xuICAgIH0pO1xuICB9XG5cbiAgLy8gRmlsdHJvc1xuXG4gIHNldEZpbHRlckJ5SWQoaWQpIHtcbiAgICBpZiAodGhpcy5yZXN0cmljdGVkSWQgPT09IGlkKSB7IHJldHVybjsgfVxuICAgIHRoaXMucmVzdHJpY3RlZElkID0gaWQ7XG4gICAgdGhpcy51cGRhdGVWaXNpYmxlUmVjb3JkcygpO1xuICB9XG5cbiAgY2xlYW5JZEZpbHRlcigpIHtcbiAgICBpZiAodGhpcy5yZXN0cmljdGVkSWQgPT09IG51bGwpIHsgcmV0dXJuOyB9XG4gICAgdGhpcy5yZXN0cmljdGVkSWQgPSBudWxsO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIHNldEdsb2JhbEZpbHRlclN0cmluZyh0ZXh0LCBub3RpZnlDb21wb25lbnQgPSB0cnVlKSB7XG4gICAgdGhpcy5nbG9iYWxGaWx0ZXJTdHJpbmdzID0gdGV4dC5zcGxpdCgnICcpLmZpbHRlcih0ID0+IHQgJiYgdC50cmltKCkubGVuZ3RoID4gMCkubWFwKHQgPT4gdC50cmltKCkpID8/IFtdO1xuICAgIGlmICh0aGlzLl9jbGllbnRQYWdpbmcpIHtcbiAgICAgIHRoaXMuY2hhbmdlUGFnZSgxKTtcbiAgICB9XG4gICAgaWYgKG5vdGlmeUNvbXBvbmVudCkge1xuICAgICAgdGhpcy5zZXRBdHRyKGF0dHJzLmdsb2JhbEZpbHRlclN0cmluZywgdGV4dC50cmltKCkpO1xuICAgIH1cbiAgfVxuXG4gIGFkZEZpbHRlckRlZmluaXRpb24oY29sdW1uTmFtZSwgZmlsdGVyRGVmaW5pdGlvbikge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uKGNvbHVtbk5hbWUpO1xuICAgIHRhYmxlQ29sdW1uICYmIHRhYmxlQ29sdW1uLmFkZEZpbHRlckRlZmluaXRpb24oZmlsdGVyRGVmaW5pdGlvbik7XG4gIH1cblxuICBnZXRGaWx0ZXJlZFJlY29yZHMoKSB7XG4gICAgbGV0IGZpbHRlcmVkUmVjb3JkcyA9IHRoaXMuX3RhYmxlUmVjb3JkcztcbiAgICBpZiAodGhpcy5yZXN0cmljdGVkSWQpIHtcbiAgICAgIGZpbHRlcmVkUmVjb3JkcyA9IGZpbHRlcmVkUmVjb3Jkcy5maWx0ZXIocmVjb3JkID0+IHJlY29yZC5yZWNvcmRJZCA9PT0gdGhpcy5yZXN0cmljdGVkSWQpO1xuICAgIH1cbiAgICBpZiAodGhpcy5nbG9iYWxGaWx0ZXJTdHJpbmdzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbHRlcmVkUmVjb3JkcyA9IGZpbHRlcmVkUmVjb3Jkcy5maWx0ZXIocmVjb3JkID0+IHJlY29yZC5oYXNQYXR0ZXJuKHRoaXMuZ2xvYmFsRmlsdGVyU3RyaW5ncywgdGhpcy5fdGFibGVDb2x1bW5PYmopKTtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uRmlsdGVycyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyKS5tYXAoY29sdW1uID0+IGNvbHVtbi5maWx0ZXIpO1xuICAgIGlmIChjb2x1bW5GaWx0ZXJzLmxlbmd0aCA+IDApIHtcbiAgICAgIGZpbHRlcmVkUmVjb3JkcyA9IGZpbHRlcmVkUmVjb3Jkcy5maWx0ZXIocmVjb3JkID0+IHJlY29yZC5oYXNDb25kaXRpb24oY29sdW1uRmlsdGVycykpO1xuICAgIH1cbiAgICByZXR1cm4gZmlsdGVyZWRSZWNvcmRzO1xuICB9XG5cbiAgZ2V0Q29sdW1uRmlsdGVyKGNvbHVtbk5hbWU6IHN0cmluZykge1xuICAgIGNvbnN0IHRhYmxlQ29sdW1uID0gdGhpcy5jb2x1bW5EZWZpbml0aW9uKGNvbHVtbk5hbWUpO1xuICAgIHJldHVybiB0YWJsZUNvbHVtbj8uZmlsdGVyID8/IG51bGw7XG4gIH1cblxuICBhZGRDb2x1bW5GaWx0ZXIoY29sdW1uTmFtZTogc3RyaW5nLCBjb2x1bW5WYWx1ZXM6IGFueSB8IGFueVtdLCBvcGVyYXRvcjogc3RyaW5nIHwgbnVsbCA9IG51bGwpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbihjb2x1bW5OYW1lKTtcbiAgICBjb25zdCBjb2x1bW5GaWx0ZXJEZWZpbml0aW9uID0gdGFibGVDb2x1bW4/LmZpbHRlckRlZmluaXRpb24gPz8gbnVsbDtcbiAgICBpZiAoIWNvbHVtbkZpbHRlckRlZmluaXRpb24pIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdGFibGVDb2x1bW4gJiYgdGFibGVDb2x1bW4uYWRkRmlsdGVyKGNvbHVtblZhbHVlcywgb3BlcmF0b3IpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIHJlbW92ZUNvbHVtbkZpbHRlcihjb2x1bW5OYW1lOiBzdHJpbmcpIHtcbiAgICBjb25zdCB0YWJsZUNvbHVtbiA9IHRoaXMuY29sdW1uRGVmaW5pdGlvbihjb2x1bW5OYW1lKTtcbiAgICB0YWJsZUNvbHVtbiAmJiB0YWJsZUNvbHVtbi5yZW1vdmVGaWx0ZXIoKTtcbiAgICB0aGlzLnVwZGF0ZVZpc2libGVSZWNvcmRzKCk7XG4gIH1cblxuICBnZXQgY3VycmVudEZpbHRlcigpIHtcbiAgICBjb25zdCBjb21wYWN0RmlsdGVyOiBhbnkgPSB7XG4gICAgICBzaW1wbGVGaWx0ZXJXb3JkczogdGhpcy5nbG9iYWxGaWx0ZXJTdHJpbmdzLFxuICAgICAgYWR2YW5jZWRGaWx0ZXI6IFtdLFxuICAgIH07XG4gICAgY29uc3QgY29sdW1uRmlsdGVycyA9IHRoaXMuX2NvbHVtbnMuZmlsdGVyKGNvbHVtbiA9PiBjb2x1bW4uZmlsdGVyKS5tYXAoY29sdW1uID0+IGNvbHVtbi5maWx0ZXIpO1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBjb2x1bW5GaWx0ZXJzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgY29uc3QgY29sdW1uRmlsdGVyID0gY29sdW1uRmlsdGVyc1tpbmRleF07XG4gICAgICBjb21wYWN0RmlsdGVyLmFkdmFuY2VkRmlsdGVyLnB1c2goe1xuICAgICAgICBmaWVsZENvZGU6IGNvbHVtbkZpbHRlcj8uZmllbGRDb2RlLFxuICAgICAgICBvcGVyYXRvcjogY29sdW1uRmlsdGVyPy5vcGVyYXRvcixcbiAgICAgICAgZmllbGRWYWx1ZTE6IGNvbHVtbkZpbHRlcj8udmFsdWVzWzBdLFxuICAgICAgICBmaWVsZFZhbHVlMjogY29sdW1uRmlsdGVyPy52YWx1ZXNbMV0sXG4gICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIGNvbXBhY3RGaWx0ZXI7XG4gIH1cblxuICAvLyBPcmRlbmFtaWVudG8gZGUgcmVnaXN0cm9zIGxvY2FsXG5cbiAgc29ydChjb2x1bW5OYW1lLCBkaXJlY3Rpb24pIHtcbiAgICB0aGlzLnNldFJlcXVpcmVkT3JkZXIoY29sdW1uTmFtZSwgZGlyZWN0aW9uKTtcbiAgICBpZiAodGhpcy5fY2xpZW50UGFnaW5nKSB7XG4gICAgICB0aGlzLmxvY2FsU29ydERhdGEoKVxuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLm5vdGlmeUdldERhdGFBY3Rpb24oKTtcbiAgICB9XG4gIH1cblxuICBzZXRSZXF1aXJlZE9yZGVyKGNvbHVtbkZpZWxkLCBkaXJlY3Rpb24gPSBudWxsKSB7XG4gICAgdGhpcy5zZXRBdHRyKGF0dHJzLnNvcnRpbmcsIHtcbiAgICAgIGNvbHVtbk5hbWU6IGNvbHVtbkZpZWxkLFxuICAgICAgZGlyZWN0aW9uOiAoZGlyZWN0aW9uID09PSAnYXNjZW5kJykgPyBUQUJMRV9TT1JUX0FTQ0VORElORyA6IFRBQkxFX1NPUlRfREVTQ0VORElORyxcbiAgICB9KTtcbiAgfVxuXG4gIGxvY2FsU29ydERhdGEoKSB7XG4gICAgaWYgKCF0aGlzLl9zb3J0aW5nLmNvbHVtbk5hbWUgfHwgIXRoaXMuX3NvcnRpbmcuZGlyZWN0aW9uKSB7IHJldHVybjsgfVxuICAgIHRoaXMuX3RhYmxlUmVjb3Jkcy5zb3J0KChhLCBiKSA9PiB0aGlzLnJlY29yZENvbXBhcmUoYSwgYiwgdGhpcy5fc29ydGluZy5jb2x1bW5OYW1lLCB0aGlzLl9zb3J0aW5nLmRpcmVjdGlvbikpO1xuICAgIC8vdGhpcy51blNlbGVjdEFsbCgpO1xuICAgIHRoaXMudXBkYXRlVmlzaWJsZVJlY29yZHMoKTtcbiAgfVxuXG4gIHJlY29yZENvbXBhcmUocmVjb3JkQTogVGFibGVSZWNvcmREYXRhLCByZWNvcmRCOiBUYWJsZVJlY29yZERhdGEsIGNvbHVtbkNvbXBhcmUsIGRpcmVjdGlvbikge1xuICAgIGNvbnN0IHJlY29yZEFWYWx1ZSA9IHJlY29yZEEuZ2V0RmllbGRWYWx1ZShjb2x1bW5Db21wYXJlKTtcbiAgICBjb25zdCByZWNvcmRCVmFsdWUgPSByZWNvcmRCLmdldEZpZWxkVmFsdWUoY29sdW1uQ29tcGFyZSk7XG4gICAgY29uc3QgcmVjb3JkQUNvbHVtbiA9IGlzTmFOKHJlY29yZEFWYWx1ZSkgPyByZWNvcmRBVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSA6ICtyZWNvcmRBVmFsdWU7XG4gICAgY29uc3QgcmVjb3JkQkNvbHVtbiA9IGlzTmFOKHJlY29yZEJWYWx1ZSkgPyByZWNvcmRCVmFsdWUudG9Mb2NhbGVMb3dlckNhc2UoKSA6ICtyZWNvcmRCVmFsdWU7XG4gICAgbGV0IHJlc3VsdCA9IDA7XG4gICAgaWYgKHJlY29yZEFDb2x1bW4gPCByZWNvcmRCQ29sdW1uKSB7XG4gICAgICByZXN1bHQgPSAtMTtcbiAgICB9IGVsc2UgaWYgKHJlY29yZEFDb2x1bW4gPiByZWNvcmRCQ29sdW1uKSB7XG4gICAgICByZXN1bHQgPSAxO1xuICAgIH1cbiAgICByZXR1cm4gZGlyZWN0aW9uID09PSBUQUJMRV9TT1JUX0FTQ0VORElORyA/IHJlc3VsdCA6IC1yZXN1bHQ7XG4gIH1cblxuICBvdmVycmlkZSBmb3JtU3RhdGVDaGFuZ2VDdXN0b21TdWJzY3JpYmUoZm9ybSwgZm9ybUNoYW5nZVN1YmplY3QpIHtcbiAgICB0aGlzLl9jb2x1bW5zPy5mb3JFYWNoKGNvbHVtbiA9PiB7XG4gICAgICBjb2x1bW4/LmNvbm5lY3RXaXRoUGFyZW50Rm9ybShmb3JtLCBmb3JtQ2hhbmdlU3ViamVjdCk7XG4gICAgfSk7XG4gICAgdGhpcy5fYWN0aW9ucz8uZm9yRWFjaChhY3Rpb24gPT4ge1xuICAgICAgYWN0aW9uPy5jb25uZWN0V2l0aFBhcmVudEZvcm0oZm9ybSwgZm9ybUNoYW5nZVN1YmplY3QpO1xuICAgIH0pO1xuICB9XG59XG4iXX0=