@universis/ngx-tables 6.14.2 → 9.14.2

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 (101) hide show
  1. package/bundles/universis-ngx-tables.umd.js +4902 -6847
  2. package/bundles/universis-ngx-tables.umd.js.map +1 -1
  3. package/bundles/universis-ngx-tables.umd.min.js +15 -1
  4. package/bundles/universis-ngx-tables.umd.min.js.map +1 -1
  5. package/esm2015/lib/actions/table.actions.js +7 -49
  6. package/esm2015/lib/advanced-aggregator.js +0 -5
  7. package/esm2015/lib/components/add-items/add-items.component.js +36 -96
  8. package/esm2015/lib/components/advanced-aggregator/advanced-aggregator.component.js +48 -103
  9. package/esm2015/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +36 -58
  10. package/esm2015/lib/components/advanced-list/advanced-list.component.js +67 -120
  11. package/esm2015/lib/components/advanced-row-action/advanced-row-action.component.js +61 -118
  12. package/esm2015/lib/components/advanced-search-form/advanced-search-form.component.js +47 -99
  13. package/esm2015/lib/components/advanced-select/advanced-select.component.js +25 -58
  14. package/esm2015/lib/components/advanced-select/advanced-select.service.js +10 -27
  15. package/esm2015/lib/components/advanced-table/advanced-filter-value-provider.service.js +13 -36
  16. package/esm2015/lib/components/advanced-table/advanced-table-resolvers.js +22 -50
  17. package/esm2015/lib/components/advanced-table/advanced-table-search-base.js +15 -37
  18. package/esm2015/lib/components/advanced-table/advanced-table-search.component.js +55 -227
  19. package/esm2015/lib/components/advanced-table/advanced-table-settings.component.js +23 -96
  20. package/esm2015/lib/components/advanced-table/advanced-table.component.js +303 -688
  21. package/esm2015/lib/components/advanced-table/advanced-table.formatters.interface.js +1 -10
  22. package/esm2015/lib/components/advanced-table/advanced-table.formatters.js +19 -230
  23. package/esm2015/lib/components/advanced-table/advanced-table.interfaces.js +0 -5
  24. package/esm2015/lib/components/advanced-table/custom-button.formatter.js +3 -17
  25. package/esm2015/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +77 -198
  26. package/esm2015/lib/components/column-selector/column-selector.component.js +39 -109
  27. package/esm2015/lib/components/column-selector/column-selector.service.js +9 -26
  28. package/esm2015/lib/components/table-simple-header/table-simple-header.component.js +28 -51
  29. package/esm2015/lib/directives/advance-search-state.directive.js +22 -54
  30. package/esm2015/lib/directives/advance-table-state.directive.js +20 -39
  31. package/esm2015/lib/directives/advanced-search-router-state.directive.js +15 -37
  32. package/esm2015/lib/directives/advanced-table-editor.directive.js +24 -54
  33. package/esm2015/lib/directives/btnexp.directive.js +55 -97
  34. package/esm2015/lib/i18n/tables.el.js +3 -7
  35. package/esm2015/lib/i18n/tables.en.js +3 -7
  36. package/esm2015/lib/pipes/advanced-aggregator.pipe.js +15 -18
  37. package/esm2015/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +13 -25
  38. package/esm2015/lib/reducers/index.js +7 -37
  39. package/esm2015/lib/services/advanced-aggregator/advanced-aggregator.service.js +27 -48
  40. package/esm2015/lib/tables.activated-table.service.js +11 -46
  41. package/esm2015/lib/tables.module.js +90 -105
  42. package/esm2015/public_api.js +29 -34
  43. package/esm2015/universis-ngx-tables.js +2 -7
  44. package/esm5/lib/actions/table.actions.js +7 -38
  45. package/esm5/lib/advanced-aggregator.js +0 -5
  46. package/esm5/lib/components/add-items/add-items.component.js +42 -127
  47. package/esm5/lib/components/advanced-aggregator/advanced-aggregator.component.js +58 -141
  48. package/esm5/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.js +32 -71
  49. package/esm5/lib/components/advanced-list/advanced-list.component.js +67 -136
  50. package/esm5/lib/components/advanced-row-action/advanced-row-action.component.js +62 -139
  51. package/esm5/lib/components/advanced-search-form/advanced-search-form.component.js +45 -116
  52. package/esm5/lib/components/advanced-select/advanced-select.component.js +23 -57
  53. package/esm5/lib/components/advanced-select/advanced-select.service.js +8 -27
  54. package/esm5/lib/components/advanced-table/advanced-filter-value-provider.service.js +15 -50
  55. package/esm5/lib/components/advanced-table/advanced-table-resolvers.js +18 -52
  56. package/esm5/lib/components/advanced-table/advanced-table-search-base.js +17 -48
  57. package/esm5/lib/components/advanced-table/advanced-table-search.component.js +84 -329
  58. package/esm5/lib/components/advanced-table/advanced-table-settings.component.js +27 -116
  59. package/esm5/lib/components/advanced-table/advanced-table.component.js +324 -863
  60. package/esm5/lib/components/advanced-table/advanced-table.formatters.interface.js +1 -10
  61. package/esm5/lib/components/advanced-table/advanced-table.formatters.js +58 -393
  62. package/esm5/lib/components/advanced-table/advanced-table.interfaces.js +0 -5
  63. package/esm5/lib/components/advanced-table/custom-button.formatter.js +6 -27
  64. package/esm5/lib/components/advanced-table-modal/advanced-table-modal-base.component.js +90 -296
  65. package/esm5/lib/components/column-selector/column-selector.component.js +46 -143
  66. package/esm5/lib/components/column-selector/column-selector.service.js +7 -26
  67. package/esm5/lib/components/table-simple-header/table-simple-header.component.js +26 -61
  68. package/esm5/lib/directives/advance-search-state.directive.js +24 -74
  69. package/esm5/lib/directives/advance-table-state.directive.js +17 -37
  70. package/esm5/lib/directives/advanced-search-router-state.directive.js +13 -43
  71. package/esm5/lib/directives/advanced-table-editor.directive.js +31 -81
  72. package/esm5/lib/directives/btnexp.directive.js +43 -175
  73. package/esm5/lib/i18n/tables.el.js +3 -7
  74. package/esm5/lib/i18n/tables.en.js +3 -7
  75. package/esm5/lib/pipes/advanced-aggregator.pipe.js +9 -35
  76. package/esm5/lib/pipes/advansed-aggregator-list-title-parse.pipe.js +9 -36
  77. package/esm5/lib/reducers/index.js +8 -38
  78. package/esm5/lib/services/advanced-aggregator/advanced-aggregator.service.js +21 -82
  79. package/esm5/lib/tables.activated-table.service.js +10 -42
  80. package/esm5/lib/tables.module.js +89 -105
  81. package/esm5/public_api.js +29 -34
  82. package/esm5/universis-ngx-tables.js +2 -7
  83. package/fesm2015/universis-ngx-tables.js +1177 -2186
  84. package/fesm2015/universis-ngx-tables.js.map +1 -1
  85. package/fesm5/universis-ngx-tables.js +1235 -3067
  86. package/fesm5/universis-ngx-tables.js.map +1 -1
  87. package/lib/actions/table.actions.d.ts +3 -3
  88. package/lib/components/add-items/add-items.component.d.ts +1 -1
  89. package/lib/components/advanced-aggregator/advanced-aggregator.component.d.ts +7 -4
  90. package/lib/components/advanced-aggregator-list/advanced-aggregator-list.component.d.ts +1 -1
  91. package/lib/components/advanced-row-action/advanced-row-action.component.d.ts +1 -1
  92. package/lib/components/advanced-table/advanced-table-search-base.d.ts +3 -2
  93. package/lib/components/advanced-table/advanced-table-search.component.d.ts +3 -2
  94. package/lib/components/advanced-table/advanced-table.component.d.ts +13 -8
  95. package/lib/directives/advanced-table-editor.directive.d.ts +1 -1
  96. package/lib/i18n/tables.el.d.ts +108 -108
  97. package/lib/i18n/tables.en.d.ts +107 -107
  98. package/lib/reducers/index.d.ts +3 -3
  99. package/lib/tables.activated-table.service.d.ts +2 -1
  100. package/package.json +20 -31
  101. package/universis-ngx-tables.metadata.json +1 -1
@@ -1,9 +1,5 @@
1
- /**
2
- * @fileoverview added by tsickle
3
- * @suppress {checkTypes,extraRequire,uselessCode} checked by tsc
4
- */
5
- import * as tslib_1 from "tslib";
6
- import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, InjectionToken, Injector, Input, Output, ViewChild, ViewEncapsulation, TemplateRef, ViewContainerRef, ErrorHandler, Optional } from '@angular/core';
1
+ import { __awaiter, __decorate, __extends, __generator, __param, __read, __spread } from "tslib";
2
+ import { ChangeDetectorRef, Component, ElementRef, EventEmitter, Inject, InjectionToken, Injector, Input, OnDestroy, OnInit, Output, ViewChild, ViewEncapsulation, OnChanges, SimpleChanges, ContentChild, TemplateRef, ViewContainerRef, AfterViewInit, ErrorHandler, Optional } from '@angular/core';
7
3
  import { AngularDataContext } from '@themost/angular';
8
4
  import { TranslatePipe, TranslateService } from '@ngx-translate/core';
9
5
  import { ActivatedRoute } from '@angular/router';
@@ -12,10 +8,11 @@ import { ClientDataQueryable } from '@themost/client';
12
8
  import { AdvancedFilterValueProvider } from './advanced-filter-value-provider.service';
13
9
  import { BehaviorSubject } from 'rxjs';
14
10
  import { TemplatePipe, LoadingService, ConfigurationService, ModalService, DIALOG_BUTTONS, ErrorService, ExportSpreadsheetService } from '@universis/common';
11
+ // important note: use this import to avoid Cannot call a namespace ('jquery') error
15
12
  import * as jQuery_ from 'jquery';
16
13
  import 'datatables.net';
17
14
  import { template } from 'lodash';
18
- import 'datatables.net-rowgroup';
15
+ import 'datatables.net-rowgroup'; // this plugin import line must come before the following datatables plugin imports
19
16
  import 'datatables.net-scroller';
20
17
  import 'datatables.net-colreorder';
21
18
  import 'datatables.net-buttons';
@@ -23,19 +20,8 @@ import 'datatables.net-fixedcolumns';
23
20
  import { HttpClient } from '@angular/common/http';
24
21
  import { ColumnSelectorService } from '../column-selector/column-selector.service';
25
22
  import { MAX_EXPORT_ITEMS } from '../../directives/btnexp.directive';
26
- /** @type {?} */
23
+ // restore jquery import to avoid Cannot call a namespace ('jquery') error
27
24
  var jQuery = jQuery_;
28
- /**
29
- * @record
30
- */
31
- export function AdvancedTableDataResult() { }
32
- /** @type {?} */
33
- AdvancedTableDataResult.prototype.recordsTotal;
34
- /** @type {?} */
35
- AdvancedTableDataResult.prototype.recordsFiltered;
36
- /** @type {?} */
37
- AdvancedTableDataResult.prototype.data;
38
- /** @type {?} */
39
25
  var DataTablesApi = jQuery.fn.dataTable.Api;
40
26
  DataTablesApi.register('processing()', function (show) {
41
27
  return this.iterator('table', function (ctx) {
@@ -43,63 +29,31 @@ DataTablesApi.register('processing()', function (show) {
43
29
  });
44
30
  });
45
31
  var ɵ0 = [];
46
- /** @type {?} */
47
32
  var EMPTY_DATASET = {
48
33
  recordsTotal: 0,
49
34
  recordsFiltered: 0,
50
35
  data: ɵ0,
51
36
  };
52
37
  var TableTranslationChangeDetector = /** @class */ (function (_super) {
53
- tslib_1.__extends(TableTranslationChangeDetector, _super);
38
+ __extends(TableTranslationChangeDetector, _super);
54
39
  function TableTranslationChangeDetector() {
55
40
  return _super !== null && _super.apply(this, arguments) || this;
56
41
  }
57
- /**
58
- * @return {?}
59
- */
60
- TableTranslationChangeDetector.prototype.checkNoChanges = /**
61
- * @return {?}
62
- */
63
- function () {
42
+ TableTranslationChangeDetector.prototype.checkNoChanges = function () {
64
43
  };
65
- /**
66
- * @return {?}
67
- */
68
- TableTranslationChangeDetector.prototype.detach = /**
69
- * @return {?}
70
- */
71
- function () {
44
+ TableTranslationChangeDetector.prototype.detach = function () {
72
45
  };
73
- /**
74
- * @return {?}
75
- */
76
- TableTranslationChangeDetector.prototype.detectChanges = /**
77
- * @return {?}
78
- */
79
- function () {
46
+ TableTranslationChangeDetector.prototype.detectChanges = function () {
80
47
  };
81
- /**
82
- * @return {?}
83
- */
84
- TableTranslationChangeDetector.prototype.markForCheck = /**
85
- * @return {?}
86
- */
87
- function () {
48
+ TableTranslationChangeDetector.prototype.markForCheck = function () {
88
49
  };
89
- /**
90
- * @return {?}
91
- */
92
- TableTranslationChangeDetector.prototype.reattach = /**
93
- * @return {?}
94
- */
95
- function () {
50
+ TableTranslationChangeDetector.prototype.reattach = function () {
96
51
  };
97
52
  return TableTranslationChangeDetector;
98
53
  }(ChangeDetectorRef));
99
- /** @type {?} */
100
54
  export var COLUMN_FORMATTERS = new InjectionToken('column.formatters');
101
55
  var ExportLimitExceededError = /** @class */ (function (_super) {
102
- tslib_1.__extends(ExportLimitExceededError, _super);
56
+ __extends(ExportLimitExceededError, _super);
103
57
  function ExportLimitExceededError(message) {
104
58
  var _this = _super.call(this, message) || this;
105
59
  _this.name = 'ExportLimitExceededError';
@@ -109,80 +63,25 @@ var ExportLimitExceededError = /** @class */ (function (_super) {
109
63
  }(RangeError));
110
64
  export { ExportLimitExceededError };
111
65
  var ColumnFormatter = /** @class */ (function (_super) {
112
- tslib_1.__extends(ColumnFormatter, _super);
66
+ __extends(ColumnFormatter, _super);
113
67
  function ColumnFormatter(injector) {
114
68
  var _this = _super.call(this) || this;
115
69
  _this.injector = injector;
116
70
  _this.title = '';
117
71
  return _this;
118
72
  }
119
- /**
120
- * @param {?} data
121
- * @param {?} type
122
- * @param {?} row
123
- * @param {?} meta
124
- * @return {?}
125
- */
126
- ColumnFormatter.prototype.render = /**
127
- * @param {?} data
128
- * @param {?} type
129
- * @param {?} row
130
- * @param {?} meta
131
- * @return {?}
132
- */
133
- function (data, type, row, meta) {
73
+ ColumnFormatter.prototype.render = function (data, type, row, meta) {
134
74
  //
135
75
  };
136
76
  return ColumnFormatter;
137
77
  }(AdvancedColumnFormatter));
138
- if (false) {
139
- /** @type {?} */
140
- ColumnFormatter.prototype.class;
141
- /** @type {?} */
142
- ColumnFormatter.prototype.className;
143
- /** @type {?} */
144
- ColumnFormatter.prototype.defaultContent;
145
- /** @type {?} */
146
- ColumnFormatter.prototype.formatString;
147
- /** @type {?} */
148
- ColumnFormatter.prototype.formatter;
149
- /** @type {?} */
150
- ColumnFormatter.prototype.hidden;
151
- /** @type {?} */
152
- ColumnFormatter.prototype.name;
153
- /** @type {?} */
154
- ColumnFormatter.prototype.order;
155
- /** @type {?} */
156
- ColumnFormatter.prototype.property;
157
- /** @type {?} */
158
- ColumnFormatter.prototype.sortable;
159
- /** @type {?} */
160
- ColumnFormatter.prototype.title;
161
- /** @type {?} */
162
- ColumnFormatter.prototype.injector;
163
- }
164
- /**
165
- * @template T
166
- * @param {?} input
167
- * @return {?}
168
- */
169
78
  function forceCast(input) {
170
79
  return input;
171
80
  }
172
81
  var AdvancedTableConfiguration = /** @class */ (function () {
173
82
  function AdvancedTableConfiguration() {
174
83
  }
175
- /**
176
- * @param {?} input
177
- * @param {?=} clone
178
- * @return {?}
179
- */
180
- AdvancedTableConfiguration.cast = /**
181
- * @param {?} input
182
- * @param {?=} clone
183
- * @return {?}
184
- */
185
- function (input, clone) {
84
+ AdvancedTableConfiguration.cast = function (input, clone) {
186
85
  if (clone) {
187
86
  return forceCast(JSON.parse(JSON.stringify(input)));
188
87
  }
@@ -191,9 +90,6 @@ var AdvancedTableConfiguration = /** @class */ (function () {
191
90
  return AdvancedTableConfiguration;
192
91
  }());
193
92
  export { AdvancedTableConfiguration };
194
- /**
195
- * @return {?}
196
- */
197
93
  function getRandomIdentifier() {
198
94
  return (Number(String(Math.random()).slice(2))).toString(36);
199
95
  }
@@ -279,21 +175,13 @@ var AdvancedTableComponent = /** @class */ (function () {
279
175
  });
280
176
  }
281
177
  Object.defineProperty(AdvancedTableComponent.prototype, "config", {
282
- get: /**
283
- * @return {?}
284
- */
285
- function () {
286
- return /** @type {?} */ (this._config);
178
+ get: function () {
179
+ return this._config;
287
180
  },
288
181
  /**
289
182
  * Gets or sets table configuration
290
183
  */
291
- set: /**
292
- * Gets or sets table configuration
293
- * @param {?} value
294
- * @return {?}
295
- */
296
- function (value) {
184
+ set: function (value) {
297
185
  this._config = value;
298
186
  // raise subscription
299
187
  this.configChanges.next(this._config);
@@ -302,36 +190,24 @@ var AdvancedTableComponent = /** @class */ (function () {
302
190
  configurable: true
303
191
  });
304
192
  Object.defineProperty(AdvancedTableComponent.prototype, "lastQueryTotalItems", {
305
- get: /**
306
- * @return {?}
307
- */
308
- function () {
193
+ get: function () {
309
194
  return this._lastQueryTotalItems;
310
195
  },
311
196
  enumerable: true,
312
197
  configurable: true
313
198
  });
314
199
  Object.defineProperty(AdvancedTableComponent.prototype, "showFooter", {
315
- get: /**
316
- * @return {?}
317
- */
318
- function () {
200
+ get: function () {
319
201
  return this._showFooter;
320
202
  },
321
203
  /**
322
204
  * Indicates whether table footer will be visible or not
323
205
  */
324
- set: /**
325
- * Indicates whether table footer will be visible or not
326
- * @param {?} value
327
- * @return {?}
328
- */
329
- function (value) {
206
+ set: function (value) {
330
207
  this._showFooter = value;
331
208
  // show or hide footer
332
209
  if (this._element && this._element.nativeElement) {
333
- /** @type {?} */
334
- var element = (/** @type {?} */ (this._element.nativeElement))
210
+ var element = this._element.nativeElement
335
211
  .querySelector('.dataTables_info');
336
212
  if (element == null) {
337
213
  return;
@@ -348,32 +224,22 @@ var AdvancedTableComponent = /** @class */ (function () {
348
224
  configurable: true
349
225
  });
350
226
  Object.defineProperty(AdvancedTableComponent.prototype, "showHeader", {
351
- get: /**
352
- * @return {?}
353
- */
354
- function () {
227
+ get: function () {
355
228
  return this._showHeader;
356
229
  },
357
230
  /**
358
231
  * Indicates whether table footer will be visible or not
359
232
  */
360
- set: /**
361
- * Indicates whether table footer will be visible or not
362
- * @param {?} value
363
- * @return {?}
364
- */
365
- function (value) {
233
+ set: function (value) {
366
234
  this._showHeader = value;
367
235
  // show or hide footer
368
236
  if (this._element && this._element.nativeElement) {
369
- /** @type {?} */
370
- var element = (/** @type {?} */ (this._element.nativeElement))
237
+ var element = this._element.nativeElement
371
238
  .querySelector('.dataTable>thead');
372
239
  if (element == null) {
373
240
  return;
374
241
  }
375
- /** @type {?} */
376
- var dataTable = (/** @type {?} */ (this._element.nativeElement)).querySelector('.dataTable');
242
+ var dataTable = this._element.nativeElement.querySelector('.dataTable');
377
243
  if (dataTable == null) {
378
244
  return;
379
245
  }
@@ -393,26 +259,17 @@ var AdvancedTableComponent = /** @class */ (function () {
393
259
  configurable: true
394
260
  });
395
261
  Object.defineProperty(AdvancedTableComponent.prototype, "showPaging", {
396
- get: /**
397
- * @return {?}
398
- */
399
- function () {
262
+ get: function () {
400
263
  return this._showPaging;
401
264
  },
402
265
  /**
403
266
  * Indicates whether paging information will be visible or not
404
267
  */
405
- set: /**
406
- * Indicates whether paging information will be visible or not
407
- * @param {?} value
408
- * @return {?}
409
- */
410
- function (value) {
268
+ set: function (value) {
411
269
  this._showPaging = value;
412
270
  // show or hide footer
413
271
  if (this._element && this._element.nativeElement) {
414
- /** @type {?} */
415
- var element = (/** @type {?} */ (this._element.nativeElement))
272
+ var element = this._element.nativeElement
416
273
  .querySelector('.dataTables_paginate');
417
274
  if (element == null) {
418
275
  return;
@@ -429,35 +286,20 @@ var AdvancedTableComponent = /** @class */ (function () {
429
286
  configurable: true
430
287
  });
431
288
  Object.defineProperty(AdvancedTableComponent.prototype, "query", {
432
- get: /**
433
- * @return {?}
434
- */
435
- function () {
436
- return /** @type {?} */ (this._query);
289
+ get: function () {
290
+ return this._query;
437
291
  },
438
292
  /**
439
293
  * Gets or sets an active query for this table
440
294
  */
441
- set: /**
442
- * Gets or sets an active query for this table
443
- * @param {?} value
444
- * @return {?}
445
- */
446
- function (value) {
295
+ set: function (value) {
447
296
  this._query = value;
448
297
  },
449
298
  enumerable: true,
450
299
  configurable: true
451
300
  });
452
- /**
453
- * @param {?} searchText
454
- * @return {?}
455
- */
456
- AdvancedTableComponent.prototype.search = /**
457
- * @param {?} searchText
458
- * @return {?}
459
- */
460
- function (searchText) {
301
+ // simple search
302
+ AdvancedTableComponent.prototype.search = function (searchText) {
461
303
  var _this = this;
462
304
  this.query = this.query || this._context.model(this.config.model).asQueryable();
463
305
  if (this.serverSide) {
@@ -469,11 +311,11 @@ var AdvancedTableComponent = /** @class */ (function () {
469
311
  }));
470
312
  }
471
313
  else {
472
- /** @type {?} */
314
+ // try to split words
473
315
  var words = searchText.split(' ');
474
- /** @type {?} */
316
+ // join words to a single filter
475
317
  var filter = words.map(function (word) {
476
- return _this._template.transform(/** @type {?} */ ((_this.config && _this.config.searchExpression)), {
318
+ return _this._template.transform((_this.config && _this.config.searchExpression), {
477
319
  text: word,
478
320
  });
479
321
  }).join(' and ');
@@ -493,16 +335,15 @@ var AdvancedTableComponent = /** @class */ (function () {
493
335
  this.resetEmptyTable();
494
336
  // search locally
495
337
  this.dataTable.search(searchText.trim()).draw();
496
- /** @type {?} */
338
+ // get indexes of filtered rows
497
339
  var indexes = Array.from(this.dataTable.context[0].aiDisplay);
498
- /** @type {?} */
340
+ // set recordsFiltered
499
341
  var recordsFiltered = indexes.length;
500
- /** @type {?} */
342
+ // set recordsTotal
501
343
  var recordsTotal = indexes.length;
502
- /** @type {?} */
344
+ // retrieve data from indexes
503
345
  var rows_1 = Array.from(this.dataTable.rows().data());
504
- /** @type {?} */
505
- var data = indexes.map(function (index) { return rows_1[/** @type {?} */ (index)]; });
346
+ var data = indexes.map(function (index) { return rows_1[index]; });
506
347
  // emit results to load output
507
348
  this.load.emit({
508
349
  data: data,
@@ -511,15 +352,7 @@ var AdvancedTableComponent = /** @class */ (function () {
511
352
  });
512
353
  }
513
354
  };
514
- /**
515
- * @param {?=} clearSelected
516
- * @return {?}
517
- */
518
- AdvancedTableComponent.prototype.fetch = /**
519
- * @param {?=} clearSelected
520
- * @return {?}
521
- */
522
- function (clearSelected) {
355
+ AdvancedTableComponent.prototype.fetch = function (clearSelected) {
523
356
  // if data table is null
524
357
  if (this.dataTable == null) {
525
358
  // initialize data table
@@ -541,13 +374,7 @@ var AdvancedTableComponent = /** @class */ (function () {
541
374
  // otherwise load data only
542
375
  this.dataTable.draw();
543
376
  };
544
- /**
545
- * @return {?}
546
- */
547
- AdvancedTableComponent.prototype.destroy = /**
548
- * @return {?}
549
- */
550
- function () {
377
+ AdvancedTableComponent.prototype.destroy = function () {
551
378
  if (this.dataTable) {
552
379
  this.dataTable.destroy();
553
380
  this._firstLoad = true;
@@ -569,19 +396,10 @@ var AdvancedTableComponent = /** @class */ (function () {
569
396
  };
570
397
  /**
571
398
  * Selects the specified data row
572
- * @param {?} row
573
- * @param {?=} silent
574
- * @return {?}
575
399
  */
576
- AdvancedTableComponent.prototype.selectRow = /**
577
- * Selects the specified data row
578
- * @param {?} row
579
- * @param {?=} silent
580
- * @return {?}
581
- */
582
- function (row, silent) {
400
+ AdvancedTableComponent.prototype.selectRow = function (row, silent) {
583
401
  if (row) {
584
- /** @type {?} */
402
+ // get row
585
403
  var rowNode_1 = row.node();
586
404
  // if multiple select is false
587
405
  if (this.multipleSelect === false) {
@@ -611,11 +429,10 @@ var AdvancedTableComponent = /** @class */ (function () {
611
429
  // otherwise add class
612
430
  jQuery(row.node()).addClass('selected');
613
431
  }
614
- /** @type {?} */
432
+ // get row data
615
433
  var key_1 = this.config.columns[0].property || this.config.columns[0].name || '';
616
- /** @type {?} */
617
434
  var data_1 = row.data();
618
- /** @type {?} */
435
+ // search selected items
619
436
  var findIndex = this.selected.findIndex(function (x) {
620
437
  return x[key_1] === data_1[key_1];
621
438
  });
@@ -640,17 +457,8 @@ var AdvancedTableComponent = /** @class */ (function () {
640
457
  };
641
458
  /**
642
459
  * Unselects the specified data row if it's selected
643
- * @param {?} row
644
- * @param {?=} silent
645
- * @return {?}
646
- */
647
- AdvancedTableComponent.prototype.unSelectRow = /**
648
- * Unselects the specified data row if it's selected
649
- * @param {?} row
650
- * @param {?=} silent
651
- * @return {?}
652
460
  */
653
- function (row, silent) {
461
+ AdvancedTableComponent.prototype.unSelectRow = function (row, silent) {
654
462
  if (row) {
655
463
  // if custom select mode is off
656
464
  if (this.customSelect === false) {
@@ -660,13 +468,10 @@ var AdvancedTableComponent = /** @class */ (function () {
660
468
  // otherwise add class
661
469
  jQuery(row.node()).removeClass('selected');
662
470
  }
663
- /** @type {?} */
471
+ // get first column key
664
472
  var key_2 = this.config.columns[0].property || this.config.columns[0].name || '';
665
- /** @type {?} */
666
473
  var data = row.data();
667
- /** @type {?} */
668
474
  var id_1 = data[key_2];
669
- /** @type {?} */
670
475
  var findIndex = this.selected.findIndex(function (x) {
671
476
  return x[key_2] === id_1;
672
477
  });
@@ -688,20 +493,13 @@ var AdvancedTableComponent = /** @class */ (function () {
688
493
  }
689
494
  }
690
495
  };
691
- /**
692
- * @return {?}
693
- */
694
- AdvancedTableComponent.prototype.selectAny = /**
695
- * @return {?}
696
- */
697
- function () {
496
+ AdvancedTableComponent.prototype.selectAny = function () {
698
497
  var _this = this;
699
498
  if (this.dataTable && this.selectable) {
700
499
  // set smart select flag
701
500
  this.smartSelect = true;
702
501
  // select any row
703
502
  this.dataTable.rows().every(function (index) {
704
- /** @type {?} */
705
503
  var row = _this.dataTable.row(index);
706
504
  _this.selectRow(row, true);
707
505
  });
@@ -709,13 +507,7 @@ var AdvancedTableComponent = /** @class */ (function () {
709
507
  this.selectedItems.emit(this.selected);
710
508
  }
711
509
  };
712
- /**
713
- * @return {?}
714
- */
715
- AdvancedTableComponent.prototype.selectNone = /**
716
- * @return {?}
717
- */
718
- function () {
510
+ AdvancedTableComponent.prototype.selectNone = function () {
719
511
  var _this = this;
720
512
  if (this.dataTable && this.selectable) {
721
513
  // set smart select flag
@@ -723,7 +515,6 @@ var AdvancedTableComponent = /** @class */ (function () {
723
515
  this.unselected.splice(0, this.unselected.length);
724
516
  // select any row
725
517
  this.dataTable.rows().every(function (index) {
726
- /** @type {?} */
727
518
  var row = _this.dataTable.row(index);
728
519
  _this.unSelectRow(row, true);
729
520
  });
@@ -732,23 +523,14 @@ var AdvancedTableComponent = /** @class */ (function () {
732
523
  this.selectedItems.emit(this.selected);
733
524
  }
734
525
  };
735
- /**
736
- * @param {?} row
737
- * @return {?}
738
- */
739
- AdvancedTableComponent.prototype.toggleSelectRow = /**
740
- * @param {?} row
741
- * @return {?}
742
- */
743
- function (row) {
526
+ AdvancedTableComponent.prototype.toggleSelectRow = function (row) {
744
527
  if (row) {
745
- /** @type {?} */
746
528
  var data = row.data();
747
- /** @type {?} */
529
+ // get first column key
748
530
  var key_3 = this.config.columns[0].property || this.config.columns[0].name || '';
749
- /** @type {?} */
531
+ // get id
750
532
  var id_2 = data[key_3];
751
- /** @type {?} */
533
+ // find if row is selected
752
534
  var findIndex = this.selected.find(function (x) {
753
535
  return x[key_3] === id_2;
754
536
  });
@@ -762,24 +544,16 @@ var AdvancedTableComponent = /** @class */ (function () {
762
544
  }
763
545
  }
764
546
  };
547
+ // noinspection JSMethodCanBeStatic
765
548
  /**
766
549
  * Datatables column renderer for select checkbox
767
- * @param {?} data
768
- * @param {?} type
769
- * @param {?} row
770
- * @param {?} meta
771
- * @return {?}
772
- */
773
- AdvancedTableComponent.prototype._renderSelect = /**
774
- * Datatables column renderer for select checkbox
775
- * @param {?} data
776
- * @param {?} type
777
- * @param {?} row
778
- * @param {?} meta
779
- * @return {?}
550
+ * @param data
551
+ * @param type
552
+ * @param row
553
+ * @param meta
780
554
  */
781
- function (data, type, row, meta) {
782
- /** @type {?} */
555
+ AdvancedTableComponent.prototype._renderSelect = function (data, type, row, meta) {
556
+ // get column
783
557
  var column = meta.settings.aoColumns[meta.col];
784
558
  if (typeof column.selectTemplate !== 'function') {
785
559
  Object.assign(column, {
@@ -792,15 +566,8 @@ var AdvancedTableComponent = /** @class */ (function () {
792
566
  data: data,
793
567
  });
794
568
  };
795
- /**
796
- * @return {?}
797
- */
798
- AdvancedTableComponent.prototype.ngOnInit = /**
799
- * @return {?}
800
- */
801
- function () {
569
+ AdvancedTableComponent.prototype.ngOnInit = function () {
802
570
  var _this = this;
803
- /** @type {?} */
804
571
  var self = this;
805
572
  if (this.dataTable) {
806
573
  this.destroy();
@@ -816,7 +583,7 @@ var AdvancedTableComponent = /** @class */ (function () {
816
583
  if (Object.prototype.hasOwnProperty.call(this.config, 'multipleSelect')) {
817
584
  this.multipleSelect = this.config.multipleSelect;
818
585
  }
819
- /** @type {?} */
586
+ // prepare configuration for columns
820
587
  var tableColumns_1 = this.config.columns
821
588
  // filter action link column
822
589
  .filter(function (column) {
@@ -828,7 +595,6 @@ var AdvancedTableComponent = /** @class */ (function () {
828
595
  // convert column to advance table column
829
596
  return Object.assign(new ColumnFormatter(_this._injector), column);
830
597
  }).map(function (column) {
831
- /** @type {?} */
832
598
  var columnDefinition = {
833
599
  data: column.property || column.name,
834
600
  defaultContent: column.defaultContent != null ? column.defaultContent : '',
@@ -849,18 +615,9 @@ var AdvancedTableComponent = /** @class */ (function () {
849
615
  }
850
616
  if (column.formatters) {
851
617
  Object.assign(columnDefinition, {
852
- render: /**
853
- * @param {?} data
854
- * @param {?} type
855
- * @param {?} row
856
- * @param {?} meta
857
- * @return {?}
858
- */
859
- function (data, type, row, meta) {
860
- /** @type {?} */
618
+ render: function (data, type, row, meta) {
861
619
  var result = data;
862
- (/** @type {?} */ (column.formatters)).forEach(function (columnFormatter) {
863
- /** @type {?} */
620
+ column.formatters.forEach(function (columnFormatter) {
864
621
  var formatter = self._columnFormatters[columnFormatter.formatter];
865
622
  if (formatter && typeof formatter.render === 'function') {
866
623
  column.formatString = columnFormatter.formatString;
@@ -873,24 +630,15 @@ var AdvancedTableComponent = /** @class */ (function () {
873
630
  return result;
874
631
  },
875
632
  });
876
- /** @type {?} */
633
+ // check if column formatters export createdCell event
877
634
  var items_1 = column.formatters.filter(function (columnFormatter) {
878
635
  return typeof columnFormatter.afterRender === 'function';
879
636
  });
880
637
  if (items_1.length > 0) {
881
638
  Object.assign(columnDefinition, {
882
- createdCell: /**
883
- * @param {?} cell
884
- * @param {?} cellData
885
- * @param {?} rowData
886
- * @param {?} rowIndex
887
- * @param {?} colIndex
888
- * @return {?}
889
- */
890
- function (cell, cellData, rowData, rowIndex, colIndex) {
639
+ createdCell: function (cell, cellData, rowData, rowIndex, colIndex) {
891
640
  items_1.forEach(function (columnFormatter) {
892
- /** @type {?} */
893
- var formatter = /** @type {?} */ ((self._columnFormatters[columnFormatter.formatter]));
641
+ var formatter = self._columnFormatters[columnFormatter.formatter];
894
642
  if (formatter && typeof formatter.afterRender === 'function') {
895
643
  formatter.afterRender.bind(column)(cell, cellData, rowData, rowIndex, colIndex);
896
644
  }
@@ -900,15 +648,13 @@ var AdvancedTableComponent = /** @class */ (function () {
900
648
  }
901
649
  }
902
650
  if (column.formatter) {
903
- /** @type {?} */
904
651
  var formatter = self._columnFormatters[column.formatter];
905
652
  if (formatter && typeof formatter.render === 'function') {
906
653
  Object.assign(columnDefinition, {
907
654
  render: formatter.render.bind(column),
908
655
  });
909
656
  }
910
- /** @type {?} */
911
- var afterRenderFormatter = /** @type {?} */ ((formatter));
657
+ var afterRenderFormatter = formatter;
912
658
  if (afterRenderFormatter && typeof afterRenderFormatter.afterRender === 'function') {
913
659
  Object.assign(columnDefinition, {
914
660
  render: formatter.render.bind(column),
@@ -920,7 +666,7 @@ var AdvancedTableComponent = /** @class */ (function () {
920
666
  }
921
667
  return columnDefinition;
922
668
  });
923
- /** @type {?} */
669
+ // get table element
924
670
  var tableElement_1 = jQuery(this.table && this.table.nativeElement);
925
671
  jQuery(window).on('resize', function () {
926
672
  setTimeout(function () {
@@ -930,10 +676,8 @@ var AdvancedTableComponent = /** @class */ (function () {
930
676
  }, 1);
931
677
  });
932
678
  // tslint:disable-next-line: no-shadowed-variable
933
- // tslint:disable-next-line: no-shadowed-variable
934
679
  tableElement_1.on('processing.dt', function (event, settings, processing) {
935
680
  if (processing) {
936
- // clear empty table element
937
681
  // clear empty table element
938
682
  tableElement_1.find('.dataTables_empty').html('');
939
683
  setTimeout(function () {
@@ -946,13 +690,10 @@ var AdvancedTableComponent = /** @class */ (function () {
946
690
  }, 0);
947
691
  }
948
692
  });
949
- /** @type {?} */
950
693
  var drawIndex_1 = 1;
951
694
  tableElement_1.on('order.dt', function (event) {
952
695
  if (_this.dataTable) {
953
- /** @type {?} */
954
696
  var order = _this.dataTable.order();
955
- /** @type {?} */
956
697
  var columns = tableColumns_1;
957
698
  if (order && order.length) {
958
699
  _this.order.emit(order);
@@ -961,7 +702,6 @@ var AdvancedTableComponent = /** @class */ (function () {
961
702
  }).on('draw.dt', function (event) {
962
703
  _this.draw.emit();
963
704
  if (_this.dataTable) {
964
- /** @type {?} */
965
705
  var info = _this.dataTable.page.info();
966
706
  _this.page.emit(info);
967
707
  if (drawIndex_1 > 1) {
@@ -979,9 +719,10 @@ var AdvancedTableComponent = /** @class */ (function () {
979
719
  });
980
720
  // allow selection
981
721
  if (this.selectable) {
982
- /** @type {?} */
722
+ // get first column (as row primary key)
723
+ // todo::allow row primary key configuration
983
724
  var firstColumn = this.config.columns[0];
984
- /** @type {?} */
725
+ // add select column
985
726
  var selectColumnDefinition = {
986
727
  className: 'text-center pl-4 pr-0',
987
728
  data: firstColumn.property || firstColumn.name,
@@ -996,47 +737,38 @@ var AdvancedTableComponent = /** @class */ (function () {
996
737
  render: this._renderSelect.bind(this),
997
738
  });
998
739
  // and finally add column
999
- // and finally add column
1000
740
  tableColumns_1.unshift(selectColumnDefinition);
1001
741
  // user interface additions
1002
742
  // handle page change event (a trick for firing draw.dt events)
1003
- // user interface additions
1004
- // handle page change event (a trick for firing draw.dt events)
1005
743
  tableElement_1
1006
744
  // handle draw events
1007
745
  .on('draw.dt', function () {
1008
746
  if (_this.customSelect) {
1009
- // enable row selection event
1010
747
  // enable row selection event
1011
748
  tableElement_1.find('tbody').on('click', 'tr', function () {
1012
- /** @type {?} */
749
+ // select row
1013
750
  var row = self.dataTable.row(this);
1014
751
  // add row
1015
752
  self.select.emit(row);
1016
753
  });
1017
754
  }
1018
- /** @type {?} */
1019
755
  var elements = tableElement_1.find('input.s-row');
1020
756
  elements.off('click').on('click', _this.onSelectionChange.bind(_this));
1021
- /** @type {?} */
757
+ // make selection on current page
1022
758
  var key = _this.config.columns[0].property || '';
1023
759
  if (_this.selected.length > 0) {
1024
- // enumerate selected items
1025
760
  // enumerate selected items
1026
761
  _this.selected.forEach(function (item) {
1027
- /** @type {?} */
762
+ // find row identifier
1028
763
  var id = item[key];
1029
764
  // if identifier is defined
1030
765
  if (id != null) {
1031
- // try to find check element with this identifier in attribute data-id
1032
766
  // try to find check element with this identifier in attribute data-id
1033
767
  tableElement_1.find("input[data-id='" + id + "']").prop('checked', true);
1034
768
  }
1035
769
  });
1036
770
  }
1037
771
  if (_this.smartSelect) {
1038
- // select rows that are not selected
1039
- // and do not included in unselected collection
1040
772
  // select rows that are not selected
1041
773
  // and do not included in unselected collection
1042
774
  tableElement_1.find('input[data-id]').each(function (index, element) {
@@ -1056,11 +788,8 @@ var AdvancedTableComponent = /** @class */ (function () {
1056
788
  }
1057
789
  // display row details
1058
790
  if (this.detailsTemplate) {
1059
- /** @type {?} */
1060
791
  var detailsString_1 = this._translateService.instant('Tables.RowDetails');
1061
- /** @type {?} */
1062
792
  var firstColumn = this.config.columns[0];
1063
- /** @type {?} */
1064
793
  var showDetailsColumnDefinition = {
1065
794
  className: 'details-control pl-4 pr-0',
1066
795
  data: firstColumn.property || firstColumn.name,
@@ -1074,20 +803,13 @@ var AdvancedTableComponent = /** @class */ (function () {
1074
803
  },
1075
804
  };
1076
805
  // and finally add column
1077
- // and finally add column
1078
806
  tableColumns_1.unshift(showDetailsColumnDefinition);
1079
807
  // user interface additions
1080
808
  // Add event listener for opening and closing details
1081
- // user interface additions
1082
- // Add event listener for opening and closing details
1083
809
  tableElement_1.on('click', 'td.details-control', function (e) {
1084
- /** @type {?} */
1085
810
  var tr = e.target.closest('tr');
1086
- /** @type {?} */
1087
811
  var row = self.dataTable.row(tr);
1088
- /** @type {?} */
1089
812
  var container = document.createElement('div');
1090
- /** @type {?} */
1091
813
  var detailsViewRef = _this._viewContainerRef.createEmbeddedView(_this.detailsTemplate, {
1092
814
  rowData: row.data(),
1093
815
  });
@@ -1097,14 +819,12 @@ var AdvancedTableComponent = /** @class */ (function () {
1097
819
  }
1098
820
  container.appendChild(detailsViewRef.rootNodes[0]);
1099
821
  if (row.child.isShown()) {
1100
- // This row is already open - close it
1101
822
  // This row is already open - close it
1102
823
  _this.hideDetails.emit();
1103
824
  row.child.hide();
1104
825
  detailsViewRef.destroy();
1105
826
  }
1106
827
  else {
1107
- // Open this row
1108
828
  // Open this row
1109
829
  _this.showDetails.emit({ row: row });
1110
830
  row.child(container).show();
@@ -1112,7 +832,7 @@ var AdvancedTableComponent = /** @class */ (function () {
1112
832
  }
1113
833
  });
1114
834
  }
1115
- /** @type {?} */
835
+ // initialize data table
1116
836
  var settings = {
1117
837
  // set length menu
1118
838
  lengthMenu: [5, 10, 50, 100, 200, 500],
@@ -1143,21 +863,13 @@ var AdvancedTableComponent = /** @class */ (function () {
1143
863
  },
1144
864
  ],
1145
865
  // define server data callback
1146
- fnServerData: /**
1147
- * @param {?} sSource
1148
- * @param {?} aoData
1149
- * @param {?} fnCallback
1150
- * @param {?} oSettings
1151
- * @return {?}
1152
- */
1153
- function (sSource, aoData, fnCallback, oSettings) {
866
+ fnServerData: function (sSource, aoData, fnCallback, oSettings) {
1154
867
  // if method is invoked for the first time
1155
868
  if (self._firstLoad) {
1156
869
  // disabled first load flag
1157
870
  self._firstLoad = false;
1158
871
  // if auto load is disabled
1159
872
  if (self.autoLoad === false) {
1160
- /** @type {?} */
1161
873
  var emptyDataSet = {
1162
874
  recordsTotal: 0,
1163
875
  recordsFiltered: 0,
@@ -1172,40 +884,37 @@ var AdvancedTableComponent = /** @class */ (function () {
1172
884
  }
1173
885
  // reset error
1174
886
  self.toggleError();
1175
- /** @type {?} */
887
+ // get activated route params
1176
888
  var queryParams = self._activatedRoute.snapshot.queryParams;
1177
- /** @type {?} */
889
+ // get columns
1178
890
  var columns = aoData[1].value;
1179
- /** @type {?} */
891
+ // get order expression
1180
892
  var order = aoData[2].value;
1181
- /** @type {?} */
893
+ // get skip records param
1182
894
  var skip = aoData[3].value;
1183
- /** @type {?} */
895
+ // get page size param
1184
896
  var top = aoData[4].value;
1185
- /** @type {?} */
897
+ // get search value
1186
898
  var search = aoData[5].value;
1187
- /** @type {?} */
899
+ // get data queryable
1188
900
  var q = self._query instanceof ClientDataQueryable ? self._query : self._context.model(self.config.model).asQueryable();
1189
901
  // apply paging params
1190
902
  if (top) {
1191
903
  q.take(top).skip(skip);
1192
904
  }
1193
- /** @type {?} */
905
+ // initialize parameters (rowGroup and order) if there is row group input
1194
906
  var rowGroupOrder = [];
1195
907
  if (self.rowGroup && self.rowGroup.length) {
1196
- /** @type {?} */
1197
908
  var colOrder_1 = [];
1198
- /** @type {?} */
909
+ // find index of the rowGroup column
1199
910
  var cols = self.rowGroup.map(function (x) { return tableColumns_1.findIndex(function (tableColumn) { return tableColumn.data === x; }); }).filter(function (index) { return index >= 0; });
1200
911
  // find new index of the rowGroup column in case of table offers the column reordering capability
1201
912
  // i.e. settings.colReorder === false (columnOrdering === false)
1202
913
  if (self.dataTable && self.dataTable.colReorder && this.columnOrdering === true) {
1203
914
  colOrder_1 = self.dataTable.colReorder.order();
1204
- cols = cols.map(function (col) { return colOrder_1.indexOf(/** @type {?} */ (col)); }).filter(function (index) { return index > -1; });
915
+ cols = cols.map(function (col) { return colOrder_1.indexOf(col); }).filter(function (index) { return index > -1; });
1205
916
  }
1206
- /** @type {?} */
1207
917
  var column_1 = -1;
1208
- /** @type {?} */
1209
918
  var direction_1 = 'asc';
1210
919
  // set column and order direction
1211
920
  if (order && order.length) {
@@ -1228,7 +937,7 @@ var AdvancedTableComponent = /** @class */ (function () {
1228
937
  });
1229
938
  order = order || [];
1230
939
  // set the row group column query param always first and before table ordering query params
1231
- order.unshift.apply(order, tslib_1.__spread(rowGroupOrder));
940
+ order.unshift.apply(order, __spread(rowGroupOrder));
1232
941
  // save ordering column and direction (regardless rowGrouping)
1233
942
  if (column_1 > -1) {
1234
943
  self.lastRowGroupOrder = { column: column_1, direction: direction_1 };
@@ -1236,15 +945,14 @@ var AdvancedTableComponent = /** @class */ (function () {
1236
945
  }
1237
946
  // apply order params
1238
947
  if (order && order.length) {
1239
- /** @type {?} */
948
+ // get order query expression
1240
949
  var orderByStr = order.map(function (expr) {
1241
- /** @type {?} */
1242
950
  var columnIndex;
1243
951
  if (self.columnOrdering === false) {
1244
952
  columnIndex = expr.column;
1245
953
  }
1246
954
  else if (self.dataTable && self.dataTable.colReorder) {
1247
- /** @type {?} */
955
+ // get the current column order (from colReorder)
1248
956
  var columnOrder = self.dataTable.colReorder.order();
1249
957
  // and match the dataTable index to the config columns index
1250
958
  // expr.column should always be valid (e.g. in range), but perform a minor validation
@@ -1271,14 +979,13 @@ var AdvancedTableComponent = /** @class */ (function () {
1271
979
  });
1272
980
  }
1273
981
  self.stateLoadCallback(null, function (state) {
1274
- /** @type {?} */
982
+ // configure $select parameter
1275
983
  var select = self.config.columns.filter(function (column) {
1276
984
  if (column.virtual === true) {
1277
985
  return false;
1278
986
  }
1279
987
  if (column.optional === true) {
1280
988
  if (state && state.columns) {
1281
- /** @type {?} */
1282
989
  var index = tableColumns_1.findIndex(function (tableColumn) { return tableColumn.name === column.name; });
1283
990
  if (index >= 0) {
1284
991
  return state.columns[index].visible;
@@ -1297,21 +1004,20 @@ var AdvancedTableComponent = /** @class */ (function () {
1297
1004
  });
1298
1005
  q.select.apply(q, select);
1299
1006
  // configure $filter
1300
- if (queryParams["$filter"] && queryParams["$filter"].length) {
1301
- /** @type {?} */
1007
+ if (queryParams.$filter && queryParams.$filter.length) {
1008
+ // set route filter
1302
1009
  var qParams = q.getParams();
1303
1010
  q.setParam('$filter', null);
1304
- /** @type {?} */
1305
- var expressions = [queryParams["$filter"]];
1011
+ var expressions = [queryParams.$filter];
1306
1012
  if (qParams.$filter) {
1307
1013
  expressions.push('(' + qParams.$filter + ')');
1308
1014
  }
1309
1015
  q.filter(expressions.join(' and '));
1310
1016
  }
1311
1017
  // check if query parameters contain filter
1312
- if (queryParams["$expand"] && queryParams["$expand"].length) {
1018
+ if (queryParams.$expand && queryParams.$expand.length) {
1313
1019
  // set route $expand
1314
- q.setParam('$expand', queryParams["$expand"]);
1020
+ q.setParam('$expand', queryParams.$expand);
1315
1021
  }
1316
1022
  else if (self.config && self.config.defaults && self.config.defaults.expand) {
1317
1023
  q.setParam('$expand', self.config.defaults.expand);
@@ -1326,10 +1032,8 @@ var AdvancedTableComponent = /** @class */ (function () {
1326
1032
  if (self.config && self.config.defaults && self.config.defaults.filter) {
1327
1033
  return self._advancedFilterValueProvider.asyncBuildFilter(self.config.defaults.filter).then(function (defaultFilterString) {
1328
1034
  if (defaultFilterString) {
1329
- /** @type {?} */
1330
1035
  var qParams = q.getParams();
1331
1036
  q.setParam('$filter', null);
1332
- /** @type {?} */
1333
1037
  var expressions = [defaultFilterString];
1334
1038
  if (qParams.$filter) {
1335
1039
  expressions.push('(' + qParams.$filter + ')');
@@ -1340,7 +1044,6 @@ var AdvancedTableComponent = /** @class */ (function () {
1340
1044
  self.lastQueryParams = q.getParams();
1341
1045
  return q.getList().then(function (items) {
1342
1046
  self.afterServerData.emit(items);
1343
- /** @type {?} */
1344
1047
  var dataSet = {
1345
1048
  recordsTotal: items.total,
1346
1049
  recordsFiltered: items.total,
@@ -1370,7 +1073,6 @@ var AdvancedTableComponent = /** @class */ (function () {
1370
1073
  self.lastQueryParams = q.getParams();
1371
1074
  q.getList().then(function (items) {
1372
1075
  self.afterServerData.emit(items);
1373
- /** @type {?} */
1374
1076
  var dataSet = {
1375
1077
  recordsTotal: items.total,
1376
1078
  recordsFiltered: items.total,
@@ -1399,14 +1101,10 @@ var AdvancedTableComponent = /** @class */ (function () {
1399
1101
  };
1400
1102
  // check if there is a rowGroup input and assign it to table
1401
1103
  if (self.rowGroup.length) {
1402
- /** @type {?} */
1403
1104
  var cols = self.rowGroup.map(function (x) { return tableColumns_1.findIndex(function (tableColumn) { return tableColumn.data === x; }); }).filter(function (index) { return index >= 0; });
1404
- /** @type {?} */
1405
1105
  var dataSrc = cols.map(function (x) { return tableColumns_1[x].data; });
1406
- /** @type {?} */
1407
1106
  var startRender = function (rows, group, level) {
1408
- /** @type {?} */
1409
- var headerViewRef = self._viewContainerRef.createEmbeddedView(/** @type {?} */ (self.headerTemplate), {
1107
+ var headerViewRef = self._viewContainerRef.createEmbeddedView(self.headerTemplate, {
1410
1108
  group: group,
1411
1109
  rows: rows,
1412
1110
  level: level
@@ -1417,10 +1115,9 @@ var AdvancedTableComponent = /** @class */ (function () {
1417
1115
  }
1418
1116
  return headerViewRef.rootNodes[0];
1419
1117
  };
1420
- /** @type {?} */
1118
+ // endRender property
1421
1119
  var endRender = function (rows, group, level) {
1422
- /** @type {?} */
1423
- var footerViewRef = self._viewContainerRef.createEmbeddedView(/** @type {?} */ (self.footerTemplate), {
1120
+ var footerViewRef = self._viewContainerRef.createEmbeddedView(self.footerTemplate, {
1424
1121
  group: group,
1425
1122
  rows: rows,
1426
1123
  level: level
@@ -1434,11 +1131,8 @@ var AdvancedTableComponent = /** @class */ (function () {
1434
1131
  Object.assign(settings, { rowGroup: { dataSrc: dataSrc, endRender: endRender, startRender: startRender } }, {});
1435
1132
  }
1436
1133
  if (self.config.fixedColumns) {
1437
- /** @type {?} */
1438
1134
  var left = self.config.fixedColumns.left || 0;
1439
- /** @type {?} */
1440
1135
  var right = self.config.fixedColumns.right || 0;
1441
- /** @type {?} */
1442
1136
  var fixedColumns = {
1443
1137
  left: left,
1444
1138
  right: right
@@ -1447,7 +1141,6 @@ var AdvancedTableComponent = /** @class */ (function () {
1447
1141
  fixedColumns: fixedColumns
1448
1142
  });
1449
1143
  }
1450
- /** @type {?} */
1451
1144
  var stateSettings = {
1452
1145
  stateSave: this.stateSave
1453
1146
  };
@@ -1487,16 +1180,12 @@ var AdvancedTableComponent = /** @class */ (function () {
1487
1180
  }
1488
1181
  // handle init.dt event and emit local event
1489
1182
  this.dataTable = tableElement_1.on('init.dt', function (event) {
1490
- /** @type {?} */
1491
1183
  var scroller = jQuery(event.target).parent();
1492
1184
  // handle scrolling
1493
1185
  scroller.on('scroll', function (scrollEvent) {
1494
- /** @type {?} */
1495
1186
  var target = jQuery(scrollEvent.target);
1496
- /** @type {?} */
1497
- var top = /** @type {?} */ (target.scrollTop());
1498
- /** @type {?} */
1499
- var left = /** @type {?} */ (target.scrollLeft());
1187
+ var top = target.scrollTop();
1188
+ var left = target.scrollLeft();
1500
1189
  if (_this.dataTable) {
1501
1190
  _this.scroll.emit({
1502
1191
  top: top,
@@ -1508,14 +1197,12 @@ var AdvancedTableComponent = /** @class */ (function () {
1508
1197
  this.init.emit();
1509
1198
  // show or hide header
1510
1199
  if (!this.showHeader && this._element && this._element.nativeElement) {
1511
- /** @type {?} */
1512
- var hideSelector = (/** @type {?} */ (this._element.nativeElement))
1200
+ var hideSelector = this._element.nativeElement
1513
1201
  .querySelector('.dataTable>thead');
1514
1202
  if (hideSelector) {
1515
1203
  hideSelector.classList.add('d-none');
1516
1204
  }
1517
- /** @type {?} */
1518
- var adjustSelector = (/** @type {?} */ (this._element.nativeElement))
1205
+ var adjustSelector = this._element.nativeElement
1519
1206
  .querySelector('.dataTable');
1520
1207
  if (adjustSelector) {
1521
1208
  adjustSelector.classList.add('mt-2');
@@ -1523,22 +1210,20 @@ var AdvancedTableComponent = /** @class */ (function () {
1523
1210
  }
1524
1211
  // show or hide footer
1525
1212
  if (!this.showFooter && this._element && this._element.nativeElement) {
1526
- /** @type {?} */
1527
- var infoSelector = (/** @type {?} */ (this._element.nativeElement))
1213
+ var infoSelector = this._element.nativeElement
1528
1214
  .querySelector('.dataTables_info');
1529
1215
  if (infoSelector) {
1530
1216
  infoSelector.classList.add('d-none');
1531
1217
  }
1532
1218
  }
1533
- /** @type {?} */
1219
+ // add custom event handler
1534
1220
  var onCustomEvent = function (event) {
1535
- /** @type {?} */
1536
- var target = /** @type {?} */ (event.currentTarget);
1537
- /** @type {?} */
1538
- var customEvent = target.dataset["event"] || 'event';
1539
- /** @type {?} */
1221
+ var target = event.currentTarget;
1222
+ // get custom event name
1223
+ var customEvent = target.dataset.event || 'event';
1224
+ // get row
1540
1225
  var row = _this.dataTable.row(target.closest('tr'));
1541
- /** @type {?} */
1226
+ // get row data
1542
1227
  var data = row.data();
1543
1228
  _this.customEvent.emit({
1544
1229
  name: customEvent,
@@ -1554,45 +1239,20 @@ var AdvancedTableComponent = /** @class */ (function () {
1554
1239
  }
1555
1240
  }
1556
1241
  };
1557
- /**
1558
- * @return {?}
1559
- */
1560
- AdvancedTableComponent.prototype.ngAfterViewInit = /**
1561
- * @return {?}
1562
- */
1563
- function () {
1242
+ AdvancedTableComponent.prototype.ngAfterViewInit = function () {
1564
1243
  };
1565
- /**
1566
- * @param {?} value
1567
- * @return {?}
1568
- */
1569
- AdvancedTableComponent.prototype.scrollTop = /**
1570
- * @param {?} value
1571
- * @return {?}
1572
- */
1573
- function (value) {
1244
+ AdvancedTableComponent.prototype.scrollTop = function (value) {
1574
1245
  if (this.dataTable) {
1575
1246
  this.dataTable.parent().scrollTop(value);
1576
1247
  }
1577
1248
  };
1578
- /**
1579
- * @param {?} value
1580
- * @return {?}
1581
- */
1582
- AdvancedTableComponent.prototype.scrollLeft = /**
1583
- * @param {?} value
1584
- * @return {?}
1585
- */
1586
- function (value) {
1249
+ AdvancedTableComponent.prototype.scrollLeft = function (value) {
1587
1250
  if (this.dataTable) {
1588
1251
  this.dataTable.parent().scrollLeft(value);
1589
1252
  }
1590
1253
  };
1591
1254
  Object.defineProperty(AdvancedTableComponent.prototype, "lastQuery", {
1592
- get: /**
1593
- * @return {?}
1594
- */
1595
- function () {
1255
+ get: function () {
1596
1256
  var _this = this;
1597
1257
  if (this.config == null) {
1598
1258
  return;
@@ -1600,11 +1260,9 @@ var AdvancedTableComponent = /** @class */ (function () {
1600
1260
  if (this.lastQueryParams == null) {
1601
1261
  return;
1602
1262
  }
1603
- /** @type {?} */
1263
+ // check if query model has changed
1604
1264
  var queryModel = this._query && this._query.getModel();
1605
- /** @type {?} */
1606
1265
  var model = queryModel ? queryModel : this.config.model;
1607
- /** @type {?} */
1608
1266
  var q = this._context.model(model).asQueryable();
1609
1267
  Object.keys(this.lastQueryParams).forEach(function (key) {
1610
1268
  q.setParam(key, _this.lastQueryParams && _this.lastQueryParams[key]);
@@ -1617,15 +1275,9 @@ var AdvancedTableComponent = /** @class */ (function () {
1617
1275
  });
1618
1276
  /**
1619
1277
  * Fetches and updates a single row
1620
- * @param {?} find - Any object which is being converted to a query
1621
- * @return {?}
1278
+ * @param find - Any object which is being converted to a query
1622
1279
  */
1623
- AdvancedTableComponent.prototype.fetchOne = /**
1624
- * Fetches and updates a single row
1625
- * @param {?} find - Any object which is being converted to a query
1626
- * @return {?}
1627
- */
1628
- function (find) {
1280
+ AdvancedTableComponent.prototype.fetchOne = function (find) {
1629
1281
  var _this = this;
1630
1282
  if (find == null) {
1631
1283
  return;
@@ -1636,16 +1288,16 @@ var AdvancedTableComponent = /** @class */ (function () {
1636
1288
  if (this.lastQueryParams == null) {
1637
1289
  return;
1638
1290
  }
1639
- /** @type {?} */
1291
+ // get rows
1640
1292
  var rows = Array.from(this.dataTable.rows().data());
1641
1293
  if (rows && rows.length) {
1642
- /** @type {?} */
1294
+ // find result
1643
1295
  var findKeys_1 = Object.keys(find);
1644
1296
  if (findKeys_1.length === 0) {
1645
1297
  // do nothing
1646
1298
  return;
1647
1299
  }
1648
- /** @type {?} */
1300
+ // find row index by searching each property
1649
1301
  var rowIndex_1 = rows.findIndex(function (row) {
1650
1302
  return findKeys_1.map(function (key) {
1651
1303
  return row[key] === find[key];
@@ -1655,27 +1307,22 @@ var AdvancedTableComponent = /** @class */ (function () {
1655
1307
  });
1656
1308
  // if row has been found
1657
1309
  if (rowIndex_1 >= 0) {
1658
- /** @type {?} */
1659
1310
  var query_1 = this._context.model(this.config.model).asQueryable();
1660
1311
  // select attributes
1661
- // select attributes
1662
1312
  query_1.setParam('$select', this.lastQueryParams.$select);
1663
1313
  if (this.lastQueryParams.$expand) {
1664
- // apply expand attributes
1665
1314
  // apply expand attributes
1666
1315
  query_1.setParam('$expand', this.lastQueryParams.$expand);
1667
1316
  }
1668
1317
  // apply filter for row
1669
- // apply filter for row
1670
1318
  findKeys_1.forEach(function (key) {
1671
- /** @type {?} */
1672
1319
  var column = _this.config.columns.find(function (col) {
1673
1320
  return col.property === key || col.name === key;
1674
1321
  });
1675
1322
  if (column) {
1676
- /** @type {?} */
1323
+ // get property or name
1677
1324
  var property = column.property || column.name;
1678
- query_1.and(/** @type {?} */ (property)).equal(find[key]);
1325
+ query_1.and(property).equal(find[key]);
1679
1326
  }
1680
1327
  else {
1681
1328
  query_1.and(key).equal(find[key]);
@@ -1683,9 +1330,8 @@ var AdvancedTableComponent = /** @class */ (function () {
1683
1330
  });
1684
1331
  // and finally get item
1685
1332
  return query_1.getItem().then(function (item) {
1686
- /** @type {?} */
1333
+ // if item exists
1687
1334
  var row = _this.dataTable.row(rowIndex_1);
1688
- /** @type {?} */
1689
1335
  var checked = jQuery(row.node()).find(':checkbox').prop('checked');
1690
1336
  if (item) {
1691
1337
  // redraw row
@@ -1702,43 +1348,26 @@ var AdvancedTableComponent = /** @class */ (function () {
1702
1348
  }
1703
1349
  return Promise.resolve();
1704
1350
  };
1705
- /**
1706
- * @return {?}
1707
- */
1708
- AdvancedTableComponent.prototype.ngOnDestroy = /**
1709
- * @return {?}
1710
- */
1711
- function () {
1351
+ AdvancedTableComponent.prototype.ngOnDestroy = function () {
1712
1352
  if (this.reloadSubscription) {
1713
1353
  this.reloadSubscription.unsubscribe();
1714
1354
  }
1715
1355
  };
1716
1356
  /**
1717
1357
  * Handle selection change
1718
- * @param {?} $event
1719
- * @return {?}
1720
- */
1721
- AdvancedTableComponent.prototype.onSelectionChange = /**
1722
- * Handle selection change
1723
- * @param {?} $event
1724
- * @return {?}
1358
+ * @param $event
1725
1359
  */
1726
- function ($event) {
1727
- /** @type {?} */
1728
- var input = /** @type {?} */ ($event.target);
1729
- /** @type {?} */
1360
+ AdvancedTableComponent.prototype.onSelectionChange = function ($event) {
1361
+ var input = $event.target;
1730
1362
  var execRegex = /-(\d+)$/g.exec(input.id);
1731
- /** @type {?} */
1732
- var rowIndex = parseInt(/** @type {?} */ ((execRegex && execRegex[1])), 10);
1733
- /** @type {?} */
1363
+ // get row from id
1364
+ var rowIndex = parseInt((execRegex && execRegex[1]), 10);
1365
+ // get row
1734
1366
  var row = this.dataTable.row(rowIndex).data();
1735
1367
  // get row identifier
1736
1368
  if (row) {
1737
- /** @type {?} */
1738
1369
  var key_4 = this.config.columns[0].property || '';
1739
- /** @type {?} */
1740
1370
  var id_3 = row[key_4];
1741
- /** @type {?} */
1742
1371
  var findItemIndex = this.selected.findIndex(function (item) {
1743
1372
  return item[key_4] === id_3;
1744
1373
  });
@@ -1767,13 +1396,7 @@ var AdvancedTableComponent = /** @class */ (function () {
1767
1396
  }
1768
1397
  }
1769
1398
  };
1770
- /**
1771
- * @return {?}
1772
- */
1773
- AdvancedTableComponent.prototype.resetEmptyTable = /**
1774
- * @return {?}
1775
- */
1776
- function () {
1399
+ AdvancedTableComponent.prototype.resetEmptyTable = function () {
1777
1400
  // this operation is important
1778
1401
  // due to ng data binding
1779
1402
  // empty table template has no translated text during ngOnInit()
@@ -1782,19 +1405,9 @@ var AdvancedTableComponent = /** @class */ (function () {
1782
1405
  this.dataTable.context[0].oLanguage.sZeroRecords = this.emptyTable && this.emptyTable.nativeElement.innerHTML;
1783
1406
  }
1784
1407
  };
1785
- /**
1786
- * @param {?=} err
1787
- * @return {?}
1788
- */
1789
- AdvancedTableComponent.prototype.toggleError = /**
1790
- * @param {?=} err
1791
- * @return {?}
1792
- */
1793
- function (err) {
1408
+ AdvancedTableComponent.prototype.toggleError = function (err) {
1794
1409
  if (this.dataTable && this.dataTable.context[0]) {
1795
- /** @type {?} */
1796
- var element = (this.errorTemplate && /** @type {?} */ (this.errorTemplate.nativeElement));
1797
- /** @type {?} */
1410
+ var element = (this.errorTemplate && this.errorTemplate.nativeElement);
1798
1411
  var innerMessage = void 0;
1799
1412
  if (element) {
1800
1413
  innerMessage = element.getElementsByTagName('small').item(0);
@@ -1828,38 +1441,16 @@ var AdvancedTableComponent = /** @class */ (function () {
1828
1441
  }
1829
1442
  }
1830
1443
  };
1831
- /**
1832
- * @return {?}
1833
- */
1834
- AdvancedTableComponent.prototype.clearEmptyTable = /**
1835
- * @return {?}
1836
- */
1837
- function () {
1444
+ AdvancedTableComponent.prototype.clearEmptyTable = function () {
1838
1445
  if (this.dataTable && this.dataTable.context[0]) {
1839
1446
  this.dataTable.context[0].oLanguage.sEmptyTable = this.dataTable.context[0].oLanguage.sZeroRecords = '';
1840
1447
  }
1841
1448
  };
1842
- /**
1843
- * @return {?}
1844
- */
1845
- AdvancedTableComponent.prototype.export = /**
1846
- * @return {?}
1847
- */
1848
- function () {
1849
- /** @type {?} */
1850
- var element = /** @type {?} */ (document.querySelector('.dt-buttons .buttons-excel'));
1449
+ AdvancedTableComponent.prototype.export = function () {
1450
+ var element = document.querySelector('.dt-buttons .buttons-excel');
1851
1451
  element.click();
1852
1452
  };
1853
- /**
1854
- * @param {?} columnsToShow
1855
- * @return {?}
1856
- */
1857
- AdvancedTableComponent.prototype.handleColumns = /**
1858
- * @param {?} columnsToShow
1859
- * @return {?}
1860
- */
1861
- function (columnsToShow) {
1862
- /** @type {?} */
1453
+ AdvancedTableComponent.prototype.handleColumns = function (columnsToShow) {
1863
1454
  var table = this.dataTable;
1864
1455
  this.config.columns.slice(1).forEach(function (column, i) {
1865
1456
  if (!column.hidden) {
@@ -1874,37 +1465,21 @@ var AdvancedTableComponent = /** @class */ (function () {
1874
1465
  }
1875
1466
  });
1876
1467
  };
1877
- /**
1878
- * @return {?}
1879
- */
1880
- AdvancedTableComponent.prototype.getConfig = /**
1881
- * @return {?}
1882
- */
1883
- function () {
1468
+ AdvancedTableComponent.prototype.getConfig = function () {
1884
1469
  return this.config;
1885
1470
  };
1886
- /**
1887
- * @param {?} changes
1888
- * @return {?}
1889
- */
1890
- AdvancedTableComponent.prototype.ngOnChanges = /**
1891
- * @param {?} changes
1892
- * @return {?}
1893
- */
1894
- function (changes) {
1471
+ AdvancedTableComponent.prototype.ngOnChanges = function (changes) {
1895
1472
  var _this = this;
1896
1473
  if (Object.prototype.hasOwnProperty.call(changes, 'configSrc')) {
1897
- if (changes["configSrc"] != null) {
1474
+ if (changes.configSrc != null) {
1898
1475
  // load table configuration on change
1899
1476
  // tslint:disable-next-line: triple-equals
1900
- if (changes["configSrc"].currentValue && (changes["configSrc"].currentValue != changes["configSrc"].previousValue)) {
1901
- this._http.get(changes["configSrc"].currentValue).toPromise().then(function (config) {
1902
- // set configuration
1477
+ if (changes.configSrc.currentValue && (changes.configSrc.currentValue != changes.configSrc.previousValue)) {
1478
+ this._http.get(changes.configSrc.currentValue).toPromise().then(function (config) {
1903
1479
  // set configuration
1904
1480
  _this.config = config;
1905
1481
  _this.destroy();
1906
1482
  // fetch and redraw
1907
- // fetch and redraw
1908
1483
  _this.fetch();
1909
1484
  }).catch(function (err) {
1910
1485
  console.error('TABLES', 'An error occurred while loading table configuration.');
@@ -1914,41 +1489,23 @@ var AdvancedTableComponent = /** @class */ (function () {
1914
1489
  }
1915
1490
  }
1916
1491
  };
1917
- /**
1918
- * @param {?=} load
1919
- * @return {?}
1920
- */
1921
- AdvancedTableComponent.prototype.reset = /**
1922
- * @param {?=} load
1923
- * @return {?}
1924
- */
1925
- function (load) {
1492
+ AdvancedTableComponent.prototype.reset = function (load) {
1926
1493
  this.query = undefined;
1927
1494
  this.destroy();
1928
1495
  this.autoLoad = !!load;
1929
1496
  this.ngOnInit();
1930
1497
  };
1931
- /**
1932
- * @return {?}
1933
- */
1934
- AdvancedTableComponent.prototype.selectColumns = /**
1935
- * @return {?}
1936
- */
1937
- function () {
1498
+ AdvancedTableComponent.prototype.selectColumns = function () {
1938
1499
  var _this = this;
1939
- /** @type {?} */
1500
+ // get column order e.g. [0, 4, 1, 2, 3]
1940
1501
  var columnOrder = this.dataTable.colReorder.order();
1941
- /** @type {?} */
1502
+ // get column definitions
1942
1503
  var columnDefs = this.dataTable.settings().init().columns;
1943
- /** @type {?} */
1944
1504
  var columns = columnDefs.map(function (columnDef, i) {
1945
- /** @type {?} */
1946
1505
  var key = "column-" + i;
1947
- /** @type {?} */
1948
1506
  var title = columnDef.title;
1949
- /** @type {?} */
1507
+ // get column index
1950
1508
  var index = columnOrder.indexOf(i);
1951
- /** @type {?} */
1952
1509
  var visible = _this.dataTable.column(index).visible();
1953
1510
  // set title for select column
1954
1511
  if (i === 0 && _this.selectable) {
@@ -1959,7 +1516,7 @@ var AdvancedTableComponent = /** @class */ (function () {
1959
1516
  title = undefined;
1960
1517
  }
1961
1518
  if (title == null) {
1962
- /** @type {?} */
1519
+ // try to find column placeholder
1963
1520
  var placeholder = void 0;
1964
1521
  if (_this.selectable) {
1965
1522
  if (i > 0) {
@@ -1985,8 +1542,7 @@ var AdvancedTableComponent = /** @class */ (function () {
1985
1542
  });
1986
1543
  this._columnSelector.selectColumns(columns).then(function (event) {
1987
1544
  if (event.result === 'ok') {
1988
- /** @type {?} */
1989
- var sorted = (/** @type {?} */ (event.columns))
1545
+ var sorted = event.columns
1990
1546
  .map(function (col) {
1991
1547
  return {
1992
1548
  key: col.key,
@@ -1994,44 +1550,34 @@ var AdvancedTableComponent = /** @class */ (function () {
1994
1550
  };
1995
1551
  })
1996
1552
  .sort(function (a, b) { return a.index - b.index; });
1997
- /** @type {?} */
1553
+ // get column order e.g. [3, 1, 2, 0, 4]
1998
1554
  var indexes = sorted
1999
1555
  .map(function (item) {
2000
- return (/** @type {?} */ (event.columns)).findIndex(function (next) { return item.key === next.key; });
1556
+ return event.columns.findIndex(function (next) { return item.key === next.key; });
2001
1557
  });
2002
1558
  // reset column visibilty
2003
- for (var index = 0; index < (/** @type {?} */ (event.columns)).length; index++) {
2004
- /** @type {?} */
2005
- var element = (/** @type {?} */ (event.columns))[index];
2006
- /** @type {?} */
1559
+ for (var index = 0; index < event.columns.length; index++) {
1560
+ var element = event.columns[index];
2007
1561
  var colIndex = columnOrder.indexOf(index);
2008
1562
  // set visibilty with redraw (=true)
2009
- // set visibilty with redraw (=true)
2010
1563
  _this.dataTable.column(colIndex).visible(element.visible, true);
2011
1564
  }
2012
1565
  // finally apply column order
2013
- // finally apply column order
2014
1566
  _this.dataTable.colReorder.order(indexes, true);
2015
1567
  // simply redraw the table
2016
- // simply redraw the table
2017
1568
  _this.dataTable.draw();
2018
1569
  }
2019
1570
  });
2020
1571
  };
2021
1572
  /**
2022
1573
  *
2023
- * @param {?=} options to pass an errorHandler callback, if desired
2024
- * @return {?} void
1574
+ * @param options to pass an errorHandler callback, if desired
1575
+ * @returns void
2025
1576
  */
2026
- AdvancedTableComponent.prototype.exportView = /**
2027
- *
2028
- * @param {?=} options to pass an errorHandler callback, if desired
2029
- * @return {?} void
2030
- */
2031
- function (options) {
2032
- return tslib_1.__awaiter(this, void 0, void 0, function () {
1577
+ AdvancedTableComponent.prototype.exportView = function (options) {
1578
+ return __awaiter(this, void 0, void 0, function () {
2033
1579
  var exportSettings, exportLimit, totalDisplayedItems, _a, body, header, previousDataState, targetDataState, _b, body, header, err_1;
2034
- return tslib_1.__generator(this, function (_c) {
1580
+ return __generator(this, function (_c) {
2035
1581
  switch (_c.label) {
2036
1582
  case 0:
2037
1583
  _c.trys.push([0, 4, 5, 6]);
@@ -2041,7 +1587,7 @@ var AdvancedTableComponent = /** @class */ (function () {
2041
1587
  // do nothing
2042
1588
  return [2 /*return*/];
2043
1589
  }
2044
- exportSettings = /** @type {?} */ (this._configuration.settings);
1590
+ exportSettings = this._configuration.settings;
2045
1591
  exportLimit = (exportSettings && exportSettings.tables && exportSettings.tables.exportLimit && exportSettings.tables.exportLimit > 0)
2046
1592
  ? exportSettings.tables.exportLimit : MAX_EXPORT_ITEMS;
2047
1593
  // and validate it
@@ -2107,20 +1653,14 @@ var AdvancedTableComponent = /** @class */ (function () {
2107
1653
  });
2108
1654
  });
2109
1655
  };
2110
- /**
2111
- * @return {?}
2112
- */
2113
- AdvancedTableComponent.prototype.getExportableData = /**
2114
- * @return {?}
2115
- */
2116
- function () {
1656
+ AdvancedTableComponent.prototype.getExportableData = function () {
2117
1657
  var _this = this;
2118
1658
  if (!(this.dataTable && this.dataTable.buttons
2119
1659
  && typeof this.dataTable.buttons.exportData === 'function' && this.config)) {
2120
1660
  return { body: [], header: [] };
2121
1661
  }
1662
+ // fetch exportable excel data
2122
1663
  var _a = this.dataTable.buttons.exportData(), body = _a.body, header = _a.header;
2123
- /** @type {?} */
2124
1664
  var cleanupIndexes = [];
2125
1665
  // clean up headers
2126
1666
  header = header.filter(function (headerItem, index) {
@@ -2146,16 +1686,6 @@ var AdvancedTableComponent = /** @class */ (function () {
2146
1686
  });
2147
1687
  return { body: body, header: header };
2148
1688
  };
2149
- AdvancedTableComponent.decorators = [
2150
- { type: Component, args: [{
2151
- // tslint:disable-next-line: component-selector
2152
- selector: 'app-advanced-table',
2153
- template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <div #errorTemplate class=\"d-none error-message\">\n <div class=\"text-center\">\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-danger border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-secondary\" [translate]=\"'Tables.DataError.Title'\"></h4>\n <p class=\"font-lg text-secondary mb-1\" [translate]=\"'Tables.DataError.Message'\"></p>\n <p class=\"font-lg text-secondary error-inner-message\">\n <small></small>\n </p>\n </div>\n </div>\n </div>\n ",
2154
- encapsulation: ViewEncapsulation.None,
2155
- styles: ["div.dataTables_processing>div:last-child>div{background-color:var(--secondary)}table.dataTable thead .sorting{background-image:none}table.dataTable thead tr th{border-bottom:none;font-weight:500;font-size:.75rem}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable tbody tr.dtrg-group.dtrg-start th{border:2px solid #c2cfd6;border-bottom:1px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr.dtrg-group.dtrg-end th{border-top:2px solid #c2cfd6;border-right:2px solid #c2cfd6;border-left:2px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr:nth-last-child(1) th{border-bottom:2px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}table.dataTable td.details-control{cursor:pointer}table.dataTable td.details-control button{border:none;background-color:inherit;outline:0}table.dataTable td.details-control button::after{content:'\\25B7'}table.dataTable tr.dt-hasChild td.details-control button::after{content:'\\25BD'}"]
2156
- }] }
2157
- ];
2158
- /** @nocollapse */
2159
1689
  AdvancedTableComponent.ctorParameters = function () { return [
2160
1690
  { type: AngularDataContext },
2161
1691
  { type: undefined, decorators: [{ type: Inject, args: [COLUMN_FORMATTERS,] }] },
@@ -2175,239 +1705,170 @@ var AdvancedTableComponent = /** @class */ (function () {
2175
1705
  { type: ViewContainerRef },
2176
1706
  { type: ErrorHandler, decorators: [{ type: Optional }] }
2177
1707
  ]; };
2178
- AdvancedTableComponent.propDecorators = {
2179
- table: [{ type: ViewChild, args: ['table',] }],
2180
- emptyTable: [{ type: ViewChild, args: ['emptyTable',] }],
2181
- errorTemplate: [{ type: ViewChild, args: ['errorTemplate',] }],
2182
- loadingTable: [{ type: ViewChild, args: ['loadingTable',] }],
2183
- height: [{ type: Input }],
2184
- showActions: [{ type: Input }],
2185
- autoLoad: [{ type: Input }],
2186
- customEvent: [{ type: Output, args: ['customEvent',] }],
2187
- load: [{ type: Output, args: ['load',] }],
2188
- init: [{ type: Output, args: ['init',] }],
2189
- reload: [{ type: Input, args: ['reload',] }],
2190
- select: [{ type: Output, args: ['select',] }],
2191
- draw: [{ type: Output, args: ['draw',] }],
2192
- page: [{ type: Output, args: ['page',] }],
2193
- order: [{ type: Output, args: ['order',] }],
2194
- scroll: [{ type: Output, args: ['scroll',] }],
2195
- selectedItems: [{ type: Output, args: ['selectedItems',] }],
2196
- beforeServerData: [{ type: Output, args: ['beforeServerData',] }],
2197
- afterServerData: [{ type: Output, args: ['afterServerData',] }],
2198
- loading: [{ type: Output, args: ['loading',] }],
2199
- showDetails: [{ type: Output, args: ['showDetails',] }],
2200
- hideDetails: [{ type: Output, args: ['hideDetails',] }],
2201
- scrollable: [{ type: Input }],
2202
- serverSide: [{ type: Input }],
2203
- lengthMenu: [{ type: Input }],
2204
- paging: [{ type: Input }],
2205
- pageLength: [{ type: Input }],
2206
- columnOrdering: [{ type: Input }],
2207
- stateSave: [{ type: Input }],
2208
- stateLoadCallback: [{ type: Input }],
2209
- stateSaveCallback: [{ type: Input }],
2210
- scrollY: [{ type: Input }],
2211
- scrollX: [{ type: Input }],
2212
- selectable: [{ type: Input }],
2213
- multipleSelect: [{ type: Input }],
2214
- customSelect: [{ type: Input }],
2215
- selected: [{ type: Input }],
2216
- configSrc: [{ type: Input }],
2217
- rowGroup: [{ type: Input }],
2218
- headerTemplate: [{ type: Input }],
2219
- footerTemplate: [{ type: Input }],
2220
- detailsTemplate: [{ type: Input }],
2221
- header: [{ type: ViewChild, args: ['header',] }],
2222
- footer: [{ type: ViewChild, args: ['footer',] }],
2223
- config: [{ type: Input, args: ['config',] }],
2224
- showFooter: [{ type: Input, args: ['showFooter',] }],
2225
- showHeader: [{ type: Input, args: ['showHeader',] }],
2226
- showPaging: [{ type: Input, args: ['showPaging',] }],
2227
- query: [{ type: Input, args: ['query',] }]
2228
- };
1708
+ __decorate([
1709
+ ViewChild('table')
1710
+ ], AdvancedTableComponent.prototype, "table", void 0);
1711
+ __decorate([
1712
+ ViewChild('emptyTable')
1713
+ ], AdvancedTableComponent.prototype, "emptyTable", void 0);
1714
+ __decorate([
1715
+ ViewChild('errorTemplate')
1716
+ ], AdvancedTableComponent.prototype, "errorTemplate", void 0);
1717
+ __decorate([
1718
+ ViewChild('loadingTable')
1719
+ ], AdvancedTableComponent.prototype, "loadingTable", void 0);
1720
+ __decorate([
1721
+ Input()
1722
+ ], AdvancedTableComponent.prototype, "height", void 0);
1723
+ __decorate([
1724
+ Input()
1725
+ ], AdvancedTableComponent.prototype, "showActions", void 0);
1726
+ __decorate([
1727
+ Input()
1728
+ ], AdvancedTableComponent.prototype, "autoLoad", void 0);
1729
+ __decorate([
1730
+ Output('customEvent')
1731
+ ], AdvancedTableComponent.prototype, "customEvent", void 0);
1732
+ __decorate([
1733
+ Output('load')
1734
+ ], AdvancedTableComponent.prototype, "load", void 0);
1735
+ __decorate([
1736
+ Output('init')
1737
+ ], AdvancedTableComponent.prototype, "init", void 0);
1738
+ __decorate([
1739
+ Input('reload')
1740
+ ], AdvancedTableComponent.prototype, "reload", void 0);
1741
+ __decorate([
1742
+ Output('select')
1743
+ ], AdvancedTableComponent.prototype, "select", void 0);
1744
+ __decorate([
1745
+ Output('draw')
1746
+ ], AdvancedTableComponent.prototype, "draw", void 0);
1747
+ __decorate([
1748
+ Output('page')
1749
+ ], AdvancedTableComponent.prototype, "page", void 0);
1750
+ __decorate([
1751
+ Output('order')
1752
+ ], AdvancedTableComponent.prototype, "order", void 0);
1753
+ __decorate([
1754
+ Output('scroll')
1755
+ ], AdvancedTableComponent.prototype, "scroll", void 0);
1756
+ __decorate([
1757
+ Output('selectedItems')
1758
+ ], AdvancedTableComponent.prototype, "selectedItems", void 0);
1759
+ __decorate([
1760
+ Output('beforeServerData')
1761
+ ], AdvancedTableComponent.prototype, "beforeServerData", void 0);
1762
+ __decorate([
1763
+ Output('afterServerData')
1764
+ ], AdvancedTableComponent.prototype, "afterServerData", void 0);
1765
+ __decorate([
1766
+ Output('loading')
1767
+ ], AdvancedTableComponent.prototype, "loading", void 0);
1768
+ __decorate([
1769
+ Output('showDetails')
1770
+ ], AdvancedTableComponent.prototype, "showDetails", void 0);
1771
+ __decorate([
1772
+ Output('hideDetails')
1773
+ ], AdvancedTableComponent.prototype, "hideDetails", void 0);
1774
+ __decorate([
1775
+ Input()
1776
+ ], AdvancedTableComponent.prototype, "scrollable", void 0);
1777
+ __decorate([
1778
+ Input()
1779
+ ], AdvancedTableComponent.prototype, "serverSide", void 0);
1780
+ __decorate([
1781
+ Input()
1782
+ ], AdvancedTableComponent.prototype, "lengthMenu", void 0);
1783
+ __decorate([
1784
+ Input()
1785
+ ], AdvancedTableComponent.prototype, "paging", void 0);
1786
+ __decorate([
1787
+ Input()
1788
+ ], AdvancedTableComponent.prototype, "pageLength", void 0);
1789
+ __decorate([
1790
+ Input()
1791
+ ], AdvancedTableComponent.prototype, "columnOrdering", void 0);
1792
+ __decorate([
1793
+ Input()
1794
+ ], AdvancedTableComponent.prototype, "stateSave", void 0);
1795
+ __decorate([
1796
+ Input()
1797
+ ], AdvancedTableComponent.prototype, "stateLoadCallback", void 0);
1798
+ __decorate([
1799
+ Input()
1800
+ ], AdvancedTableComponent.prototype, "stateSaveCallback", void 0);
1801
+ __decorate([
1802
+ Input()
1803
+ ], AdvancedTableComponent.prototype, "scrollY", void 0);
1804
+ __decorate([
1805
+ Input()
1806
+ ], AdvancedTableComponent.prototype, "scrollX", void 0);
1807
+ __decorate([
1808
+ Input()
1809
+ ], AdvancedTableComponent.prototype, "selectable", void 0);
1810
+ __decorate([
1811
+ Input()
1812
+ ], AdvancedTableComponent.prototype, "multipleSelect", void 0);
1813
+ __decorate([
1814
+ Input()
1815
+ ], AdvancedTableComponent.prototype, "customSelect", void 0);
1816
+ __decorate([
1817
+ Input()
1818
+ ], AdvancedTableComponent.prototype, "selected", void 0);
1819
+ __decorate([
1820
+ Input()
1821
+ ], AdvancedTableComponent.prototype, "configSrc", void 0);
1822
+ __decorate([
1823
+ Input()
1824
+ ], AdvancedTableComponent.prototype, "rowGroup", void 0);
1825
+ __decorate([
1826
+ Input()
1827
+ ], AdvancedTableComponent.prototype, "headerTemplate", void 0);
1828
+ __decorate([
1829
+ Input()
1830
+ ], AdvancedTableComponent.prototype, "footerTemplate", void 0);
1831
+ __decorate([
1832
+ Input()
1833
+ ], AdvancedTableComponent.prototype, "detailsTemplate", void 0);
1834
+ __decorate([
1835
+ ViewChild('header')
1836
+ ], AdvancedTableComponent.prototype, "header", void 0);
1837
+ __decorate([
1838
+ ViewChild('footer')
1839
+ ], AdvancedTableComponent.prototype, "footer", void 0);
1840
+ __decorate([
1841
+ Input('config')
1842
+ ], AdvancedTableComponent.prototype, "config", null);
1843
+ __decorate([
1844
+ Input('showFooter')
1845
+ ], AdvancedTableComponent.prototype, "showFooter", null);
1846
+ __decorate([
1847
+ Input('showHeader')
1848
+ ], AdvancedTableComponent.prototype, "showHeader", null);
1849
+ __decorate([
1850
+ Input('showPaging')
1851
+ ], AdvancedTableComponent.prototype, "showPaging", null);
1852
+ __decorate([
1853
+ Input('query')
1854
+ ], AdvancedTableComponent.prototype, "query", null);
1855
+ AdvancedTableComponent = __decorate([
1856
+ Component({
1857
+ // tslint:disable-next-line: component-selector
1858
+ selector: 'app-advanced-table',
1859
+ template: "\n <table #table class=\"dataTable\">\n </table>\n <div #emptyTable class=\"d-none\">\n <div>\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-gray-300 border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-dark\" [translate]=\"'Tables.EmptyTableTitle'\"></h4>\n <p class=\"font-lg text-dark\" [translate]=\"'Tables.EmptyTableMessage'\"></p>\n </div>\n </div>\n </div>\n <div #errorTemplate class=\"d-none error-message\">\n <div class=\"text-center\">\n <div class=\"mt-4\">\n <div class=\"icon-circle bg-danger border-gray-100\"></div>\n </div>\n <div class=\"mt-4\">\n <h4 class=\"font-3xl text-secondary\" [translate]=\"'Tables.DataError.Title'\"></h4>\n <p class=\"font-lg text-secondary mb-1\" [translate]=\"'Tables.DataError.Message'\"></p>\n <p class=\"font-lg text-secondary error-inner-message\">\n <small></small>\n </p>\n </div>\n </div>\n </div>\n ",
1860
+ encapsulation: ViewEncapsulation.None,
1861
+ styles: ["@charset \"UTF-8\";div.dataTables_processing>div:last-child>div{background-color:var(--secondary)}table.dataTable thead .sorting{background-image:none}table.dataTable thead tr th{border-bottom:none;font-weight:500;font-size:.75rem}table.dataTable thead th{color:#73818e;font-size:.75rem;font-weight:600;padding-top:16px;padding-bottom:4px;border-bottom:none;padding-left:8px}table.dataTable tbody tr:first-child td:first-child{border-radius:6px 0}table.dataTable tbody tr:first-child td:last-child{border-radius:0 6px}table.dataTable tbody tr td:first-child{border-left:1px solid #c2cfd6}table.dataTable tbody tr td:last-child{border-right:1px solid #c2cfd6}table.dataTable tbody tr td{padding-top:8px;padding-bottom:8px;border-top:1px solid #c2cfd6}table.dataTable tbody tr{border-radius:6px}table.dataTable tbody tr:last-child td:first-child{border-radius:0 0 0 6px}table.dataTable tbody tr:last-child td:last-child{border-radius:0 0 6px}table.dataTable tbody tr:last-child td{border-bottom:1px solid #c2cfd6}table.dataTable tbody tr.dtrg-group.dtrg-start th{border:2px solid #c2cfd6;border-bottom:1px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr.dtrg-group.dtrg-end th{border-top:2px solid #c2cfd6;border-right:2px solid #c2cfd6;border-left:2px solid #c2cfd6;color:#3e515b;background-color:#f0f3f5}table.dataTable tbody tr:nth-last-child(1) th{border-bottom:2px solid #c2cfd6}table.dataTable td.dataTables_empty{border:none!important}table.dataTable .error-inner-message>small{overflow-wrap:break-word}table.dataTable.no-footer{border-bottom:none}.dataTables_paginate .btn.previous{margin-right:8px}.dataTables_paginate .btn.next{margin-left:8px}.dataTables_info,.dataTables_paginate{margin-top:1rem}.dataTables_paginate span .btn{border-radius:1.5rem}.dataTables_filter{display:none}.dataTables_wrapper.no-footer .dataTables_scrollBody{border-bottom:0;overflow:auto}.dataTables_paginate{display:none}.dataTable.processing{opacity:15%}.dataTables_wrapper .dataTables_processing{background:0 0;position:absolute;display:inline-block;top:25%;z-index:5;color:#73818e}.text-decoration-line-through{text-decoration:line-through!important}tr.removed .checkbox+label{visibility:hidden}table.dataTable td.details-control button{border:none;background-color:inherit;outline:0}table.dataTable td.details-control button::after{content:\"\u25B7\"}table.dataTable td.details-control{cursor:pointer}table.dataTable tr.dt-hasChild td.details-control button::after{content:\"\u25BD\"}"]
1862
+ }),
1863
+ __param(1, Inject(COLUMN_FORMATTERS)),
1864
+ __param(16, Optional())
1865
+ ], AdvancedTableComponent);
2229
1866
  return AdvancedTableComponent;
2230
1867
  }());
2231
1868
  export { AdvancedTableComponent };
2232
- if (false) {
2233
- /** @type {?} */
2234
- AdvancedTableComponent.prototype._query;
2235
- /** @type {?} */
2236
- AdvancedTableComponent.prototype._config;
2237
- /** @type {?} */
2238
- AdvancedTableComponent.prototype._firstLoad;
2239
- /** @type {?} */
2240
- AdvancedTableComponent.prototype._showFooter;
2241
- /** @type {?} */
2242
- AdvancedTableComponent.prototype._showHeader;
2243
- /** @type {?} */
2244
- AdvancedTableComponent.prototype._showPaging;
2245
- /** @type {?} */
2246
- AdvancedTableComponent.prototype._id;
2247
- /** @type {?} */
2248
- AdvancedTableComponent.prototype.smartSelect;
2249
- /** @type {?} */
2250
- AdvancedTableComponent.prototype.configChanges;
2251
- /** @type {?} */
2252
- AdvancedTableComponent.prototype.table;
2253
- /** @type {?} */
2254
- AdvancedTableComponent.prototype.emptyTable;
2255
- /** @type {?} */
2256
- AdvancedTableComponent.prototype.errorTemplate;
2257
- /** @type {?} */
2258
- AdvancedTableComponent.prototype.loadingTable;
2259
- /** @type {?} */
2260
- AdvancedTableComponent.prototype.height;
2261
- /** @type {?} */
2262
- AdvancedTableComponent.prototype.showActions;
2263
- /** @type {?} */
2264
- AdvancedTableComponent.prototype.autoLoad;
2265
- /** @type {?} */
2266
- AdvancedTableComponent.prototype.customEvent;
2267
- /** @type {?} */
2268
- AdvancedTableComponent.prototype.load;
2269
- /** @type {?} */
2270
- AdvancedTableComponent.prototype.init;
2271
- /** @type {?} */
2272
- AdvancedTableComponent.prototype.reload;
2273
- /** @type {?} */
2274
- AdvancedTableComponent.prototype.select;
2275
- /** @type {?} */
2276
- AdvancedTableComponent.prototype.draw;
2277
- /** @type {?} */
2278
- AdvancedTableComponent.prototype.page;
2279
- /** @type {?} */
2280
- AdvancedTableComponent.prototype.order;
2281
- /** @type {?} */
2282
- AdvancedTableComponent.prototype.scroll;
2283
- /** @type {?} */
2284
- AdvancedTableComponent.prototype.selectedItems;
2285
- /** @type {?} */
2286
- AdvancedTableComponent.prototype.beforeServerData;
2287
- /** @type {?} */
2288
- AdvancedTableComponent.prototype.afterServerData;
2289
- /** @type {?} */
2290
- AdvancedTableComponent.prototype.loading;
2291
- /** @type {?} */
2292
- AdvancedTableComponent.prototype.showDetails;
2293
- /** @type {?} */
2294
- AdvancedTableComponent.prototype.hideDetails;
2295
- /** @type {?} */
2296
- AdvancedTableComponent.prototype.scrollable;
2297
- /** @type {?} */
2298
- AdvancedTableComponent.prototype.serverSide;
2299
- /** @type {?} */
2300
- AdvancedTableComponent.prototype.lengthMenu;
2301
- /** @type {?} */
2302
- AdvancedTableComponent.prototype.paging;
2303
- /** @type {?} */
2304
- AdvancedTableComponent.prototype.pageLength;
2305
- /** @type {?} */
2306
- AdvancedTableComponent.prototype.columnOrdering;
2307
- /** @type {?} */
2308
- AdvancedTableComponent.prototype.stateSave;
2309
- /** @type {?} */
2310
- AdvancedTableComponent.prototype.stateLoadCallback;
2311
- /** @type {?} */
2312
- AdvancedTableComponent.prototype.stateSaveCallback;
2313
- /** @type {?} */
2314
- AdvancedTableComponent.prototype.scrollY;
2315
- /** @type {?} */
2316
- AdvancedTableComponent.prototype.scrollX;
2317
- /**
2318
- * Enables row selection. The defaulr value is false
2319
- * @type {?}
2320
- */
2321
- AdvancedTableComponent.prototype.selectable;
2322
- /**
2323
- * Enables or disable multiple selection. The default values is true.
2324
- * @type {?}
2325
- */
2326
- AdvancedTableComponent.prototype.multipleSelect;
2327
- /**
2328
- * Enables custom selection and hides select column. The default value is false
2329
- * @type {?}
2330
- */
2331
- AdvancedTableComponent.prototype.customSelect;
2332
- /** @type {?} */
2333
- AdvancedTableComponent.prototype.selected;
2334
- /** @type {?} */
2335
- AdvancedTableComponent.prototype.unselected;
2336
- /**
2337
- * Gets or sets a URL to load table configuration from
2338
- * @type {?}
2339
- */
2340
- AdvancedTableComponent.prototype.configSrc;
2341
- /** @type {?} */
2342
- AdvancedTableComponent.prototype.lastError;
2343
- /**
2344
- * Accepts array of properties as row group factors and displays grouped table.
2345
- * @type {?}
2346
- */
2347
- AdvancedTableComponent.prototype.rowGroup;
2348
- /** @type {?} */
2349
- AdvancedTableComponent.prototype.lastRowGroupOrder;
2350
- /** @type {?} */
2351
- AdvancedTableComponent.prototype.headerTemplate;
2352
- /** @type {?} */
2353
- AdvancedTableComponent.prototype.footerTemplate;
2354
- /** @type {?} */
2355
- AdvancedTableComponent.prototype.detailsTemplate;
2356
- /** @type {?} */
2357
- AdvancedTableComponent.prototype.header;
2358
- /** @type {?} */
2359
- AdvancedTableComponent.prototype.footer;
2360
- /** @type {?} */
2361
- AdvancedTableComponent.prototype.translator;
2362
- /** @type {?} */
2363
- AdvancedTableComponent.prototype.dataTable;
2364
- /** @type {?} */
2365
- AdvancedTableComponent.prototype.dtOptions;
2366
- /** @type {?} */
2367
- AdvancedTableComponent.prototype.lastQueryParams;
2368
- /** @type {?} */
2369
- AdvancedTableComponent.prototype._lastQueryTotalItems;
2370
- /** @type {?} */
2371
- AdvancedTableComponent.prototype.reloadSubscription;
2372
- /** @type {?} */
2373
- AdvancedTableComponent.prototype._context;
2374
- /** @type {?} */
2375
- AdvancedTableComponent.prototype._columnFormatters;
2376
- /** @type {?} */
2377
- AdvancedTableComponent.prototype._activatedRoute;
2378
- /** @type {?} */
2379
- AdvancedTableComponent.prototype._translateService;
2380
- /** @type {?} */
2381
- AdvancedTableComponent.prototype._injector;
2382
- /** @type {?} */
2383
- AdvancedTableComponent.prototype._advancedFilterValueProvider;
2384
- /** @type {?} */
2385
- AdvancedTableComponent.prototype._element;
2386
- /** @type {?} */
2387
- AdvancedTableComponent.prototype._template;
2388
- /** @type {?} */
2389
- AdvancedTableComponent.prototype._loading;
2390
- /** @type {?} */
2391
- AdvancedTableComponent.prototype._http;
2392
- /** @type {?} */
2393
- AdvancedTableComponent.prototype._columnSelector;
2394
- /** @type {?} */
2395
- AdvancedTableComponent.prototype._configuration;
2396
- /** @type {?} */
2397
- AdvancedTableComponent.prototype._exportSpreadsheet;
2398
- /** @type {?} */
2399
- AdvancedTableComponent.prototype._modalService;
2400
- /** @type {?} */
2401
- AdvancedTableComponent.prototype._errorService;
2402
- /** @type {?} */
2403
- AdvancedTableComponent.prototype._viewContainerRef;
2404
- /** @type {?} */
2405
- AdvancedTableComponent.prototype._errorHandler;
2406
- }
1869
+ export { ɵ0 };
2407
1870
  // const endRender = function (rows, group) { var count = rows.data(); rows.count();
2408
1871
  // return (`<ng-container [ngTemplateOutlet]="rowGroupTemplate" [ngTemplateOutletContext]="{ data: ${group} }"></ng-container>`); };
2409
1872
  // <ng-container [ngTemplateOutlet]="rowGroupTemplate" [ngTemplateOutletContext]="{ data: }"></ng-container>
2410
1873
  // return ('<span align="left""><strong>'+ group + ' ' + `(${totalHeader} ` + count.length + ')</strong></span>'); };
2411
- export { ɵ0 };
2412
-
2413
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEsT0FBTyxFQUNMLGlCQUFpQixFQUNqQixTQUFTLEVBQ1QsVUFBVSxFQUFFLFlBQVksRUFDeEIsTUFBTSxFQUNOLGNBQWMsRUFDZCxRQUFRLEVBQ1IsS0FBSyxFQUNHLE1BQU0sRUFDZCxTQUFTLEVBQ1QsaUJBQWlCLEVBSWpCLFdBQVcsRUFDWCxnQkFBZ0IsRUFFaEIsWUFBWSxFQUNaLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyx1QkFBdUIsRUFBOEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQWUsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUN4RCxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSx3QkFBd0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBR2pHLE9BQU8sS0FBSyxPQUFPLE1BQU0sUUFBUSxDQUFDO0FBQ2xDLE9BQU8sZ0JBQWdCLENBQUM7QUFDeEIsT0FBTyxFQUFDLFFBQVEsRUFBQyxNQUFN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OzBCQUVMLEtBQUs7MEJBQ0wsS0FBSzs2QkFJTCxLQUFLO2lDQUlMLEtBQUs7K0JBSUwsS0FBSzsyQkFDTCxLQUFLOzRCQUtMLEtBQUs7MkJBTUwsS0FBSztpQ0FHTCxLQUFLO2lDQUNMLEtBQUs7a0NBQ0wsS0FBSzt5QkFDTCxTQUFTLFNBQUMsUUFBUTt5QkFDbEIsU0FBUyxTQUFDLFFBQVE7eUJBS2xCLEtBQUssU0FBQyxRQUFROzZCQWtCZCxLQUFLLFNBQUMsWUFBWTs2QkF5QmpCLEtBQUssU0FBQyxZQUFZOzZCQWlDbkIsS0FBSyxTQUFDLFlBQVk7d0JBeUJsQixLQUFLLFNBQUMsT0FBTzs7aUNBcFdoQjs7U0F5S2Esc0JBQXNCIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgSW5wdXQsIE9uRGVzdHJveSxcbiAgT25Jbml0LCBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgQ29udGVudENoaWxkLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRXJyb3JIYW5kbGVyLFxuICBPcHRpb25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QW5ndWxhckRhdGFDb250ZXh0fSBmcm9tICdAdGhlbW9zdC9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUYWJsZUNvbmZpZ3VyYXRpb259IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0RhdGFTZXJ2aWNlUXVlcnlQYXJhbXN9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQge0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLCBPbkFkdmFuY2VkQ29sdW1uQWZ0ZXJSZW5kZXJ9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycyc7XG5pbXBvcnQge0NsaWVudERhdGFRdWVyeWFibGV9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQge0FkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcn0gZnJvbSAnLi9hZHZhbmNlZC1maWx0ZXItdmFsdWUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7VGVtcGxhdGVQaXBlLCBMb2FkaW5nU2VydmljZSwgQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gIE1vZGFsU2VydmljZSwgRElBTE9HX0JVVFRPTlMsIEVycm9yU2VydmljZSwgRXhwb3J0U3ByZWFkc2hlZXRTZXJ2aWNlfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5pbXBvcnQge0FkdmFuY2VkVGFibGVGb3JtYXR0ZXJzfSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMuaW50ZXJmYWNlJztcbi8vIGltcG9ydGFudCBub3RlOiB1c2UgdGhpcyBpbXBvcnQgdG8gYXZvaWQgQ2Fubm90IGNhbGwgYSBuYW1lc3BhY2UgKCdqcXVlcnknKSBlcnJvclxuaW1wb3J0ICogYXMgalF1ZXJ5XyBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldCc7XG5pbXBvcnQge3RlbXBsYXRlfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1yb3dncm91cCc7IC8vIHRoaXMgcGx1Z2luIGltcG9ydCBsaW5lIG11c3QgY29tZSBiZWZvcmUgdGhlIGZvbGxvd2luZyBkYXRhdGFibGVzIHBsdWdpbiBpbXBvcnRzXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LXNjcm9sbGVyJztcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtY29scmVvcmRlcic7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMnO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbHVtblNlbGVjdG9yU2VydmljZSB9IGZyb20gJy4uL2NvbHVtbi1zZWxlY3Rvci9jb2x1bW4tc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb24sIE1BWF9FWFBPUlRfSVRFTVMgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2J0bmV4cC5kaXJlY3RpdmUnO1xuXG4vLyByZXN0b3JlIGpxdWVyeSBpbXBvcnQgdG8gYXZvaWQgQ2Fubm90IGNhbGwgYSBuYW1lc3BhY2UgKCdqcXVlcnknKSBlcnJvclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcbmV4cG9ydCBpbnRlcmZhY2UgQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQge1xuICByZWNvcmRzVG90YWw6IG51bWJlcjtcbiAgcmVjb3Jkc0ZpbHRlcmVkOiBudW1iZXI7XG4gIGRhdGE6IEFycmF5PGFueT47XG59XG5cbmNvbnN0IERhdGFUYWJsZXNBcGk6IGFueSA9IGpRdWVyeS5mbi5kYXRhVGFibGUuQXBpO1xuRGF0YVRhYmxlc0FwaS5yZWdpc3RlciggJ3Byb2Nlc3NpbmcoKScsIGZ1bmN0aW9uKCBzaG93OiBhbnkgKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IoJ3RhYmxlJywgKCBjdHg6IGFueSApID0+IHtcbiAgICAgICAgY3R4Lm9BcGkuX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIGN0eCwgc2hvdyApO1xuICAgIH0gKTtcbn0pO1xuXG5jb25zdCBFTVBUWV9EQVRBU0VUID0ge1xuICByZWNvcmRzVG90YWw6IDAsXG4gIHJlY29yZHNGaWx0ZXJlZDogMCxcbiAgZGF0YTogW10sXG59O1xuXG5jbGFzcyBUYWJsZVRyYW5zbGF0aW9uQ2hhbmdlRGV0ZWN0b3IgZXh0ZW5kcyBDaGFuZ2VEZXRlY3RvclJlZiB7XG4gIHB1YmxpYyBjaGVja05vQ2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBkZXRhY2goKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgcmVhdHRhY2goKTogdm9pZCB7XG4gIH1cblxufVxuXG5leHBvcnQgbGV0IENPTFVNTl9GT1JNQVRURVJTID0gbmV3IEluamVjdGlvblRva2VuKCdjb2x1bW4uZm9ybWF0dGVycycpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yIGV4dGVuZHMgUmFuZ2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFeHBvcnRMaW1pdEV4Y2VlZGVkRXJyb3InO1xuICB9XG59XG5cbmNsYXNzIENvbHVtbkZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xhc3M/OiBzdHJpbmc7XG4gIHB1YmxpYyBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBkZWZhdWx0Q29udGVudD86IHN0cmluZztcbiAgcHVibGljIGZvcm1hdFN0cmluZz86IHN0cmluZztcbiAgcHVibGljIGZvcm1hdHRlcj86IHN0cmluZztcbiAgcHVibGljIGhpZGRlbj86IGJvb2xlYW47XG4gIHB1YmxpYyBuYW1lPzogc3RyaW5nO1xuICBwdWJsaWMgb3JkZXI/OiBzdHJpbmc7XG4gIHB1YmxpYyBwcm9wZXJ0eT86IHN0cmluZztcbiAgcHVibGljIHNvcnRhYmxlPzogYm9vbGVhbjtcbiAgcHVibGljIHRpdGxlID0gJyc7XG5cbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IGFueSwgcm93OiBhbnksIG1ldGE6IGFueSkge1xuICAgIC8vXG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VDYXN0PFQ+KGlucHV0OiBhbnkpOiBUIHtcbiAgcmV0dXJuIGlucHV0O1xufVxuXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRUYWJsZUNvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgc3RhdGljIGNhc3QoaW5wdXQ6IGFueSwgY2xvbmU/OiBib29sZWFuKTogVGFibGVDb25maWd1cmF0aW9uIHtcbiAgICBpZiAoY2xvbmUpIHtcbiAgICAgIHJldHVybiBmb3JjZUNhc3Q8VGFibGVDb25maWd1cmF0aW9uPihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gZm9yY2VDYXN0PFRhYmxlQ29uZmlndXJhdGlvbj4oaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJhbmRvbUlkZW50aWZpZXIoKSB7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyKFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKSlcbiAgKS50b1N0cmluZygzNik7XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2FwcC1hZHZhbmNlZC10YWJsZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRhYmxlICN0YWJsZSBjbGFzcz1cImRhdGFUYWJsZVwiPlxuICAgIDwvdGFibGU+XG4gICAgPGRpdiAjZW1wdHlUYWJsZSBjbGFzcz1cImQtbm9uZVwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jaXJjbGUgYmctZ3JheS0zMDAgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtZGFya1wiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5FbXB0eVRhYmxlVGl0bGUnXCI+PC9oND5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1kYXJrXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkVtcHR5VGFibGVNZXNzYWdlJ1wiPjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNlcnJvclRlbXBsYXRlIGNsYXNzPVwiZC1ub25lIGVycm9yLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZSBiZy1kYW5nZXIgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtc2Vjb25kYXJ5XCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkRhdGFFcnJvci5UaXRsZSdcIj48L2g0PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1sZyB0ZXh0LXNlY29uZGFyeSBtYi0xXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkRhdGFFcnJvci5NZXNzYWdlJ1wiPjwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1zZWNvbmRhcnkgZXJyb3ItaW5uZXItbWVzc2FnZVwiPlxuICAgICAgICAgICAgPHNtYWxsPjwvc21hbGw+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgcHJpdmF0ZSBfcXVlcnk/OiBDbGllbnREYXRhUXVlcnlhYmxlO1xuICBwcml2YXRlIF9jb25maWc/OiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgX2ZpcnN0TG9hZCA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dGb290ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd0hlYWRlciA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dQYWdpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaWQgPSBnZXRSYW5kb21JZGVudGlmaWVyKCk7XG4gIHB1YmxpYyBzbWFydFNlbGVjdCA9IGZhbHNlO1xuICBwdWJsaWMgY29uZmlnQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZScpIHB1YmxpYyB0YWJsZT86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VtcHR5VGFibGUnKSBwdWJsaWMgZW1wdHlUYWJsZT86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Vycm9yVGVtcGxhdGUnKSBwdWJsaWMgZXJyb3JUZW1wbGF0ZT86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2xvYWRpbmdUYWJsZScpIHB1YmxpYyBsb2FkaW5nVGFibGU/OiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0ID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0FjdGlvbnMgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYXV0b0xvYWQgPSB0cnVlO1xuICBAT3V0cHV0KCdjdXN0b21FdmVudCcpIHB1YmxpYyBjdXN0b21FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnbG9hZCcpIHB1YmxpYyBsb2FkOiBFdmVudEVtaXR0ZXI8QWR2YW5jZWRUYWJsZURhdGFSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBZHZhbmNlZFRhYmxlRGF0YVJlc3VsdD4oKTtcbiAgQE91dHB1dCgnaW5pdCcpIHB1YmxpYyBpbml0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoJ3JlbG9hZCcpIHB1YmxpYyByZWxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ3NlbGVjdCcpIHB1YmxpYyBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ2RyYXcnKSBwdWJsaWMgZHJhdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgncGFnZScpIHB1YmxpYyBwYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdvcmRlcicpIHB1YmxpYyBvcmRlcjogRXZlbnRFbWl0dGVyPGFueVtdW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXVtdPigpO1xuICBAT3V0cHV0KCdzY3JvbGwnKSBwdWJsaWMgc2Nyb2xsOiBFdmVudEVtaXR0ZXI8eyB0b3A6IG51bWJlcjsgbGVmdDogbnVtYmVyIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgnc2VsZWN0ZWRJdGVtcycpIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdiZWZvcmVTZXJ2ZXJEYXRhJykgcHVibGljIGJlZm9yZVNlcnZlckRhdGE6IEV2ZW50RW1pdHRlcjxDbGllbnREYXRhUXVlcnlhYmxlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xpZW50RGF0YVF1ZXJ5YWJsZT4oKTtcbiAgQE91dHB1dCgnYWZ0ZXJTZXJ2ZXJEYXRhJykgcHVibGljIGFmdGVyU2VydmVyRGF0YTogRXZlbnRFbWl0dGVyPHsgc2tpcD86IG51bWJlciwgdG90YWw/OiBudW1iZXIsIHZhbHVlOiBhbnlbXX0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNraXA/OiBudW1iZXIsIHRvdGFsPzogbnVtYmVyLCB2YWx1ZTogYW55W119PigpO1xuICBAT3V0cHV0KCdsb2FkaW5nJykgcHVibGljIGxvYWRpbmc6IEV2ZW50RW1pdHRlcjx7XG4gICAgdGFyZ2V0OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50XG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGFyZ2V0OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50XG4gIH0+KCk7XG4gIEBPdXRwdXQoJ3Nob3dEZXRhaWxzJykgcHVibGljIHNob3dEZXRhaWxzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdoaWRlRGV0YWlscycpIHB1YmxpYyBoaWRlRGV0YWlsczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXJ2ZXJTaWRlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGxlbmd0aE1lbnUgPSBbNTAsIDEwMCwgMjAwLCA1MDBdO1xuICBASW5wdXQoKSBwdWJsaWMgcGFnaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHBhZ2VMZW5ndGggPSAyNTtcbiAgQElucHV0KCkgcHVibGljIGNvbHVtbk9yZGVyaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZVNhdmUgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlTG9hZENhbGxiYWNrPzogKHNldHRpbmdzOiBhbnksIGNhbGxiYWNrOiAoc3RhdGU6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlU2F2ZUNhbGxiYWNrPzogKHNldHRpbmdzOiBhbnksIHN0YXRlOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgcHVibGljIHNjcm9sbFkgPSA4MDA7XG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxYID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcm93IHNlbGVjdGlvbi4gVGhlIGRlZmF1bHIgdmFsdWUgaXMgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGUgbXVsdGlwbGUgc2VsZWN0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZXMgaXMgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZVNlbGVjdDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIC8qKlxuICAgKiBFbmFibGVzIGN1c3RvbSBzZWxlY3Rpb24gYW5kIGhpZGVzIHNlbGVjdCBjb2x1bW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVNlbGVjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IGFueVtdID0gW107XG4gIHB1YmxpYyB1bnNlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgVVJMIHRvIGxvYWQgdGFibGUgY29uZmlndXJhdGlvbiBmcm9tXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgY29uZmlnU3JjPzogc3RyaW5nO1xuICBwdWJsaWMgbGFzdEVycm9yOiBhbnk7XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYXJyYXkgb2YgcHJvcGVydGllcyBhcyByb3cgZ3JvdXAgZmFjdG9ycyBhbmQgZGlzcGxheXMgZ3JvdXBlZCB0YWJsZS5cbiAgICovXG4gIEBJbnB1dCgpIHJvd0dyb3VwOiAgc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBsYXN0Um93R3JvdXBPcmRlcj86IHsgY29sdW1uOiBudW1iZXI7IGRpcmVjdGlvbjogc3RyaW5nOyB9IHwgbnVsbDtcblxuICBASW5wdXQoKSBoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgcHJpdmF0ZSBkZXRhaWxzVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdoZWFkZXInKSBoZWFkZXI/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdmb290ZXInKSBmb290ZXI/OiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQElucHV0KCdjb25maWcnKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fY29uZmlnID0gdmFsdWU7XG4gICAgLy8gcmFpc2Ugc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5jb25maWdDaGFuZ2VzLm5leHQodGhpcy5fY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcgYXMgVGFibGVDb25maWd1cmF0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBsYXN0UXVlcnlUb3RhbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICBASW5wdXQoJ3Nob3dGb290ZXInKVxuICBwdWJsaWMgc2V0IHNob3dGb290ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93Rm9vdGVyID0gdmFsdWU7XG4gICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZXNfaW5mbycpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93Rm9vdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICAgQElucHV0KCdzaG93SGVhZGVyJylcbiAgIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICB0aGlzLl9zaG93SGVhZGVyID0gdmFsdWU7XG4gICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGU+dGhlYWQnKTtcbiAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICAgfVxuICAgICAgIGNvbnN0IGRhdGFUYWJsZSA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlJyk7XG4gICAgICAgaWYgKGRhdGFUYWJsZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgICB9XG4gICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xuICAgICAgICAgLy8gYWRkIHRvcCBtYXJnaW5cbiAgICAgICAgIGRhdGFUYWJsZS5jbGFzc0xpc3QucmVtb3ZlKCdtdC0yJyk7XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAvLyByZW1vdmUgdG9wIG1hcmdpblxuICAgICAgICAgZGF0YVRhYmxlLmNsYXNzTGlzdC5hZGQoJ210LTInKTtcbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICAgcHVibGljIGdldCBzaG93SGVhZGVyKCkge1xuICAgICByZXR1cm4gdGhpcy5fc2hvd0hlYWRlcjtcbiAgIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgcGFnaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgdmlzaWJsZSBvciBub3RcbiAgICovXG4gIEBJbnB1dCgnc2hvd1BhZ2luZycpXG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2luZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dQYWdpbmcgPSB2YWx1ZTtcbiAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19wYWdpbmF0ZScpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpRdWVyeShlbGVtZW50KS5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93UGFnaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGFnaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhbiBhY3RpdmUgcXVlcnkgZm9yIHRoaXMgdGFibGVcbiAgICovXG4gIEBJbnB1dCgncXVlcnknKVxuICBwdWJsaWMgc2V0IHF1ZXJ5KHZhbHVlOiBDbGllbnREYXRhUXVlcnlhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5IGFzIENsaWVudERhdGFRdWVyeWFibGU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNsYXRvcjogVHJhbnNsYXRlUGlwZTtcbiAgcHVibGljIGRhdGFUYWJsZTogYW55O1xuICBwdWJsaWMgZHRPcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgbGFzdFF1ZXJ5UGFyYW1zPzogRGF0YVNlcnZpY2VRdWVyeVBhcmFtcztcbiAgcHJpdmF0ZSBfbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IDA7XG4gIHByaXZhdGUgcmVsb2FkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgICAgICAgICAgIEBJbmplY3QoQ09MVU1OX0ZPUk1BVFRFUlMpIHByaXZhdGUgX2NvbHVtbkZvcm1hdHRlcnM6IEFkdmFuY2VkVGFibGVGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICBwcml2YXRlIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyOiBBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlOiBUZW1wbGF0ZVBpcGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2xvYWRpbmc6IExvYWRpbmdTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3RvcjogQ29sdW1uU2VsZWN0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZXhwb3J0U3ByZWFkc2hlZXQ6IEV4cG9ydFNwcmVhZHNoZWV0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9lcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlcikge1xuICAgIC8vIGluaXRpYWxpemUgdHJhbnNsYXRlIHBpcGVcbiAgICB0aGlzLnRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRlUGlwZSh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLCBuZXcgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yKCkpO1xuICAgIGpRdWVyeS5mbi5kYXRhVGFibGUuZXh0LmNsYXNzZXMuc1BhZ2VCdXR0b24gPSAnYnRuJztcbiAgICBqUXVlcnkuZm4uZGF0YVRhYmxlLmV4dC5jbGFzc2VzLnNQYWdlQnV0dG9uQWN0aXZlID0gJ2J0biBidG4tbGlnaHQnO1xuICAgIHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmZldGNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzaW1wbGUgc2VhcmNoXG4gIHB1YmxpYyBzZWFyY2goc2VhcmNoVGV4dCkge1xuICAgIHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5IHx8IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZSkge1xuICAgICAgaWYgKHNlYXJjaFRleHQgJiYgdGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbikge1xuICAgICAgICAvLyB2YWxpZGF0ZSBzZWFyY2ggdGV4dCBpbiBkb3VibGUgcXVvdGVzXG4gICAgICAgIGlmICgvXlwiKC4qPylcIiQvLnRlc3Qoc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJyxcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlLnRyYW5zZm9ybSh0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIHRleHQ6IHNlYXJjaFRleHQucmVwbGFjZSgvXlwifFwiJC9nLCAnJyksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdHJ5IHRvIHNwbGl0IHdvcmRzXG4gICAgICAgICAgY29uc3Qgd29yZHMgPSBzZWFyY2hUZXh0LnNwbGl0KCcgJyk7XG4gICAgICAgICAgLy8gam9pbiB3b3JkcyB0byBhIHNpbmdsZSBmaWx0ZXJcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB3b3Jkcy5tYXAoKHdvcmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZS50cmFuc2Zvcm0oKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLnNlYXJjaEV4cHJlc3Npb24pIGFzIHN0cmluZywge1xuICAgICAgICAgICAgICB0ZXh0OiB3b3JkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuam9pbignIGFuZCAnKTtcbiAgICAgICAgICAvLyBzZXQgZmlsdGVyXG4gICAgICAgICAgdGhpcy5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNsZWFyIGZpbHRlclxuICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW5zdXJlIGVtcHR5IHRhYmxlIGxheW91dFxuICAgICAgdGhpcy5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgIC8vIHNlYXJjaCBsb2NhbGx5XG4gICAgICB0aGlzLmRhdGFUYWJsZS5zZWFyY2goc2VhcmNoVGV4dC50cmltKCkpLmRyYXcoKTtcbiAgICAgIC8vIGdldCBpbmRleGVzIG9mIGZpbHRlcmVkIHJvd3NcbiAgICAgIGNvbnN0IGluZGV4ZXMgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0uYWlEaXNwbGF5KTtcbiAgICAgIC8vIHNldCByZWNvcmRzRmlsdGVyZWRcbiAgICAgIGNvbnN0IHJlY29yZHNGaWx0ZXJlZCA9IGluZGV4ZXMubGVuZ3RoO1xuICAgICAgLy8gc2V0IHJlY29yZHNUb3RhbFxuICAgICAgY29uc3QgcmVjb3Jkc1RvdGFsID0gaW5kZXhlcy5sZW5ndGg7XG4gICAgICAvLyByZXRyaWV2ZSBkYXRhIGZyb20gaW5kZXhlc1xuICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5kZXhlcy5tYXAoaW5kZXggPT4gcm93c1s8bnVtYmVyPmluZGV4XSk7XG4gICAgICAvLyBlbWl0IHJlc3VsdHMgdG8gbG9hZCBvdXRwdXRcbiAgICAgIHRoaXMubG9hZC5lbWl0KHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiByZWNvcmRzRmlsdGVyZWQsXG4gICAgICAgIHJlY29yZHNUb3RhbDogcmVjb3Jkc1RvdGFsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmV0Y2goY2xlYXJTZWxlY3RlZD86IGJvb2xlYW4pIHtcbiAgICAvLyBpZiBkYXRhIHRhYmxlIGlzIG51bGxcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgPT0gbnVsbCkge1xuICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlXG4gICAgICByZXR1cm4gdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cbiAgICAvLyBjbGVhciBzZWxlY3Rpb24gaWYgcGFyYW1ldGVyIGlzIG5vdCBkZWNsYXJlZCBvciBpdCdzIHRydWVcbiAgICBpZiAoY2xlYXJTZWxlY3RlZCA9PSBudWxsIHx8IGNsZWFyU2VsZWN0ZWQgPT09IHRydWUpIHtcbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIGxvYWQgZGF0YSBvbmx5XG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMudGFibGUpIHtcbiAgICAgICAgalF1ZXJ5KHRoaXMudGFibGUubmF0aXZlRWxlbWVudCkuZW1wdHkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gbnVsbDtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIGRhdGEgcm93XG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Um93KHJvdzogYW55LCBzaWxlbnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgLy8gZ2V0IHJvd1xuICAgICAgY29uc3Qgcm93Tm9kZSA9IHJvdy5ub2RlKCk7XG4gICAgICAvLyBpZiBtdWx0aXBsZSBzZWxlY3QgaXMgZmFsc2VcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gZW51bWVyYXRlIHJvd1xuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ub2RlcygpLmVhY2goKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHJvd05vZGUpIHtcbiAgICAgICAgICAgICAgalF1ZXJ5KG5vZGUpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhVGFibGUucm93cygnLnNlbGVjdGVkJykubm9kZXMoKS5lYWNoKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlICE9PSByb3dOb2RlKSB7XG4gICAgICAgICAgICAgIGpRdWVyeShub2RlKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhciBzZWxlY3RlZFxuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3dOb2RlKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgYWRkIGNsYXNzXG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdldCByb3cgZGF0YVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIHNlYXJjaCBzZWxlY3RlZCBpdGVtc1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgLy8gdmFsaWRhdGUgdW5zZWxlY3RlZCBkYXRhXG4gICAgICBmaW5kSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnNlbGVjdHMgdGhlIHNwZWNpZmllZCBkYXRhIHJvdyBpZiBpdCdzIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgdW5TZWxlY3RSb3cocm93OiBhbnksIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCBjbGFzc1xuICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgZmlyc3QgY29sdW1uIGtleVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YVtrZXldO1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuc21hcnRTZWxlY3QpIHtcbiAgICAgICAgICAvLyBhZGQgdGhpcyByb3cgdG8gdW5zZWxlY3RlZCByb3dzXG4gICAgICAgICAgZmluZEluZGV4ID0gdGhpcy51bnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZpbmRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RBbnkoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gdHJ1ZTtcbiAgICAgIC8vIHNlbGVjdCBhbnkgcm93XG4gICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZXZlcnkoKGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KCBpbmRleCApO1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdE5vbmUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gc2VsZWN0IGFueSByb3dcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ldmVyeSgoaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3coIGluZGV4ICk7XG4gICAgICAgIHRoaXMudW5TZWxlY3RSb3cocm93LCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RSb3cocm93OiBhbnkpIHtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4ga2V5XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ubmFtZSB8fCAnJztcbiAgICAgIC8vIGdldCBpZFxuICAgICAgY29uc3QgaWQgPSBkYXRhW2tleV07XG4gICAgICAvLyBmaW5kIGlmIHJvdyBpcyBzZWxlY3RlZFxuICAgICAgY29uc3QgZmluZEluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaXMgc2VsZWN0ZWRcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICAvLyB1bnNlbGVjdFxuICAgICAgICB0aGlzLnVuU2VsZWN0Um93KHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG4gIC8qKlxuICAgKiBEYXRhdGFibGVzIGNvbHVtbiByZW5kZXJlciBmb3Igc2VsZWN0IGNoZWNrYm94XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIG1ldGFcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlclNlbGVjdChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmICh0eXBlb2YgY29sdW1uLnNlbGVjdFRlbXBsYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgICBzZWxlY3RUZW1wbGF0ZTogdGVtcGxhdGUoYDxpbnB1dCBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94LXRoZW1lIHMtcm93XCIgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgaWQ9XCJzLSR7dGhpcy5faWR9LVxcJHttZXRhLnJvd31cIiBkYXRhLWlkPVwiXFwke2RhdGF9XCIgLz48bGFiZWwgZm9yPVwicy0ke3RoaXMuX2lkfS1cXCR7bWV0YS5yb3d9XCI+Jm5ic3A7PC9sYWJlbD5cbiAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gcmVuZGVyIHRlbXBsYXRlXG4gICAgcmV0dXJuIGNvbHVtbi5zZWxlY3RUZW1wbGF0ZSh7XG4gICAgICBtZXRhLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMubG9hZGluZy5lbWl0KHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzXG4gICAgICB9KTtcbiAgICAgIC8vIHBhcnNlIHByb3BlcnRpZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdzZWxlY3RhYmxlJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gdGhpcy5jb25maWcuc2VsZWN0YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdtdWx0aXBsZVNlbGVjdCcpKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3QgPSB0aGlzLmNvbmZpZy5tdWx0aXBsZVNlbGVjdDtcbiAgICAgIH1cbiAgICAgIC8vIHByZXBhcmUgY29uZmlndXJhdGlvbiBmb3IgY29sdW1uc1xuICAgICAgY29uc3QgdGFibGVDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1uc1xuICAgICAgICAvLyBmaWx0ZXIgYWN0aW9uIGxpbmsgY29sdW1uXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyICYmIGNvbHVtbi5mb3JtYXR0ZXIgPT09ICdBY3Rpb25MaW5rRm9ybWF0dGVyJyAmJiB0aGlzLnNob3dBY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAvLyBjb252ZXJ0IGNvbHVtbiB0byBhZHZhbmNlIHRhYmxlIGNvbHVtblxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDb2x1bW5Gb3JtYXR0ZXIodGhpcy5faW5qZWN0b3IpLCBjb2x1bW4pO1xuICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBkYXRhOiBjb2x1bW4ucHJvcGVydHkgfHwgY29sdW1uLm5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0Q29udGVudDogY29sdW1uLmRlZmF1bHRDb250ZW50ICE9IG51bGwgPyBjb2x1bW4uZGVmYXVsdENvbnRlbnQgOiAnJyxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0b3IudHJhbnNmb3JtKGNvbHVtbi50aXRsZSksXG4gICAgICAgICAgICBzb3J0YWJsZTogY29sdW1uLmhhc093blByb3BlcnR5KCdzb3J0YWJsZScpID8gY29sdW1uLnNvcnRhYmxlIDogdHJ1ZSxcbiAgICAgICAgICAgIHZpc2libGU6IGNvbHVtbi5oYXNPd25Qcm9wZXJ0eSgnaGlkZGVuJykgPyAhY29sdW1uLmhpZGRlbiA6IHRydWUsXG4gICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGNvbHVtbi5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGNvbHVtbi5jbGFzc05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICAgICAgICAoY29sdW1uLmZvcm1hdHRlcnMgYXMgYW55W10pLmZvckVhY2goKGNvbHVtbkZvcm1hdHRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gc2VsZi5fY29sdW1uRm9ybWF0dGVyc1tjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0dGVyXTtcbiAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgJiYgdHlwZW9mIGZvcm1hdHRlci5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdFN0cmluZyA9IGNvbHVtbkZvcm1hdHRlci5mb3JtYXRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXRPcHRpb25zID0gY29sdW1uRm9ybWF0dGVyLmZvcm1hdE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXR0ZXIucmVuZGVyLmJpbmQoY29sdW1uKShyZXN1bHQsIHR5cGUsIHJvdywgbWV0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5mb3JtYXRTdHJpbmc7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5mb3JtYXRPcHRpb25zO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvbHVtbiBmb3JtYXR0ZXJzIGV4cG9ydCBjcmVhdGVkQ2VsbCBldmVudFxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBjb2x1bW4uZm9ybWF0dGVycy5maWx0ZXIoKGNvbHVtbkZvcm1hdHRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgY29sdW1uRm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVkQ2VsbChjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcikge1xuICAgICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHNlbGYuX2NvbHVtbkZvcm1hdHRlcnNbY29sdW1uRm9ybWF0dGVyLmZvcm1hdHRlcl0gYXMgYW55IGFzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyLmFmdGVyUmVuZGVyLmJpbmQoY29sdW1uKShjZWxsLCBjZWxsRGF0YSwgcm93RGF0YSwgcm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHNlbGYuX2NvbHVtbkZvcm1hdHRlcnNbY29sdW1uLmZvcm1hdHRlcl07XG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVyICYmIHR5cGVvZiBmb3JtYXR0ZXIucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIHJlbmRlcjogZm9ybWF0dGVyLnJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJGb3JtYXR0ZXIgPSBmb3JtYXR0ZXIgYXMgYW55IGFzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlcjtcbiAgICAgICAgICAgIGlmIChhZnRlclJlbmRlckZvcm1hdHRlciAmJiB0eXBlb2YgYWZ0ZXJSZW5kZXJGb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmb3JtYXR0ZXIucmVuZGVyLmJpbmQoY29sdW1uKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRDZWxsOiBhZnRlclJlbmRlckZvcm1hdHRlci5hZnRlclJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29sdW1uRGVmaW5pdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAvLyBnZXQgdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0galF1ZXJ5KHRoaXMudGFibGUgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGUuY29sdW1ucy5hZGp1c3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEpO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gICAgICB0YWJsZUVsZW1lbnQub24oJ3Byb2Nlc3NpbmcuZHQnLCAoZXZlbnQsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgLy8gY2xlYXIgZW1wdHkgdGFibGUgZWxlbWVudFxuICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKCcuZGF0YVRhYmxlc19lbXB0eScpLmh0bWwoJycpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGVFbGVtZW50LmFkZENsYXNzKCdwcm9jZXNzaW5nJyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0YWJsZUVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3Byb2Nlc3NpbmcnKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgZHJhd0luZGV4ID0gMTtcbiAgICAgIHRhYmxlRWxlbWVudC5vbignb3JkZXIuZHQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuZGF0YVRhYmxlLm9yZGVyKCk7XG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRhYmxlQ29sdW1ucztcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLmVtaXQob3JkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkub24oJ2RyYXcuZHQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3LmVtaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgaW5mbzogeyBwYWdlOiBudW1iZXI7IHBhZ2VzOiBudW1iZXIgfSA9IHRoaXMuZGF0YVRhYmxlLnBhZ2UuaW5mbygpO1xuICAgICAgICAgIHRoaXMucGFnZS5lbWl0KGluZm8pO1xuICAgICAgICAgIGlmIChkcmF3SW5kZXggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkcmF3SW5kZXgrKztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge3RoaXMuZGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KCk7IH0sIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRVJST1InLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRqdXN0aW5nIHRhYmxlIGNvbHVtbnMnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBhbGxvdyBzZWxlY3Rpb25cbiAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgLy8gZ2V0IGZpcnN0IGNvbHVtbiAoYXMgcm93IHByaW1hcnkga2V5KVxuICAgICAgICAvLyB0b2RvOjphbGxvdyByb3cgcHJpbWFyeSBrZXkgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBmaXJzdENvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF07XG4gICAgICAgIC8vIGFkZCBzZWxlY3QgY29sdW1uXG4gICAgICAgIGNvbnN0IHNlbGVjdENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndGV4dC1jZW50ZXIgcGwtNCBwci0wJyxcbiAgICAgICAgICBkYXRhOiBmaXJzdENvbHVtbi5wcm9wZXJ0eSB8fCBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICAgIGRlZmF1bHRDb250ZW50OiAnJyxcbiAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZpc2libGU6ICF0aGlzLmN1c3RvbVNlbGVjdCxcbiAgICAgICAgICBuYW1lOiBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICB9O1xuICAgICAgICAvLyBhc3NpZ24gcmVuZGVyZXJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RDb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgcmVuZGVyOiB0aGlzLl9yZW5kZXJTZWxlY3QuYmluZCh0aGlzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFuZCBmaW5hbGx5IGFkZCBjb2x1bW5cbiAgICAgICAgdGFibGVDb2x1bW5zLnVuc2hpZnQoc2VsZWN0Q29sdW1uRGVmaW5pdGlvbik7XG4gICAgICAgIC8vIHVzZXIgaW50ZXJmYWNlIGFkZGl0aW9uc1xuICAgICAgICAvLyBoYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQgKGEgdHJpY2sgZm9yIGZpcmluZyBkcmF3LmR0IGV2ZW50cylcbiAgICAgICAgdGFibGVFbGVtZW50XG4gICAgICAgICAgLy8gaGFuZGxlIGRyYXcgZXZlbnRzXG4gICAgICAgICAgLm9uKCdkcmF3LmR0JywgKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QpIHtcbiAgICAgICAgICAgICAgLy8gZW5hYmxlIHJvdyBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ3Rib2R5Jykub24oJ2NsaWNrJywgJ3RyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHJvd1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGYuZGF0YVRhYmxlLnJvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgcm93XG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3QuZW1pdChyb3cpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0LnMtcm93Jyk7XG4gICAgICAgICAgICBlbGVtZW50cy5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc2VsZWN0aW9uIG9uIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gZW51bWVyYXRlIHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgcm93IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1ba2V5XTtcbiAgICAgICAgICAgICAgICAvLyBpZiBpZGVudGlmaWVyIGlzIGRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgY2hlY2sgZWxlbWVudCB3aXRoIHRoaXMgaWRlbnRpZmllciBpbiBhdHRyaWJ1dGUgZGF0YS1pZFxuICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoYGlucHV0W2RhdGEtaWQ9JyR7aWR9J11gKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNtYXJ0U2VsZWN0KSB7XG4gICAgICAgICAgICAgIC8vIHNlbGVjdCByb3dzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAvLyBhbmQgZG8gbm90IGluY2x1ZGVkIGluIHVuc2VsZWN0ZWQgY29sbGVjdGlvblxuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGdldCBkYXRhIGlkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG4gICAgICAgICAgICAgICAgICByZXR1cm4geFtrZXldID09IGpRdWVyeShlbGVtZW50KS5hdHRyKCdkYXRhLWlkJyk7XG4gICAgICAgICAgICAgICAgfSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyh0aGlzLmRhdGFUYWJsZS5yb3coaW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gZGlzcGxheSByb3cgZGV0YWlsc1xuICAgICAgaWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHNTdHJpbmcgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5Sb3dEZXRhaWxzJyk7XG4gICAgICAgIGNvbnN0IGZpcnN0Q29sdW1uID0gdGhpcy5jb25maWcuY29sdW1uc1swXTtcbiAgICAgICAgY29uc3Qgc2hvd0RldGFpbHNDb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2RldGFpbHMtY29udHJvbCBwbC00IHByLTAnLFxuICAgICAgICAgIGRhdGE6IGZpcnN0Q29sdW1uLnByb3BlcnR5IHx8IGZpcnN0Q29sdW1uLm5hbWUsXG4gICAgICAgICAgZGVmYXVsdENvbnRlbnQ6ICcnLFxuICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmlzaWJsZTogIXRoaXMuY3VzdG9tU2VsZWN0LFxuICAgICAgICAgIG5hbWU6IGZpcnN0Q29sdW1uLm5hbWUsXG4gICAgICAgICAgcmVuZGVyOiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYDxidXR0b24gcm9sZT1cImJ1dHRvblwiIHRpdGxlPVwiJHtkZXRhaWxzU3RyaW5nfVwiIGFyaWFsLWxhYmVsPVwiJHtkZXRhaWxzU3RyaW5nfVwiPjwvYnV0dG9uPmA7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gYW5kIGZpbmFsbHkgYWRkIGNvbHVtblxuICAgICAgICB0YWJsZUNvbHVtbnMudW5zaGlmdChzaG93RGV0YWlsc0NvbHVtbkRlZmluaXRpb24pO1xuXG4gICAgICAgIC8vIHVzZXIgaW50ZXJmYWNlIGFkZGl0aW9uc1xuICAgICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgZm9yIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGV0YWlsc1xuICAgICAgICB0YWJsZUVsZW1lbnQub24oJ2NsaWNrJywgJ3RkLmRldGFpbHMtY29udHJvbCcsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IGUudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBzZWxmLmRhdGFUYWJsZS5yb3codHIpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHNWaWV3UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5kZXRhaWxzVGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgcm93RGF0YTogcm93LmRhdGEoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGV0YWlsc1ZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWlsc1ZpZXdSZWYucm9vdE5vZGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldGFpbHNUZW1wbGF0ZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBub2RlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGV0YWlsc1ZpZXdSZWYucm9vdE5vZGVzWzBdKTtcblxuICAgICAgICAgICAgaWYgKHJvdy5jaGlsZC5pc1Nob3duKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJvdyBpcyBhbHJlYWR5IG9wZW4gLSBjbG9zZSBpdFxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZURldGFpbHMuZW1pdCgpO1xuICAgICAgICAgICAgICAgIHJvdy5jaGlsZC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICBkZXRhaWxzVmlld1JlZi5kZXN0cm95KCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3BlbiB0aGlzIHJvd1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RldGFpbHMuZW1pdCh7cm93fSk7XG4gICAgICAgICAgICAgICAgcm93LmNoaWxkKGNvbnRhaW5lcikuc2hvdygpO1xuICAgICAgICAgICAgICAgIHJvdy5jaGlsZCgpLmFkZENsYXNzKCdkdC1jaGlsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZVxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgIC8vIHNldCBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhNZW51OiBbNSwgMTAsIDUwLCAxMDAsIDIwMCwgNTAwXSxcbiAgICAgICAgLy8gaGlkZSBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAvLyBlbmFibGUgc2VhcmNoIGJ1dCBoaWRlIHNlYXJjaCBib3ggKGNzcylcbiAgICAgICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgICAgICAvLyBlbmFibGUgZGF0YSBwcm9jZXNzaW5nXG4gICAgICAgIHByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgIC8vIGVuYWJsZSBnZXR0aW5nIHNlcnZlciBzaWRlIGRhdGFcbiAgICAgICAgc2VydmVyU2lkZTogdGhpcy5zZXJ2ZXJTaWRlLFxuICAgICAgICAvLyBlbnVtZXJhdGUgdGFibGUgY29sdW1uc1xuICAgICAgICBjb2x1bW5zOiB0YWJsZUNvbHVtbnMsXG4gICAgICAgIGNvbFJlb3JkZXI6ICB0aGlzLmNvbHVtbk9yZGVyaW5nLFxuICAgICAgICBvcmRlcjogW10sXG4gICAgICAgIC8vIHNldCBzY3JvbGwgeFxuICAgICAgICBzY3JvbGxYOiB0aGlzLnNjcm9sbFgsXG4gICAgICAgIGRvbTogJ0JmcnRpcCcsXG4gICAgICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHRlbmQ6ICdleGNlbCcsXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5jb25maWcudGl0bGUsXG4gICAgICAgICAgICBjbGFzc05hbWU6ICdkLW5vbmUnLFxuICAgICAgICAgICAgZXhwb3J0T3B0aW9uczoge1xuICAgICAgICAgICAgICBjb2x1bW5zOiAndGg6bm90KDpmaXJzdC1jaGlsZCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAvLyBkZWZpbmUgc2VydmVyIGRhdGEgY2FsbGJhY2tcbiAgICAgICAgZm5TZXJ2ZXJEYXRhKHNTb3VyY2U6IGFueSwgYW9EYXRhOiBhbnksIGZuQ2FsbGJhY2s6IGFueSwgb1NldHRpbmdzOiBhbnkpIHtcbiAgICAgICAgICAvLyBpZiBtZXRob2QgaXMgaW52b2tlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBpZiAoc2VsZi5fZmlyc3RMb2FkKSB7XG4gICAgICAgICAgICAvLyBkaXNhYmxlZCBmaXJzdCBsb2FkIGZsYWdcbiAgICAgICAgICAgIHNlbGYuX2ZpcnN0TG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gaWYgYXV0byBsb2FkIGlzIGRpc2FibGVkXG4gICAgICAgICAgICBpZiAoc2VsZi5hdXRvTG9hZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW1wdHlEYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgIHJlY29yZHNUb3RhbDogMCxcbiAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IDAsXG4gICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAvLyBlbWl0IGVtcHR5IGRhdGFcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZW1wdHlEYXRhU2V0KTtcbiAgICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IGRhdGFcbiAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZW1wdHlEYXRhU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVzZXQgZXJyb3JcbiAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKCk7XG4gICAgICAgICAgLy8gZ2V0IGFjdGl2YXRlZCByb3V0ZSBwYXJhbXNcbiAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHNlbGYuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuICAgICAgICAgIC8vIGdldCBjb2x1bW5zXG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IGFvRGF0YVsxXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgb3JkZXIgZXhwcmVzc2lvblxuICAgICAgICAgIGxldCBvcmRlciA9IGFvRGF0YVsyXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgc2tpcCByZWNvcmRzIHBhcmFtXG4gICAgICAgICAgY29uc3Qgc2tpcCA9IGFvRGF0YVszXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgcGFnZSBzaXplIHBhcmFtXG4gICAgICAgICAgY29uc3QgdG9wID0gYW9EYXRhWzRdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBzZWFyY2ggdmFsdWVcbiAgICAgICAgICBjb25zdCBzZWFyY2ggPSBhb0RhdGFbNV0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IGRhdGEgcXVlcnlhYmxlXG4gICAgICAgICAgY29uc3QgcSA9IHNlbGYuX3F1ZXJ5IGluc3RhbmNlb2YgQ2xpZW50RGF0YVF1ZXJ5YWJsZSA/IHNlbGYuX3F1ZXJ5IDogc2VsZi5fY29udGV4dC5tb2RlbChzZWxmLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgICAvLyBhcHBseSBwYWdpbmcgcGFyYW1zXG4gICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgcS50YWtlKHRvcCkuc2tpcChza2lwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIChyb3dHcm91cCBhbmQgb3JkZXIpIGlmIHRoZXJlIGlzIHJvdyBncm91cCBpbnB1dFxuICAgICAgICAgIGxldCByb3dHcm91cE9yZGVyOiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGlmIChzZWxmLnJvd0dyb3VwICYmIHNlbGYucm93R3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY29sT3JkZXIgPSBbXTtcblxuICAgICAgICAgICAgLy8gZmluZCBpbmRleCBvZiB0aGUgcm93R3JvdXAgY29sdW1uXG4gICAgICAgICAgICBsZXQgY29scyA9IHNlbGYucm93R3JvdXAubWFwKHggPT4gdGFibGVDb2x1bW5zLmZpbmRJbmRleCh0YWJsZUNvbHVtbiA9PiB0YWJsZUNvbHVtbi5kYXRhID09PSB4KSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgICAgICAgICAgLy8gZmluZCBuZXcgaW5kZXggb2YgdGhlIHJvd0dyb3VwIGNvbHVtbiBpbiBjYXNlIG9mIHRhYmxlIG9mZmVycyB0aGUgY29sdW1uIHJlb3JkZXJpbmcgY2FwYWJpbGl0eVxuICAgICAgICAgICAgLy8gaS5lLiBzZXR0aW5ncy5jb2xSZW9yZGVyID09PSBmYWxzZSAoY29sdW1uT3JkZXJpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgaWYgKHNlbGYuZGF0YVRhYmxlICYmIHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIgJiYgdGhpcy5jb2x1bW5PcmRlcmluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBjb2xPcmRlciA9IHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoKTtcbiAgICAgICAgICAgICAgY29scyA9IGNvbHMubWFwKCAoY29sOiBhbnkpID0+IGNvbE9yZGVyLmluZGV4T2YoY29sIGFzIG5ldmVyKSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ID4gLTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29sdW1uID0gLTE7XG4gICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gJ2FzYyc7XG5cbiAgICAgICAgICAgIC8vIHNldCBjb2x1bW4gYW5kIG9yZGVyIGRpcmVjdGlvblxuICAgICAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb2x1bW4gPSBvcmRlclswXS5jb2x1bW47XG4gICAgICAgICAgICAgIGRpcmVjdGlvbiA9IG9yZGVyWzBdLmRpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd0dyb3VwT3JkZXIgPSBjb2xzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAgICAgICAgICAvLyBhbmQgZmluZCB0aGUgbmV3IGluZGV4IChjb2x1bW4taW5kZXgpIG9mIHRoZSByb3cgZ3JvdXAgY29sdW1uXG4gICAgICAgICAgICAgIGlmICh4ICE9IGNvbHVtbiAmJiBzZWxmLmxhc3RSb3dHcm91cE9yZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gc2VsZi5sYXN0Um93R3JvdXBPcmRlci5jb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHNlbGYubGFzdFJvd0dyb3VwT3JkZXIuY29sdW1uO1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gc2VsZi5sYXN0Um93R3JvdXBPcmRlci5kaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiB4LFxuICAgICAgICAgICAgICAgIGRpcjogeCA9PT0gY29sdW1uID8gZGlyZWN0aW9uIDogJ2FzYydcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcmRlciA9IG9yZGVyIHx8IFtdO1xuICAgICAgICAgICAgLy8gc2V0IHRoZSByb3cgZ3JvdXAgY29sdW1uIHF1ZXJ5IHBhcmFtIGFsd2F5cyBmaXJzdCBhbmQgYmVmb3JlIHRhYmxlIG9yZGVyaW5nIHF1ZXJ5IHBhcmFtc1xuICAgICAgICAgICAgb3JkZXIudW5zaGlmdCguLi5yb3dHcm91cE9yZGVyKTtcblxuICAgICAgICAgICAgLy8gc2F2ZSBvcmRlcmluZyBjb2x1bW4gYW5kIGRpcmVjdGlvbiAocmVnYXJkbGVzcyByb3dHcm91cGluZylcbiAgICAgICAgICAgIGlmIChjb2x1bW4gPiAtMSkge1xuICAgICAgICAgICAgICBzZWxmLmxhc3RSb3dHcm91cE9yZGVyID0geyBjb2x1bW4sIGRpcmVjdGlvbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBvcmRlciBwYXJhbXNcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBnZXQgb3JkZXIgcXVlcnkgZXhwcmVzc2lvblxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCeVN0ciA9IG9yZGVyLm1hcCgoZXhwcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBjb2x1bW5JbmRleDogbnVtYmVyO1xuICAgICAgICAgICAgICBpZiAoc2VsZi5jb2x1bW5PcmRlcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGV4cHIuY29sdW1uO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYuZGF0YVRhYmxlICYmIHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY29sdW1uIG9yZGVyIChmcm9tIGNvbFJlb3JkZXIpXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uT3JkZXI6IG51bWJlcltdID0gc2VsZi5kYXRhVGFibGUuY29sUmVvcmRlci5vcmRlcigpO1xuICAgICAgICAgICAgICAgIC8vIGFuZCBtYXRjaCB0aGUgZGF0YVRhYmxlIGluZGV4IHRvIHRoZSBjb25maWcgY29sdW1ucyBpbmRleFxuICAgICAgICAgICAgICAgIC8vIGV4cHIuY29sdW1uIHNob3VsZCBhbHdheXMgYmUgdmFsaWQgKGUuZy4gaW4gcmFuZ2UpLCBidXQgcGVyZm9ybSBhIG1pbm9yIHZhbGlkYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoZXhwci5jb2x1bW4gPj0gMCAmJiBleHByLmNvbHVtbiA8IGNvbHVtbk9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSBjb2x1bW5PcmRlcltleHByLmNvbHVtbl07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZmlyc3QgY29sdW1uIGFzIGEgZmFsbGJhY2sgKHdvbid0IGhhcHBlbiwganVzdCBmb3Igc2FmZXR5KVxuICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGV4cHIuY29sdW1uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0YWJsZUNvbHVtbnNbY29sdW1uSW5kZXhdLm5hbWUgKyAnICcgKyBleHByLmRpciB8fCAnYXNjJztcbiAgICAgICAgICAgIH0pLmpvaW4oJywnKTtcbiAgICAgICAgICAgIC8vIHNldCBvcmRlclxuICAgICAgICAgICAgcS5zZXRQYXJhbSgnJG9yZGVyYnknLCBvcmRlckJ5U3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZW5zdXJlIHNlbGYuc3RhdGVMb2FkQ2FsbGJhY2tcbiAgICAgICAgICBpZiAoc2VsZi5zdGF0ZUxvYWRDYWxsYmFjayA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlTG9hZENhbGxiYWNrID0gKChfLCBjYWxsYmFjaykgID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuc3RhdGVMb2FkQ2FsbGJhY2sobnVsbCwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25maWd1cmUgJHNlbGVjdCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IHNlbGYuY29uZmlnLmNvbHVtbnMuZmlsdGVyKCAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4udmlydHVhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29sdW1uLm9wdGlvbmFsID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgodGFibGVDb2x1bW4pID0+IHRhYmxlQ29sdW1uLm5hbWUgPT09IGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5jb2x1bW5zW2luZGV4XS52aXNpYmxlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29sdW1uLnByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5uYW1lICsgJyBhcyAnICsgY29sdW1uLnByb3BlcnR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBxLnNlbGVjdC5hcHBseShxLCBzZWxlY3QpO1xuICAgICAgICAgICAgLy8gY29uZmlndXJlICRmaWx0ZXJcbiAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy4kZmlsdGVyICYmIHF1ZXJ5UGFyYW1zLiRmaWx0ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIHNldCByb3V0ZSBmaWx0ZXJcbiAgICAgICAgICAgICAgY29uc3QgcVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRmaWx0ZXInLCBudWxsKTtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbIHF1ZXJ5UGFyYW1zLiRmaWx0ZXIgXTtcbiAgICAgICAgICAgICAgaWYgKHFQYXJhbXMuJGZpbHRlcikgeyBleHByZXNzaW9ucy5wdXNoKCcoJyArIHFQYXJhbXMuJGZpbHRlciArICcpJyApOyB9XG4gICAgICAgICAgICAgIHEuZmlsdGVyKGV4cHJlc3Npb25zLmpvaW4oJyBhbmQgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcXVlcnkgcGFyYW1ldGVycyBjb250YWluIGZpbHRlclxuICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLiRleHBhbmQgJiYgcXVlcnlQYXJhbXMuJGV4cGFuZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IHJvdXRlICRleHBhbmRcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGV4cGFuZCcsIHF1ZXJ5UGFyYW1zLiRleHBhbmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5leHBhbmQpIHtcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGV4cGFuZCcsIHNlbGYuY29uZmlnLmRlZmF1bHRzLmV4cGFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXEuZ2V0UGFyYW1zKClbJyRvcmRlcmJ5J10gJiYgc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMub3JkZXJCeSkge1xuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckb3JkZXJieScsIHNlbGYuY29uZmlnLmRlZmF1bHRzLm9yZGVyQnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmdyb3VwQnkpIHtcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGdyb3VwYnknLCBzZWxmLmNvbmZpZy5kZWZhdWx0cy5ncm91cEJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFwcGVuZCBkZWZhdWx0IGZpbHRlclxuICAgICAgICAgICAgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmZpbHRlcikge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyLmFzeW5jQnVpbGRGaWx0ZXIoc2VsZi5jb25maWcuZGVmYXVsdHMuZmlsdGVyKS50aGVuKChkZWZhdWx0RmlsdGVyU3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXJTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHFQYXJhbXMgPSBxLmdldFBhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGZpbHRlcicsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbIGRlZmF1bHRGaWx0ZXJTdHJpbmcgXTtcbiAgICAgICAgICAgICAgICAgIGlmIChxUGFyYW1zLiRmaWx0ZXIpIHsgZXhwcmVzc2lvbnMucHVzaCgnKCcgKyBxUGFyYW1zLiRmaWx0ZXIgKyAnKScgKTsgfVxuICAgICAgICAgICAgICAgICAgcS5maWx0ZXIoZXhwcmVzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlU2VydmVyRGF0YS5lbWl0KHEpO1xuICAgICAgICAgICAgICAgIHNlbGYubGFzdFF1ZXJ5UGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcS5nZXRMaXN0KCkudGhlbigoaXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclNlcnZlckRhdGEuZW1pdChpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW1zLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gaXRlbXMudG90YWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy50b3RhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBsb2FkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KGRhdGFTZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhkYXRhU2V0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZyBlcnJvciB0byBjb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEFCTEVTJywgZXJyKTtcbiAgICAgICAgICAgICAgICAvLyBzaG93IGVycm9yXG4gICAgICAgICAgICAgICAgc2VsZi50b2dnbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAgIC8vIGJ5IHJldHVybmluZyBlbXB0eSBkYXRhc2V0XG4gICAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5iZWZvcmVTZXJ2ZXJEYXRhLmVtaXQocSk7XG4gICAgICAgICAgICBzZWxmLmxhc3RRdWVyeVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICBxLmdldExpc3QoKS50aGVuKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICBzZWxmLmFmdGVyU2VydmVyRGF0YS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YVNldCA9IHtcbiAgICAgICAgICAgICAgICByZWNvcmRzVG90YWw6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgIHJlY29yZHNGaWx0ZXJlZDogaXRlbXMudG90YWwsXG4gICAgICAgICAgICAgICAgZGF0YTogaXRlbXMudmFsdWUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSBpdGVtcy50b3RhbDtcbiAgICAgICAgICAgICAgaWYgKGl0ZW1zLnRvdGFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlbWl0IGxvYWQgZXZlbnRcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZGF0YVNldCk7XG4gICAgICAgICAgICAgIC8vIHJldHVybiBkYXRhXG4gICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKGRhdGFTZXQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAvLyBsb2cgZXJyb3IgdG8gY29uc29sZVxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCBlcnIpO1xuICAgICAgICAgICAgICAvLyBzaG93IGVycm9yXG4gICAgICAgICAgICAgIHNlbGYudG9nZ2xlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgLy8gYnkgcmV0dXJuaW5nIGVtcHR5IGRhdGFzZXRcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhbmd1YWdlOiBPYmplY3QuYXNzaWduKHsgfSwgc2VsZi50cmFuc2xhdG9yLnRyYW5zZm9ybSgnVGFibGVzLkRhdGFUYWJsZScpLFxuICAgICAgICAgIHtlbXB0eVRhYmxlOiAnICcgfSksXG4gICAgICB9O1xuICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSByb3dHcm91cCBpbnB1dCBhbmQgYXNzaWduIGl0IHRvIHRhYmxlXG4gICAgICBpZiAoc2VsZi5yb3dHcm91cC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IHNlbGYucm93R3JvdXAubWFwKHggPT4gdGFibGVDb2x1bW5zLmZpbmRJbmRleCh0YWJsZUNvbHVtbiA9PiB0YWJsZUNvbHVtbi5kYXRhID09PSB4KSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgICAgICBjb25zdCBkYXRhU3JjID0gY29scy5tYXAoeCA9PiB0YWJsZUNvbHVtbnNbeF0uZGF0YSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UmVuZGVyID0gZnVuY3Rpb24gKHJvd3M6IERhdGFUYWJsZXMuQXBpLCBncm91cDogc3RyaW5nLCBsZXZlbDogbnVtYmVyKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmlld1JlZiA9IHNlbGYuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgICBzZWxmLmhlYWRlclRlbXBsYXRlIGFzIGFueSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhlYWRlclZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKGhlYWRlclZpZXdSZWYucm9vdE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdIZWFkZXJUZW1wbGF0ZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBub2RlLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyVmlld1JlZi5yb290Tm9kZXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5kUmVuZGVyIHByb3BlcnR5XG4gICAgICAgIGNvbnN0IGVuZFJlbmRlciA9IGZ1bmN0aW9uIChyb3dzOiBEYXRhVGFibGVzLkFwaSwgZ3JvdXA6IHN0cmluZywgbGV2ZWw6IG51bWJlcikge1xuICAgICAgICAgIGNvbnN0IGZvb3RlclZpZXdSZWYgPSBzZWxmLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhcbiAgICAgICAgICAgICAgc2VsZi5mb290ZXJUZW1wbGF0ZSBhcyBhbnksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBncm91cCxcbiAgICAgICAgICAgICAgICByb3dzLFxuICAgICAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb290ZXJWaWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmIChmb290ZXJWaWV3UmVmLnJvb3ROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9vdGVyVGVtcGxhdGUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHJvb3Qgbm9kZS4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZvb3RlclZpZXdSZWYucm9vdE5vZGVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHsgcm93R3JvdXA6IHsgZGF0YVNyYywgZW5kUmVuZGVyLCBzdGFydFJlbmRlciB9IH0sIHt9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuY29uZmlnLmZpeGVkQ29sdW1ucykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gc2VsZi5jb25maWcuZml4ZWRDb2x1bW5zLmxlZnQgfHwgMDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzZWxmLmNvbmZpZy5maXhlZENvbHVtbnMucmlnaHQgfHwgMDtcbiAgICAgICAgY29uc3QgZml4ZWRDb2x1bW5zID0ge1xuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgcmlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIGZpeGVkQ29sdW1uc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdGVTZXR0aW5ncyA9IHtcbiAgICAgICAgc3RhdGVTYXZlOiB0aGlzLnN0YXRlU2F2ZVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLnN0YXRlTG9hZENhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGVTZXR0aW5ncywge1xuICAgICAgICAgIHN0YXRlTG9hZENhbGxiYWNrOiB0aGlzLnN0YXRlTG9hZENhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2spIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZVNldHRpbmdzLCB7XG4gICAgICAgICAgc3RhdGVTYXZlQ2FsbGJhY2s6IHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCBzdGF0ZVNldHRpbmdzKTtcblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkge1xuICAgICAgICAvLyBzZXQgY29udGludW91cyBzY3JvbGxpbmdcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIHNjcm9sbFk6IHRoaXMuc2Nyb2xsWSxcbiAgICAgICAgICBzY3JvbGxDb2xsYXBzZTogZmFsc2UsXG4gICAgICAgICAgc2Nyb2xsZXI6IHtcbiAgICAgICAgICAgIGxvYWRpbmdJbmRpY2F0b3I6IGZhbHNlLFxuICAgICAgICAgICAgZGlzcGxheUJ1ZmZlcjogQXJyYXkuaXNBcnJheSh0aGlzLnJvd0dyb3VwKSAmJiB0aGlzLnJvd0dyb3VwLmxlbmd0aCA+IDAgPyAxMDAgOiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHtcbiAgICAgICAgICBzY3JvbGxZOiB0aGlzLnNjcm9sbFksXG4gICAgICAgICAgcGFnaW5nOiB0aGlzLnBhZ2luZyxcbiAgICAgICAgICBwYWdlTGVuZ3RoOiB0aGlzLnBhZ2VMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgdGhpcy5kYXRhVGFibGUuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgLy8gaGFuZGxlIGluaXQuZHQgZXZlbnQgYW5kIGVtaXQgbG9jYWwgZXZlbnRcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gdGFibGVFbGVtZW50Lm9uKCdpbml0LmR0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0galF1ZXJ5KGV2ZW50LnRhcmdldCkucGFyZW50KCk7XG4gICAgICAgIC8vIGhhbmRsZSBzY3JvbGxpbmdcbiAgICAgICAgc2Nyb2xsZXIub24oJ3Njcm9sbCcsIChzY3JvbGxFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGpRdWVyeShzY3JvbGxFdmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IHRvcCA9IHRhcmdldC5zY3JvbGxUb3AoKSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHRhcmdldC5zY3JvbGxMZWZ0KCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgbGVmdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pLkRhdGFUYWJsZShzZXR0aW5ncyk7XG4gICAgICB0aGlzLmluaXQuZW1pdCgpO1xuICAgICAgLy8gc2hvdyBvciBoaWRlIGhlYWRlclxuICAgICAgaWYgKCF0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaGlkZVNlbGVjdG9yID0gKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZT50aGVhZCcpO1xuICAgICAgICBpZiAoaGlkZVNlbGVjdG9yKSB7XG4gICAgICAgICAgaGlkZVNlbGVjdG9yLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkanVzdFNlbGVjdG9yID0gICh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGUnKTtcbiAgICAgICAgaWYgKGFkanVzdFNlbGVjdG9yKSB7XG4gICAgICAgICAgYWRqdXN0U2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnbXQtMicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgICBpZiAoIXRoaXMuc2hvd0Zvb3RlciAmJiB0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBpbmZvU2VsZWN0b3IgPSAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19pbmZvJyk7XG4gICAgICAgIGlmIChpbmZvU2VsZWN0b3IpIHtcbiAgICAgICAgICBpbmZvU2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGFkZCBjdXN0b20gZXZlbnQgaGFuZGxlclxuXG4gICAgICBjb25zdCBvbkN1c3RvbUV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy8gZ2V0IGN1c3RvbSBldmVudCBuYW1lXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gdGFyZ2V0LmRhdGFzZXQuZXZlbnQgfHwgJ2V2ZW50JztcbiAgICAgICAgLy8gZ2V0IHJvd1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3codGFyZ2V0LmNsb3Nlc3QoJ3RyJykpO1xuICAgICAgICAvLyBnZXQgcm93IGRhdGFcbiAgICAgICAgY29uc3QgZGF0YSA9IHJvdy5kYXRhKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRXZlbnQuZW1pdCh7XG4gICAgICAgICAgbmFtZTogY3VzdG9tRXZlbnQsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICByb3c6IHJvdy5pbmRleCgpXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLm9mZignY2xpY2snLCAnLmR0LWN1c3RvbScpO1xuICAgICAgdGhpcy5kYXRhVGFibGUub24oJ2NsaWNrJywgJy5kdC1jdXN0b20nLCBvbkN1c3RvbUV2ZW50KTtcbiAgICAgIC8vIHNob3cgb3IgaGlkZSBwYWdlclxuICAgICAgaWYgKHRoaXMuc2hvd1BhZ2luZykge1xuICAgICAgICB0aGlzLnNob3dQYWdpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIHNjcm9sbFRvcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5wYXJlbnQoKS5zY3JvbGxUb3AodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUucGFyZW50KCkuc2Nyb2xsTGVmdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxhc3RRdWVyeSgpOiBDbGllbnREYXRhUXVlcnlhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5jb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBpZiBxdWVyeSBtb2RlbCBoYXMgY2hhbmdlZFxuICAgIGNvbnN0IHF1ZXJ5TW9kZWwgPSB0aGlzLl9xdWVyeSAmJiB0aGlzLl9xdWVyeS5nZXRNb2RlbCgpO1xuICAgIGNvbnN0IG1vZGVsID0gcXVlcnlNb2RlbCA/IHF1ZXJ5TW9kZWwgOiB0aGlzLmNvbmZpZy5tb2RlbDtcbiAgICBjb25zdCBxID0gdGhpcy5fY29udGV4dC5tb2RlbChtb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmxhc3RRdWVyeVBhcmFtcykuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgcS5zZXRQYXJhbShrZXksIHRoaXMubGFzdFF1ZXJ5UGFyYW1zICYmIHRoaXMubGFzdFF1ZXJ5UGFyYW1zW2tleV0pO1xuICAgIH0pO1xuICAgIC8vIHJldHVybiBxdWVyeVxuICAgIHJldHVybiBxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHVwZGF0ZXMgYSBzaW5nbGUgcm93XG4gICAqIEBwYXJhbSBmaW5kIC0gQW55IG9iamVjdCB3aGljaCBpcyBiZWluZyBjb252ZXJ0ZWQgdG8gYSBxdWVyeVxuICAgKi9cbiAgcHVibGljIGZldGNoT25lKGZpbmQ6IGFueSkge1xuICAgIGlmIChmaW5kID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlID09IG51bGwpIHtcbiAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgcm93c1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkpO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoKSB7XG4gICAgICAvLyBmaW5kIHJlc3VsdFxuICAgICAgY29uc3QgZmluZEtleXMgPSBPYmplY3Qua2V5cyhmaW5kKTtcbiAgICAgIGlmIChmaW5kS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIHJvdyBpbmRleCBieSBzZWFyY2hpbmcgZWFjaCBwcm9wZXJ0eVxuICAgICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmZpbmRJbmRleCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmRLZXlzLm1hcCggKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiByb3dba2V5XSA9PT0gZmluZFtrZXldO1xuICAgICAgICB9KS5maWx0ZXIoIChyZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzID09PSBmYWxzZTtcbiAgICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaGFzIGJlZW4gZm91bmRcbiAgICAgIGlmIChyb3dJbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgLy8gc2VsZWN0IGF0dHJpYnV0ZXNcbiAgICAgICAgcXVlcnkuc2V0UGFyYW0oJyRzZWxlY3QnLCB0aGlzLmxhc3RRdWVyeVBhcmFtcy4kc2VsZWN0KTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFF1ZXJ5UGFyYW1zLiRleHBhbmQpIHtcbiAgICAgICAgICAvLyBhcHBseSBleHBhbmQgYXR0cmlidXRlc1xuICAgICAgICAgIHF1ZXJ5LnNldFBhcmFtKCckZXhwYW5kJywgdGhpcy5sYXN0UXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwbHkgZmlsdGVyIGZvciByb3dcbiAgICAgICAgZmluZEtleXMuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZCggKGNvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbC5wcm9wZXJ0eSA9PT0ga2V5IHx8IGNvbC5uYW1lID09PSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgLy8gZ2V0IHByb3BlcnR5IG9yIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29sdW1uLnByb3BlcnR5IHx8IGNvbHVtbi5uYW1lO1xuICAgICAgICAgICAgcXVlcnkuYW5kKHByb3BlcnR5IGFzIHN0cmluZykuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkuYW5kKGtleSkuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgZmluYWxseSBnZXQgaXRlbVxuICAgICAgICByZXR1cm4gcXVlcnkuZ2V0SXRlbSgpLnRoZW4oIChpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gaWYgaXRlbSBleGlzdHNcbiAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBqUXVlcnkocm93Lm5vZGUoKSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcpO1xuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAvLyByZWRyYXcgcm93XG4gICAgICAgICAgICByb3cuZGF0YShpdGVtKTtcbiAgICAgICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIGlmIHJvdyBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW9uIGNoYW5nZVxuICAgKiBAcGFyYW0gJGV2ZW50XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSAgJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGV4ZWNSZWdleCA9IC8tKFxcZCspJC9nLmV4ZWMoaW5wdXQuaWQpO1xuICAgIC8vIGdldCByb3cgZnJvbSBpZFxuICAgIGNvbnN0IHJvd0luZGV4ID0gcGFyc2VJbnQoKGV4ZWNSZWdleCAmJiBleGVjUmVnZXhbMV0pIGFzIHN0cmluZywgMTApO1xuICAgIC8vIGdldCByb3dcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpLmRhdGEoKTtcbiAgICAvLyBnZXQgcm93IGlkZW50aWZpZXJcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8ICcnO1xuICAgICAgY29uc3QgaWQgPSByb3dba2V5XTtcbiAgICAgIGxldCBmaW5kSXRlbUluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgIGlmIChmaW5kSXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgIC8vIGFkZCByb3cgdG8gc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaChyb3cpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGl0ZW1cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSXRlbUluZGV4LCAxKTtcbiAgICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgICAgLy8gYWRkIHJvdyB0byB1bnNlbGVjdGVkIHJvd3NcbiAgICAgICAgICAgIGZpbmRJdGVtSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtW2tleV0gPT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdGVkLnB1c2gocm93KTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEVtcHR5VGFibGUoKSB7XG4gICAgLy8gdGhpcyBvcGVyYXRpb24gaXMgaW1wb3J0YW50XG4gICAgLy8gZHVlIHRvIG5nIGRhdGEgYmluZGluZ1xuICAgIC8vIGVtcHR5IHRhYmxlIHRlbXBsYXRlIGhhcyBubyB0cmFuc2xhdGVkIHRleHQgZHVyaW5nIG5nT25Jbml0KClcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgJiYgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc0VtcHR5VGFibGUgPVxuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gdGhpcy5lbXB0eVRhYmxlICYmIHRoaXMuZW1wdHlUYWJsZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZUVycm9yKGVycj86IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKHRoaXMuZXJyb3JUZW1wbGF0ZSAmJiB0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCk7XG4gICAgICBsZXQgaW5uZXJNZXNzYWdlOiBhbnk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBpbm5lck1lc3NhZ2UgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzbWFsbCcpLml0ZW0oMCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0gZXJyO1xuICAgICAgICBpZiAodHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2Vycm9ySGFuZGxlcikge1xuICAgICAgICAgICAgLy8gYSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzc2lnbm1lbnQgb2YgcmVqZWN0aW9uIHByb3BlcnR5XG4gICAgICAgICAgICAvLyBmb2xsb3dpbmcgQHVuaXZlcnNpcy9jb21tb24jRXJyb3JzSGFuZGxlci5oYW5kbGVFcnJvciBjb250cmFjdFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnIsIHtcbiAgICAgICAgICAgICAgcmVqZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBlcnIuc3RhdHVzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGVyci5zdGF0dXNUZXh0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbm5lck1lc3NhZ2UpIHtcbiAgICAgICAgICBpbm5lck1lc3NhZ2UuaW5uZXJIVE1MID0gZXJyLmVycm9yICYmIGVyci5lcnJvci5tZXNzYWdlID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNaZXJvUmVjb3JkcyA9IHRoaXMuZXJyb3JUZW1wbGF0ZSAmJiB0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5uZXJNZXNzYWdlKSB7XG4gICAgICAgICAgaW5uZXJNZXNzYWdlLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckVtcHR5VGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGV4cG9ydCgpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdC1idXR0b25zIC5idXR0b25zLWV4Y2VsJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNvbHVtbnMoY29sdW1uc1RvU2hvdykge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kYXRhVGFibGU7XG4gICAgdGhpcy5jb25maWcuY29sdW1ucy5zbGljZSgxKS5mb3JFYWNoKChjb2x1bW4sIGkpID0+IHtcbiAgICAgIGlmICghY29sdW1uLmhpZGRlbikge1xuICAgICAgICBpZiAoY29sdW1uc1RvU2hvdy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgICAgICAgIHRhYmxlLmNvbHVtbihjb2x1bW4ubmFtZSArICc6bmFtZScpLnZpc2libGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICAgICAgICB0YWJsZS5jb2x1bW4oY29sdW1uLm5hbWUgKyAnOm5hbWUnKS52aXNpYmxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2hhbmdlcywgJ2NvbmZpZ1NyYycpKSB7XG4gICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMgIT0gbnVsbCkge1xuICAgICAgICAvLyBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gb24gY2hhbmdlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlICYmIChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5jb25maWdTcmMucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9odHRwLmdldChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUpLnRvUHJvbWlzZSgpLnRoZW4oKGNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIC8vIGZldGNoIGFuZCByZWRyYXdcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0YWJsZSBjb25maWd1cmF0aW9uLicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KGxvYWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1dG9Mb2FkID0gISFsb2FkO1xuICAgIHRoaXMubmdPbkluaXQoKTtcbiAgfVxuXG4gIHNlbGVjdENvbHVtbnMoKSB7XG4gICAgLy8gZ2V0IGNvbHVtbiBvcmRlciBlLmcuIFswLCA0LCAxLCAyLCAzXVxuICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBudW1iZXJbXSA9IHRoaXMuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoKTtcbiAgICAvLyBnZXQgY29sdW1uIGRlZmluaXRpb25zXG4gICAgY29uc3QgY29sdW1uRGVmcyA9IHRoaXMuZGF0YVRhYmxlLnNldHRpbmdzKCkuaW5pdCgpLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1ucyA9IGNvbHVtbkRlZnMubWFwKChcbiAgICAgIGNvbHVtbkRlZjogeyBrZXk6IHN0cmluZywgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmlzaWJsZTogYm9vbGVhbixcbiAgICAgICAgc29ydGFibGU6IGJvb2xlYW4sIGluZGV4OiBudW1iZXIgfSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgY29sdW1uLSR7aX1gO1xuICAgICAgbGV0IHRpdGxlID0gY29sdW1uRGVmLnRpdGxlO1xuICAgICAgLy8gZ2V0IGNvbHVtbiBpbmRleFxuICAgICAgY29uc3QgaW5kZXggPSAgY29sdW1uT3JkZXIuaW5kZXhPZihpKTtcbiAgICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oaW5kZXgpLnZpc2libGUoKTtcbiAgICAgIC8vIHNldCB0aXRsZSBmb3Igc2VsZWN0IGNvbHVtblxuICAgICAgaWYgKGkgPT09IDAgJiYgdGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuU2VsZWN0Q29sdW1uJykgKyAnPic7XG4gICAgICB9XG4gICAgICAvLyBnZXQgY29sdW1uIHRpdGxlXG4gICAgICBpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodGl0bGUgPT0gbnVsbCkge1xuICAgICAgICAvLyB0cnkgdG8gZmluZCBjb2x1bW4gcGxhY2Vob2xkZXJcbiAgICAgICAgbGV0IHBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gdGhpcy5jb25maWcuY29sdW1uc1tpIC0gMV0ucGxhY2Vob2xkZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBsYWNlaG9sZGVyID0gdGhpcy5jb25maWcuY29sdW1uc1tpXS5wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGxhY2Vob2xkZXIgIT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHBsYWNlaG9sZGVyKSArICc+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRpdGxlID09IG51bGwpIHtcbiAgICAgICAgdGl0bGUgPSAnPCcgKyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5Vbmtub3duQ29sdW1uJykgKyAnPic7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBpbmRleFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLl9jb2x1bW5TZWxlY3Rvci5zZWxlY3RDb2x1bW5zKGNvbHVtbnMpLnRoZW4oKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQucmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IChldmVudC5jb2x1bW5zIGFzIGFueVtdKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAga2V5OiBjb2wua2V5LFxuICAgICAgICAgICAgICBpbmRleDogY29sLmluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgLy8gZ2V0IGNvbHVtbiBvcmRlciBlLmcuIFszLCAxLCAyLCAwLCA0XVxuICAgICAgICBjb25zdCBpbmRleGVzID0gc29ydGVkXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gKGV2ZW50LmNvbHVtbnMgYXMgYW55W10pLmZpbmRJbmRleCgobmV4dCkgPT4gaXRlbS5rZXkgPT09IG5leHQua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlc2V0IGNvbHVtbiB2aXNpYmlsdHlcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IChldmVudC5jb2x1bW5zIGFzIGFueVtdKS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKGV2ZW50LmNvbHVtbnMgYXMgYW55W10pW2luZGV4XTtcbiAgICAgICAgICBjb25zdCBjb2xJbmRleCA9IGNvbHVtbk9yZGVyLmluZGV4T2YoaW5kZXgpO1xuICAgICAgICAgIC8vIHNldCB2aXNpYmlsdHkgd2l0aCByZWRyYXcgKD10cnVlKVxuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbHVtbihjb2xJbmRleCkudmlzaWJsZShlbGVtZW50LnZpc2libGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmFsbHkgYXBwbHkgY29sdW1uIG9yZGVyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoaW5kZXhlcywgdHJ1ZSk7XG4gICAgICAgIC8vIHNpbXBseSByZWRyYXcgdGhlIHRhYmxlXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyB0byBwYXNzIGFuIGVycm9ySGFuZGxlciBjYWxsYmFjaywgaWYgZGVzaXJlZFxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwb3J0VmlldyhvcHRpb25zPzoge2Vycm9ySGFuZGxlcj86IChyZWFzb24/OiBhbnkpID0+IGFueX0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbG9hZGluZy5zaG93TG9hZGluZygpO1xuICAgICAgLy8gdmFsaWRhdGUgcXVlcnkgaXRlbXMgYW5kIGNvbmZpZ1xuICAgICAgaWYgKCEodGhpcy5sYXN0UXVlcnkgJiYgdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcyAmJiB0aGlzLmNvbmZpZykpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBnZXQgZXhwb3J0IHNldHRpbmdzXG4gICAgICBjb25zdCBleHBvcnRTZXR0aW5ncyA9IHRoaXMuX2NvbmZpZ3VyYXRpb24uc2V0dGluZ3MgYXMgRXhwb3J0TGltaXRDb25maWd1cmF0aW9uO1xuICAgICAgLy8gYW5kIGV4cG9ydCBsaW1pdFxuICAgICAgY29uc3QgZXhwb3J0TGltaXQgPVxuICAgICAgICAoZXhwb3J0U2V0dGluZ3MgJiYgZXhwb3J0U2V0dGluZ3MudGFibGVzICYmIGV4cG9ydFNldHRpbmdzLnRhYmxlcy5leHBvcnRMaW1pdCAmJiBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQgPiAwKVxuICAgICAgICA/IGV4cG9ydFNldHRpbmdzLnRhYmxlcy5leHBvcnRMaW1pdCA6IE1BWF9FWFBPUlRfSVRFTVM7XG4gICAgICAvLyBhbmQgdmFsaWRhdGUgaXRcbiAgICAgIGlmICh0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID4gZXhwb3J0TGltaXQpIHtcbiAgICAgICAgLy8gY2FsbCBlcnJvciBoYW5kbGVyXG4gICAgICAgIC8vIHByb3ZpZGUgYSByZWNvZ25pemlibGUgZXJyb3IgdHlwZVxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVycm9ySGFuZGxlcikge1xuICAgICAgICAgIG9wdGlvbnMuZXJyb3JIYW5kbGVyKG5ldyBFeHBvcnRMaW1pdEV4Y2VlZGVkRXJyb3IoJ0V4cG9ydCBsaW1pdCBleGNlZWRlZCcpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3Igc2hvdyB3YXJuaW5nIG1vZGFsIGFuZCBleGl0XG4gICAgICAgIHRoaXMuX21vZGFsU2VydmljZS5zaG93V2FybmluZ0RpYWxvZyh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5FeHBvcnRMaXN0JyksXG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuRXhwb3J0TGltaXRFeGNlZWRlZCcsXG4gICAgICAgICAgICB7ZGF0YUxlbmd0aDogdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcywgZXhwb3J0TGltaXR9KSwgRElBTE9HX0JVVFRPTlMuT2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBnZXQgdG90YWwgZGlzcGxheWVkIGl0ZW1zXG4gICAgICBjb25zdCB0b3RhbERpc3BsYXllZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLmFpRGlzcGxheSkubGVuZ3RoO1xuICAgICAgLy8gaWYgdGhleSBhbHJlYWR5IHNhdGlzZnkgdGhlIGxhc3QgcXVlcnkgdG90YWxcbiAgICAgIGlmICh0b3RhbERpc3BsYXllZEl0ZW1zID09PSB0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zKSB7XG4gICAgICAgIC8vIHByZXBhcmUgZXhjZWwgZGF0YSBpbW1lZGlhdGVseVxuICAgICAgICBjb25zdCB7Ym9keSwgaGVhZGVyfSA9IHRoaXMuZ2V0RXhwb3J0YWJsZURhdGEoKTtcbiAgICAgICAgLy8gYW5kIGV4cG9ydCB0aGVtIHRvIGV4Y2VsXG4gICAgICAgIHRoaXMuX2V4cG9ydFNwcmVhZHNoZWV0LmV4cG9ydChib2R5LCBgJHt0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWcudGl0bGUgfHwgJ1RhYmxlcy5FeHBvcnRSZXN1bHRzJyl9Lnhsc3hgLCB7XG4gICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICBza2lwSGVhZGVyOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIG1vcmUgZGF0YSBuZWVkIHRvIGJlIGZldGNoZWRcbiAgICAgICAgLy8gaG9sZCBwcmV2aW91cyBkYXRhIHN0YXRlXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRGF0YVN0YXRlID0gdGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKS50b0FycmF5KCk7XG4gICAgICAgIC8vIGdldCB0YXJnZXQgZGF0YSBzdGF0ZSBieSBleGVjdXRpbmcgdGhlIGxhc3QgcXVlcnlcbiAgICAgICAgLy8gbm90ZTogdGFraW5nIHRoZSBleHBvcnRMaW1pdCBhbW91bnQgb2YgaXRlbXMgd2lsbCBhbHdheXMgc2F0aXNmeSB0aGUgcmVzdWx0cyxcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBoYXMgYmVlbiB2YWxpZGF0ZWRcbiAgICAgICAgY29uc3QgdGFyZ2V0RGF0YVN0YXRlID0gYXdhaXQgdGhpcy5sYXN0UXVlcnkudGFrZShleHBvcnRMaW1pdCkuc2tpcCgwKS5nZXRJdGVtcygpO1xuICAgICAgICAvLyBjaGFuZ2UgdGFibGUgZGF0YSBvbiB0aGUgZmx5LCBidXQgZG8gbm90IHJlZHJhd1xuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpLnJvd3MuYWRkKHRhcmdldERhdGFTdGF0ZSk7XG4gICAgICAgIC8vIHByZXBhcmUgZXhjZWwgZGF0YVxuICAgICAgICBjb25zdCB7Ym9keSwgaGVhZGVyfSA9IHRoaXMuZ2V0RXhwb3J0YWJsZURhdGEoKTtcbiAgICAgICAgLy8gcmVzZXQgdGFibGUgZGF0YVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpLnJvd3MuYWRkKHByZXZpb3VzRGF0YVN0YXRlKTtcbiAgICAgICAgLy8gYW5kIGV4cG9ydCB0YXJnZXQgZGF0YSB0byBleGNlbFxuICAgICAgICB0aGlzLl9leHBvcnRTcHJlYWRzaGVldC5leHBvcnQoYm9keSwgYCR7dGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLnRpdGxlIHx8ICdUYWJsZXMuRXhwb3J0UmVzdWx0cycpfS54bHN4YCwge1xuICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgc2tpcEhlYWRlcjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBleGl0XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBsb2cgZXJyb3JcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIC8vIGNhbGwgZXJyb3IgaGFuZGxlciwgaWYgZGVmaW5lZFxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lcnJvckhhbmRsZXIpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvckhhbmRsZXIoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBkZWZhdWx0IGVycm9yIHNlcnZpY2VcbiAgICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgICBjb250aW51ZUxpbms6ICcuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZy5oaWRlTG9hZGluZygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRhYmxlRGF0YSgpOiB7Ym9keTogYW55W10sIGhlYWRlcjogYW55W119IHtcbiAgICBpZiAoISh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5idXR0b25zXG4gICAgICAmJiB0eXBlb2YgdGhpcy5kYXRhVGFibGUuYnV0dG9ucy5leHBvcnREYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaXMuY29uZmlnKSkge1xuICAgICAgcmV0dXJuIHtib2R5OiBbXSwgaGVhZGVyOiBbXX07XG4gICAgfVxuICAgIC8vIGZldGNoIGV4cG9ydGFibGUgZXhjZWwgZGF0YVxuICAgIGxldCB7Ym9keSwgaGVhZGVyfSA9IHRoaXMuZGF0YVRhYmxlLmJ1dHRvbnMuZXhwb3J0RGF0YSgpO1xuICAgIGNvbnN0IGNsZWFudXBJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIC8vIGNsZWFuIHVwIGhlYWRlcnNcbiAgICBoZWFkZXIgPSBoZWFkZXIuZmlsdGVyKChoZWFkZXJJdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIGV4Y2x1ZGUgZW1wdHkgaGVhZGVyc1xuICAgICAgaWYgKGhlYWRlckl0ZW0udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjbGVhbnVwSW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gZXhjbHVkZSBoaWRkZW4gY29sdW1uc1xuICAgICAgLy8gbm90ZTogdXNlIHRoZSBkYXRhdGFibGUgdmlzaWJsZSgpIGZ1bmN0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBoaWRkZW4gY29uZmlnIHByb3BlcnR5LCB0byBzYXRpc2Z5IHRoZSBjb2x1bW4gc2VsZWN0b3JcbiAgICAgIGlmICghdGhpcy5kYXRhVGFibGUuY29sdW1uKGluZGV4KS52aXNpYmxlKCkpIHtcbiAgICAgICAgY2xlYW51cEluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIC8vIGNsZWFuIHVwIGJvZHlcbiAgICBib2R5ID0gYm9keS5tYXAoKHJvdzogYW55IFtdKSA9PiB7XG4gICAgICByZXR1cm4gcm93LmZpbHRlcigoXywgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY2xlYW51cEluZGV4ZXMuaW5kZXhPZihyb3dJbmRleCkgPT09IC0xO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtib2R5LCBoZWFkZXJ9O1xuICB9XG59XG5cbi8vIGNvbnN0IGVuZFJlbmRlciA9IGZ1bmN0aW9uIChyb3dzLCBncm91cCkgeyB2YXIgY291bnQgPSByb3dzLmRhdGEoKTsgcm93cy5jb3VudCgpO1xuLy8gICByZXR1cm4gKGA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJvd0dyb3VwVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBkYXRhOiAke2dyb3VwfSB9XCI+PC9uZy1jb250YWluZXI+YCk7IH07XG4vLyA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJvd0dyb3VwVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBkYXRhOiAgfVwiPjwvbmctY29udGFpbmVyPlxuLy8gcmV0dXJuICgnPHNwYW4gYWxpZ249XCJsZWZ0XCJcIj48c3Ryb25nPicrIGdyb3VwICsgJyAnICsgYCgke3RvdGFsSGVhZGVyfSBgICArIGNvdW50Lmxlbmd0aCArICcpPC9zdHJvbmc+PC9zcGFuPicpOyB9O1xuIl19
1874
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vQHVuaXZlcnNpcy9uZ3gtdGFibGVzLyIsInNvdXJjZXMiOlsibGliL2NvbXBvbmVudHMvYWR2YW5jZWQtdGFibGUvYWR2YW5jZWQtdGFibGUuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQ0wsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxVQUFVLEVBQUUsWUFBWSxFQUN4QixNQUFNLEVBQ04sY0FBYyxFQUNkLFFBQVEsRUFDUixLQUFLLEVBQUUsU0FBUyxFQUNoQixNQUFNLEVBQUUsTUFBTSxFQUNkLFNBQVMsRUFDVCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULGFBQWEsRUFDYixZQUFZLEVBQ1osV0FBVyxFQUNYLGdCQUFnQixFQUNoQixhQUFhLEVBQ2IsWUFBWSxFQUNaLFFBQVEsRUFDVCxNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxrQkFBa0IsQ0FBQztBQUNwRCxPQUFPLEVBQUMsYUFBYSxFQUFFLGdCQUFnQixFQUFDLE1BQU0scUJBQXFCLENBQUM7QUFDcEUsT0FBTyxFQUFDLGNBQWMsRUFBQyxNQUFNLGlCQUFpQixDQUFDO0FBRy9DLE9BQU8sRUFBQyx1QkFBdUIsRUFBOEIsTUFBTSw2QkFBNkIsQ0FBQztBQUNqRyxPQUFPLEVBQUMsbUJBQW1CLEVBQUMsTUFBTSxpQkFBaUIsQ0FBQztBQUNwRCxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSwwQ0FBMEMsQ0FBQztBQUNyRixPQUFPLEVBQWUsZUFBZSxFQUFDLE1BQU0sTUFBTSxDQUFDO0FBQ25ELE9BQU8sRUFBQyxZQUFZLEVBQUUsY0FBYyxFQUFFLG9CQUFvQixFQUN4RCxZQUFZLEVBQUUsY0FBYyxFQUFFLFlBQVksRUFBRSx3QkFBd0IsRUFBQyxNQUFNLG1CQUFtQixDQUFDO0FBRWpHLG9GQUFvRjtBQUNwRixPQUFPLEtBQUssT0FBTyxNQUFNLFFBQVEsQ0FBQztBQUNsQyxPQUFPLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBQyxRQUFRLEVBQUMsTUFBTSxRQUFRLENBQUM7QUFDaEMsT0FBTyx5QkFBeUIsQ0FBQyxDQUFDLG1GQUFtRjtBQUNySCxPQUFPLHlCQUF5QixDQUFDO0FBQ2pDLE9BQU8sMkJBQTJCLENBQUM7QUFDbkMsT0FBTyx3QkFBd0IsQ0FBQztBQUNoQyxPQUFPLDZCQUE2QixDQUFDO0FBQ3JDLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxzQkFBc0IsQ0FBQztBQUNsRCxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSw0Q0FBNEMsQ0FBQztBQUNuRixPQUFPLEVBQTRCLGdCQUFnQixFQUFFLE1BQU0sbUNBQW1DLENBQUM7QUFFL0YsMEVBQTBFO0FBQzFFLElBQU0sTUFBTSxHQUFHLE9BQU8sQ0FBQztBQU92QixJQUFNLGFBQWEsR0FBUSxNQUFNLENBQUMsRUFBRSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUM7QUFDbkQsYUFBYSxDQUFDLFFBQVEsQ0FBRSxjQUFjLEVBQUUsVUFBVSxJQUFTO0lBQ3ZELE9BQU8sSUFBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUUsVUFBRSxHQUFRO1FBQ3BDLEdBQUcsQ0FBQyxJQUFJLENBQUMsb0JBQW9CLENBQUUsR0FBRyxFQUFFLElBQUksQ0FBRSxDQUFDO0lBQy9DLENBQUMsQ0FBRSxDQUFDO0FBQ1IsQ0FBQyxDQUFDLENBQUM7U0FLSyxFQUFFO0FBSFYsSUFBTSxhQUFhLEdBQUc7SUFDcEIsWUFBWSxFQUFFLENBQUM7SUFDZixlQUFlLEVBQUUsQ0FBQztJQUNsQixJQUFJLElBQUk7Q0FDVCxDQUFDO0FBRUY7SUFBNkMsa0RBQWlCO0lBQTlEOztJQWdCQSxDQUFDO0lBZlEsdURBQWMsR0FBckI7SUFDQSxDQUFDO0lBRU0sK0NBQU0sR0FBYjtJQUNBLENBQUM7SUFFTSxzREFBYSxHQUFwQjtJQUNBLENBQUM7SUFFTSxxREFBWSxHQUFuQjtJQUNBLENBQUM7SUFFTSxpREFBUSxHQUFmO0lBQ0EsQ0FBQztJQUVILHFDQUFDO0FBQUQsQ0FBQyxBQWhCRCxDQUE2QyxpQkFBaUIsR0FnQjdEO0FBRUQsTUFBTSxDQUFDLElBQUksaUJBQWlCLEdBQUcsSUFBSSxjQUFjLENBQUMsbUJBQW1CLENBQUMsQ0FBQztBQUV2RTtJQUE4Qyw0Q0FBVTtJQUN0RCxrQ0FBWSxPQUFlO1FBQTNCLFlBQ0Usa0JBQU0sT0FBTyxDQUFDLFNBRWY7UUFEQyxLQUFJLENBQUMsSUFBSSxHQUFHLDBCQUEwQixDQUFDOztJQUN6QyxDQUFDO0lBQ0gsK0JBQUM7QUFBRCxDQUFDLEFBTEQsQ0FBOEMsVUFBVSxHQUt2RDs7QUFFRDtJQUE4QixtQ0FBdUI7SUFDbkQseUJBQXNCLFFBQWtCO1FBQXhDLFlBQ0UsaUJBQU8sU0FDUjtRQUZxQixjQUFRLEdBQVIsUUFBUSxDQUFVO1FBY2pDLFdBQUssR0FBRyxFQUFFLENBQUM7O0lBWmxCLENBQUM7SUFjTSxnQ0FBTSxHQUFiLFVBQWMsSUFBUyxFQUFFLElBQVMsRUFBRSxHQUFRLEVBQUUsSUFBUztRQUNyRCxFQUFFO0lBQ0osQ0FBQztJQUNILHNCQUFDO0FBQUQsQ0FBQyxBQXBCRCxDQUE4Qix1QkFBdUIsR0FvQnBEO0FBRUQsU0FBUyxTQUFTLENBQUksS0FBVTtJQUM5QixPQUFPLEtBQUssQ0FBQztBQUNmLENBQUM7QUFFRDtJQUFBO0lBT0EsQ0FBQztJQU5lLCtCQUFJLEdBQWxCLFVBQW1CLEtBQVUsRUFBRSxLQUFlO1FBQzVDLElBQUksS0FBSyxFQUFFO1lBQ1QsT0FBTyxTQUFTLENBQXFCLElBQUksQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUM7U0FDekU7UUFDRCxPQUFPLFNBQVMsQ0FBcUIsS0FBSyxDQUFDLENBQUM7SUFDOUMsQ0FBQztJQUNILGlDQUFDO0FBQUQsQ0FBQyxBQVBELElBT0M7O0FBRUQsU0FBUyxtQkFBbUI7SUFDMUIsT0FBTyxDQUNMLE1BQU0sQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQ3ZDLENBQUMsUUFBUSxDQUFDLEVBQUUsQ0FBQyxDQUFDO0FBQ2pCLENBQUM7QUFxQ0Q7SUE0TUUsZ0NBQW9CLFFBQTRCLEVBQ0QsaUJBQTBDLEVBQ3JFLGVBQStCLEVBQy9CLGlCQUFtQyxFQUNuQyxTQUFtQixFQUNuQiw0QkFBeUQsRUFDekQsUUFBb0IsRUFDcEIsU0FBdUIsRUFDdkIsUUFBd0IsRUFDeEIsS0FBaUIsRUFDakIsZUFBc0MsRUFDdEMsY0FBb0MsRUFDcEMsa0JBQTRDLEVBQzVDLGFBQTJCLEVBQzNCLGFBQTJCLEVBQzNCLGlCQUFtQyxFQUN2QixhQUEyQjtRQWhCM0QsaUJBd0JDO1FBeEJtQixhQUFRLEdBQVIsUUFBUSxDQUFvQjtRQUNELHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBeUI7UUFDckUsb0JBQWUsR0FBZixlQUFlLENBQWdCO1FBQy9CLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBa0I7UUFDbkMsY0FBUyxHQUFULFNBQVMsQ0FBVTtRQUNuQixpQ0FBNEIsR0FBNUIsNEJBQTRCLENBQTZCO1FBQ3pELGFBQVEsR0FBUixRQUFRLENBQVk7UUFDcEIsY0FBUyxHQUFULFNBQVMsQ0FBYztRQUN2QixhQUFRLEdBQVIsUUFBUSxDQUFnQjtRQUN4QixVQUFLLEdBQUwsS0FBSyxDQUFZO1FBQ2pCLG9CQUFlLEdBQWYsZUFBZSxDQUF1QjtRQUN0QyxtQkFBYyxHQUFkLGNBQWMsQ0FBc0I7UUFDcEMsdUJBQWtCLEdBQWxCLGtCQUFrQixDQUEwQjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixrQkFBYSxHQUFiLGFBQWEsQ0FBYztRQUMzQixzQkFBaUIsR0FBakIsaUJBQWlCLENBQWtCO1FBQ3ZCLGtCQUFhLEdBQWIsYUFBYSxDQUFjO1FBeE5uRCxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLFFBQUcsR0FBRyxtQkFBbUIsRUFBRSxDQUFDO1FBQzdCLGdCQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BCLGtCQUFhLEdBQUcsSUFBSSxlQUFlLENBQU0sSUFBSSxDQUFDLENBQUM7UUFNdEMsV0FBTSxHQUFHLEdBQUcsQ0FBQztRQUNiLGdCQUFXLEdBQUcsSUFBSSxDQUFDO1FBQ25CLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDRixnQkFBVyxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2hFLFNBQUksR0FBMEMsSUFBSSxZQUFZLEVBQTJCLENBQUM7UUFDMUYsU0FBSSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2pELFdBQU0sR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNuRCxXQUFNLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDdEQsU0FBSSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ2xELFNBQUksR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUNqRCxVQUFLLEdBQTBCLElBQUksWUFBWSxFQUFXLENBQUM7UUFDMUQsV0FBTSxHQUFnRCxJQUFJLFlBQVksRUFBaUMsQ0FBQztRQUNqRyxrQkFBYSxHQUFzQixJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3hELHFCQUFnQixHQUFzQyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUMvRixvQkFBZSxHQUFpRSxJQUFJLFlBQVksRUFBa0QsQ0FBQztRQUMzSixZQUFPLEdBRTVCLElBQUksWUFBWSxFQUVqQixDQUFDO1FBQ3lCLGdCQUFXLEdBQXNCLElBQUksWUFBWSxFQUFPLENBQUM7UUFDekQsZ0JBQVcsR0FBc0IsSUFBSSxZQUFZLEVBQU8sQ0FBQztRQUV2RSxlQUFVLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLGVBQVUsR0FBRyxJQUFJLENBQUM7UUFDbEIsZUFBVSxHQUFHLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRSxHQUFHLEVBQUUsR0FBRyxDQUFDLENBQUM7UUFDakMsV0FBTSxHQUFHLElBQUksQ0FBQztRQUNkLGVBQVUsR0FBRyxFQUFFLENBQUM7UUFDaEIsbUJBQWMsR0FBRyxLQUFLLENBQUM7UUFDdkIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUlsQixZQUFPLEdBQUcsR0FBRyxDQUFDO1FBQ2QsWUFBTyxHQUFHLElBQUksQ0FBQztRQUMvQjs7V0FFRztRQUNhLGVBQVUsR0FBd0IsS0FBSyxDQUFDO1FBQ3hEOztXQUVHO1FBQ2EsbUJBQWMsR0FBd0IsSUFBSSxDQUFDO1FBQzNEOztXQUVHO1FBQ2EsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFDckIsYUFBUSxHQUFVLEVBQUUsQ0FBQztRQUM5QixlQUFVLEdBQVUsRUFBRSxDQUFDO1FBTzlCOztXQUVHO1FBQ00sYUFBUSxHQUFjLEVBQUUsQ0FBQztRQThIMUIseUJBQW9CLEdBQUcsQ0FBQyxDQUFDO1FBcUIvQiw0QkFBNEI7UUFDNUIsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLGFBQWEsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLEVBQUUsSUFBSSw4QkFBOEIsRUFBRSxDQUFDLENBQUM7UUFDbEcsTUFBTSxDQUFDLEVBQUUsQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxXQUFXLEdBQUcsS0FBSyxDQUFDO1FBQ3BELE1BQU0sQ0FBQyxFQUFFLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLEdBQUcsZUFBZSxDQUFDO1FBQ3BFLElBQUksQ0FBQyxrQkFBa0IsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFNBQVMsQ0FBQyxVQUFDLElBQUk7WUFDbkQsS0FBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1FBQ2YsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDO0lBN0lELHNCQUFXLDBDQUFNO2FBTWpCO1lBQ0UsT0FBTyxJQUFJLENBQUMsT0FBNkIsQ0FBQztRQUM1QyxDQUFDO1FBWkQ7O1dBRUc7YUFFSCxVQUFrQixLQUF5QjtZQUN6QyxJQUFJLENBQUMsT0FBTyxHQUFHLEtBQUssQ0FBQztZQUNyQixxQkFBcUI7WUFDckIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO1FBQ3hDLENBQUM7OztPQUFBO0lBTUQsc0JBQVcsdURBQW1CO2FBQTlCO1lBQ0UsT0FBTyxJQUFJLENBQUMsb0JBQW9CLENBQUM7UUFDbkMsQ0FBQzs7O09BQUE7SUFNRCxzQkFBVyw4Q0FBVTthQWlCckI7WUFDRSxPQUFPLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDMUIsQ0FBQztRQXZCRDs7V0FFRzthQUVILFVBQXNCLEtBQWM7WUFDbEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsc0JBQXNCO1lBQ3RCLElBQUksSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWEsRUFBRTtnQkFDaEQsSUFBTSxPQUFPLEdBQUssSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFnQztxQkFDN0QsYUFBYSxDQUFDLGtCQUFrQixDQUFDLENBQUM7Z0JBQ3JDLElBQUksT0FBTyxJQUFJLElBQUksRUFBRTtvQkFDbkIsT0FBTztpQkFDUjtnQkFDRCxJQUFJLEtBQUssRUFBRTtvQkFDVCxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDcEM7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7UUFDSCxDQUFDOzs7T0FBQTtJQVVBLHNCQUFXLDhDQUFVO2FBeUJyQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO1FBL0JGOztXQUVHO2FBRUYsVUFBc0IsS0FBYztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixzQkFBc0I7WUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUNoRCxJQUFNLE9BQU8sR0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWdDO3FCQUM3RCxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDckMsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO29CQUNuQixPQUFPO2lCQUNSO2dCQUNELElBQU0sU0FBUyxHQUFLLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBZ0MsQ0FBQyxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9GLElBQUksU0FBUyxJQUFJLElBQUksRUFBRTtvQkFDdEIsT0FBTztpQkFDUDtnQkFDRCxJQUFJLEtBQUssRUFBRTtvQkFDVCxPQUFPLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsQ0FBQztvQkFDbkMsaUJBQWlCO29CQUNqQixTQUFTLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDcEM7cUJBQU07b0JBQ0wsT0FBTyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsUUFBUSxDQUFDLENBQUM7b0JBQ2hDLG9CQUFvQjtvQkFDcEIsU0FBUyxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsTUFBTSxDQUFDLENBQUM7aUJBQ2pDO2FBQ0Y7UUFDSCxDQUFDOzs7T0FBQTtJQVVGLHNCQUFXLDhDQUFVO2FBaUJyQjtZQUNFLE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUMxQixDQUFDO1FBdkJEOztXQUVHO2FBRUgsVUFBc0IsS0FBYztZQUNsQyxJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixzQkFBc0I7WUFDdEIsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUNoRCxJQUFNLE9BQU8sR0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWdDO3FCQUM3RCxhQUFhLENBQUMsc0JBQXNCLENBQUMsQ0FBQztnQkFDekMsSUFBSSxPQUFPLElBQUksSUFBSSxFQUFFO29CQUNuQixPQUFPO2lCQUNSO2dCQUNELElBQUksS0FBSyxFQUFFO29CQUNULE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztpQkFDeEI7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO2lCQUN4QjthQUNGO1FBQ0gsQ0FBQzs7O09BQUE7SUFVRCxzQkFBVyx5Q0FBSzthQUloQjtZQUNFLE9BQU8sSUFBSSxDQUFDLE1BQTZCLENBQUM7UUFDNUMsQ0FBQztRQVZEOztXQUVHO2FBRUgsVUFBaUIsS0FBc0M7WUFDckQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUM7UUFDdEIsQ0FBQzs7O09BQUE7SUF3Q0QsZ0JBQWdCO0lBQ1QsdUNBQU0sR0FBYixVQUFjLFVBQVU7UUFBeEIsaUJBaURDO1FBaERDLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsUUFBUSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxDQUFDLFdBQVcsRUFBRSxDQUFDO1FBQ2hGLElBQUksSUFBSSxDQUFDLFVBQVUsRUFBRTtZQUNuQixJQUFJLFVBQVUsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO2dCQUM5Qyx3Q0FBd0M7Z0JBQ3hDLElBQUksV0FBVyxDQUFDLElBQUksQ0FBQyxVQUFVLENBQUMsRUFBRTtvQkFDaEMsSUFBSSxDQUFDLEtBQUssQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUMzQixJQUFJLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFO3dCQUNyRCxJQUFJLEVBQUUsVUFBVSxDQUFDLE9BQU8sQ0FBQyxRQUFRLEVBQUUsRUFBRSxDQUFDO3FCQUN2QyxDQUFDLENBQUMsQ0FBQztpQkFDUDtxQkFBTTtvQkFDTCxxQkFBcUI7b0JBQ3JCLElBQU0sS0FBSyxHQUFHLFVBQVUsQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3BDLGdDQUFnQztvQkFDaEMsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQyxVQUFDLElBQUk7d0JBQzVCLE9BQU8sS0FBSSxDQUFDLFNBQVMsQ0FBQyxTQUFTLENBQUMsQ0FBQyxLQUFJLENBQUMsTUFBTSxJQUFJLEtBQUksQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLENBQVcsRUFBRTs0QkFDdkYsSUFBSSxFQUFFLElBQUk7eUJBQ1gsQ0FBQyxDQUFDO29CQUNMLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQztvQkFDakIsYUFBYTtvQkFDYixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsTUFBTSxDQUFDLENBQUM7aUJBQ3hDO2FBQ0Y7aUJBQU07Z0JBQ0wsZUFBZTtnQkFDZixJQUFJLENBQUMsS0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7YUFDdEM7WUFDRCxJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztZQUN4QixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDO1NBQ3ZCO2FBQU07WUFDTCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO1lBQ3ZCLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNoRCwrQkFBK0I7WUFDL0IsSUFBTSxPQUFPLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsQ0FBQztZQUNoRSxzQkFBc0I7WUFDdEIsSUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUN2QyxtQkFBbUI7WUFDbkIsSUFBTSxZQUFZLEdBQUcsT0FBTyxDQUFDLE1BQU0sQ0FBQztZQUNwQyw2QkFBNkI7WUFDN0IsSUFBTSxNQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7WUFDdEQsSUFBTSxJQUFJLEdBQUcsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFBLEtBQUssSUFBSSxPQUFBLE1BQUksQ0FBUyxLQUFLLENBQUMsRUFBbkIsQ0FBbUIsQ0FBQyxDQUFDO1lBQ3ZELDhCQUE4QjtZQUM5QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztnQkFDYixJQUFJLEVBQUUsSUFBSTtnQkFDVixlQUFlLEVBQUUsZUFBZTtnQkFDaEMsWUFBWSxFQUFFLFlBQVk7YUFDM0IsQ0FBQyxDQUFDO1NBQ0o7SUFDSCxDQUFDO0lBRU0sc0NBQUssR0FBWixVQUFhLGFBQXVCO1FBQ2xDLHdCQUF3QjtRQUN4QixJQUFJLElBQUksQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO1lBQzFCLHdCQUF3QjtZQUN4QixPQUFPLElBQUksQ0FBQyxRQUFRLEVBQUUsQ0FBQztTQUN4QjtRQUNELDREQUE0RDtRQUM1RCxJQUFJLGFBQWEsSUFBSSxJQUFJLElBQUksYUFBYSxLQUFLLElBQUksRUFBRTtZQUNuRCw0QkFBNEI7WUFDNUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxLQUFLLENBQUM7WUFDekIsdUJBQXVCO1lBQ3ZCLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9DO1lBQ0QseUJBQXlCO1lBQ3pCLElBQUksSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLEVBQUU7Z0JBQzFCLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQ25EO1NBQ0Y7UUFDRCwyQkFBMkI7UUFDM0IsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN4QixDQUFDO0lBRU0sd0NBQU8sR0FBZDtRQUNFLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sRUFBRSxDQUFDO1lBQ3pCLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO1lBQ3ZCLElBQUksSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDZCxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssQ0FBQyxhQUFhLENBQUMsQ0FBQyxLQUFLLEVBQUUsQ0FBQzthQUMxQztZQUNELElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDO1lBQ3RCLHVCQUF1QjtZQUN2QixJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFO2dCQUN4QixJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUMvQztZQUNELHlCQUF5QjtZQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxFQUFFO2dCQUMxQixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQzthQUNuRDtZQUNELDRCQUE0QjtZQUM1QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztTQUMxQjtJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLDBDQUFTLEdBQWhCLFVBQWlCLEdBQVEsRUFBRSxNQUFnQjtRQUN6QyxJQUFJLEdBQUcsRUFBRTtZQUNQLFVBQVU7WUFDVixJQUFNLFNBQU8sR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDM0IsOEJBQThCO1lBQzlCLElBQUksSUFBSSxDQUFDLGNBQWMsS0FBSyxLQUFLLEVBQUU7Z0JBQ2pDLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7b0JBQy9CLGdCQUFnQjtvQkFDaEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxJQUFTO3dCQUMzQyxJQUFJLElBQUksS0FBSyxTQUFPLEVBQUU7NEJBQ3BCLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxLQUFLLENBQUMsQ0FBQzt5QkFDdkQ7b0JBQ0gsQ0FBQyxDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsSUFBUzt3QkFDdEQsSUFBSSxJQUFJLEtBQUssU0FBTyxFQUFFOzRCQUNwQixNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO3lCQUN0QztvQkFDSCxDQUFDLENBQUMsQ0FBQztpQkFDSjtnQkFDRCxpQkFBaUI7Z0JBQ2pCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLENBQUMsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2FBQy9DO1lBQ0QsK0JBQStCO1lBQy9CLElBQUksSUFBSSxDQUFDLFlBQVksS0FBSyxLQUFLLEVBQUU7Z0JBQy9CLE1BQU0sQ0FBQyxTQUFPLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzthQUN6RDtpQkFBTTtnQkFDTCxzQkFBc0I7Z0JBQ3RCLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxDQUFDLENBQUM7YUFDekM7WUFDRCxlQUFlO1lBQ2YsSUFBTSxLQUFHLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7WUFDakYsSUFBTSxNQUFJLEdBQUcsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ3hCLHdCQUF3QjtZQUN4QixJQUFJLFNBQVMsR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLFNBQVMsQ0FBQyxVQUFDLENBQUM7Z0JBQ3hDLE9BQU8sQ0FBQyxDQUFDLEtBQUcsQ0FBQyxLQUFLLE1BQUksQ0FBQyxLQUFHLENBQUMsQ0FBQztZQUM5QixDQUFDLENBQUMsQ0FBQztZQUNILElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTtnQkFDbEIsaUNBQWlDO2dCQUNqQyxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxTQUFTLEVBQUUsQ0FBQyxDQUFDLENBQUM7YUFDcEM7WUFDRCxJQUFJLENBQUMsUUFBUSxDQUFDLElBQUksQ0FBQyxNQUFJLENBQUMsQ0FBQztZQUN6QiwyQkFBMkI7WUFDM0IsU0FBUyxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUMsQ0FBQztnQkFDdEMsT0FBTyxDQUFDLENBQUMsS0FBRyxDQUFDLEtBQUssTUFBSSxDQUFDLEtBQUcsQ0FBQyxDQUFDO1lBQzlCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxTQUFTLElBQUksQ0FBQyxFQUFFO2dCQUNsQixpQ0FBaUM7Z0JBQ2pDLElBQUksQ0FBQyxVQUFVLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQzthQUN0QztZQUNELElBQUksTUFBTSxFQUFFO2dCQUNWLE9BQU87YUFDUjtZQUNELElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztTQUN4QztJQUNILENBQUM7SUFFRDs7T0FFRztJQUNJLDRDQUFXLEdBQWxCLFVBQW1CLEdBQVEsRUFBRSxNQUFnQjtRQUMzQyxJQUFJLEdBQUcsRUFBRTtZQUNQLCtCQUErQjtZQUMvQixJQUFJLElBQUksQ0FBQyxZQUFZLEtBQUssS0FBSyxFQUFFO2dCQUMvQixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7YUFDN0Q7aUJBQU07Z0JBQ0wsc0JBQXNCO2dCQUN0QixNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsV0FBVyxDQUFDLFVBQVUsQ0FBQyxDQUFDO2FBQzVDO1lBQ0QsdUJBQXVCO1lBQ3ZCLElBQU0sS0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pGLElBQU0sSUFBSSxHQUFHLEdBQUcsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUN4QixJQUFNLElBQUUsR0FBRyxJQUFJLENBQUMsS0FBRyxDQUFDLENBQUM7WUFDckIsSUFBSSxTQUFTLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsVUFBQyxDQUFDO2dCQUN4QyxPQUFPLENBQUMsQ0FBQyxLQUFHLENBQUMsS0FBSyxJQUFFLENBQUM7WUFDdkIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFNBQVMsSUFBSSxDQUFDLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxDQUFDLFNBQVMsRUFBRSxDQUFDLENBQUMsQ0FBQztnQkFDbkMsSUFBSSxJQUFJLENBQUMsV0FBVyxFQUFFO29CQUNwQixrQ0FBa0M7b0JBQ2xDLFNBQVMsR0FBRyxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxVQUFDLENBQUM7d0JBQ3RDLE9BQU8sQ0FBQyxDQUFDLEtBQUcsQ0FBQyxLQUFLLElBQUUsQ0FBQztvQkFDdkIsQ0FBQyxDQUFDLENBQUM7b0JBQ0gsSUFBSSxTQUFTLEdBQUcsQ0FBQyxFQUFFO3dCQUNqQixJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztxQkFDNUI7aUJBQ0Y7Z0JBQ0QsSUFBSSxNQUFNLEVBQUU7b0JBQ1YsT0FBTztpQkFDUjtnQkFDRCxJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7YUFDeEM7U0FDRjtJQUNILENBQUM7SUFFTSwwQ0FBUyxHQUFoQjtRQUFBLGlCQVlDO1FBWEMsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDckMsd0JBQXdCO1lBQ3hCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDO1lBQ3hCLGlCQUFpQjtZQUNqQixJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLEtBQUssQ0FBQyxVQUFDLEtBQVU7Z0JBQ3JDLElBQU0sR0FBRyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFFLEtBQUssQ0FBRSxDQUFDO2dCQUN4QyxLQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsRUFBRSxJQUFJLENBQUMsQ0FBQztZQUM1QixDQUFDLENBQUMsQ0FBQztZQUNILHVCQUF1QjtZQUN2QixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7U0FDeEM7SUFDSCxDQUFDO0lBRU0sMkNBQVUsR0FBakI7UUFBQSxpQkFjQztRQWJDLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO1lBQ3JDLHdCQUF3QjtZQUN4QixJQUFJLENBQUMsV0FBVyxHQUFHLEtBQUssQ0FBQztZQUN6QixJQUFJLENBQUMsVUFBVSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUNsRCxpQkFBaUI7WUFDakIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxLQUFLLENBQUMsVUFBQyxLQUFVO2dCQUNyQyxJQUFNLEdBQUcsR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBRSxLQUFLLENBQUUsQ0FBQztnQkFDeEMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEVBQUUsSUFBSSxDQUFDLENBQUM7WUFDOUIsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQztZQUM5Qyx1QkFBdUI7WUFDdkIsSUFBSSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxDQUFDO1NBQ3hDO0lBQ0gsQ0FBQztJQUVNLGdEQUFlLEdBQXRCLFVBQXVCLEdBQVE7UUFDN0IsSUFBSSxHQUFHLEVBQUU7WUFDUCxJQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDeEIsdUJBQXVCO1lBQ3ZCLElBQU0sS0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1lBQ2pGLFNBQVM7WUFDVCxJQUFNLElBQUUsR0FBRyxJQUFJLENBQUMsS0FBRyxDQUFDLENBQUM7WUFDckIsMEJBQTBCO1lBQzFCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLFVBQUMsQ0FBQztnQkFDckMsT0FBTyxDQUFDLENBQUMsS0FBRyxDQUFDLEtBQUssSUFBRSxDQUFDO1lBQ3ZCLENBQUMsQ0FBQyxDQUFDO1lBQ0gscUJBQXFCO1lBQ3JCLElBQUksU0FBUyxJQUFJLENBQUMsRUFBRTtnQkFDbEIsV0FBVztnQkFDWCxJQUFJLENBQUMsV0FBVyxDQUFDLEdBQUcsQ0FBQyxDQUFDO2FBQ3ZCO2lCQUFNO2dCQUNMLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLENBQUM7YUFDckI7U0FDRjtJQUNILENBQUM7SUFFRCxtQ0FBbUM7SUFDbkM7Ozs7OztPQU1HO0lBQ0ssOENBQWEsR0FBckIsVUFBc0IsSUFBSSxFQUFFLElBQUksRUFBRSxHQUFHLEVBQUUsSUFBSTtRQUN6QyxhQUFhO1FBQ2IsSUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO1FBQ2pELElBQUksT0FBTyxNQUFNLENBQUMsY0FBYyxLQUFLLFVBQVUsRUFBRTtZQUMvQyxNQUFNLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDcEIsY0FBYyxFQUFFLFFBQVEsQ0FBQyxzRkFDakIsSUFBSSxDQUFDLEdBQUcsNERBQXFELElBQUksQ0FBQyxHQUFHLDRDQUM1RSxDQUFDO2FBQ0gsQ0FBQyxDQUFDO1NBQ0o7UUFDRCxrQkFBa0I7UUFDbEIsT0FBTyxNQUFNLENBQUMsY0FBYyxDQUFDO1lBQzNCLElBQUksTUFBQTtZQUNKLElBQUksTUFBQTtTQUNMLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSx5Q0FBUSxHQUFmO1FBQUEsaUJBMHFCQztRQXpxQkMsSUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDO1FBQ2xCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7U0FDaEI7UUFDRCxJQUFJLElBQUksQ0FBQyxNQUFNLEVBQUU7WUFDZixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQztnQkFDaEIsTUFBTSxFQUFFLElBQUk7YUFDYixDQUFDLENBQUM7WUFDSCxtQkFBbUI7WUFDbkIsSUFBSSxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE1BQU0sRUFBRSxZQUFZLENBQUMsRUFBRTtnQkFDbkUsSUFBSSxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLFVBQVUsQ0FBQzthQUMxQztZQUNELElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsZ0JBQWdCLENBQUMsRUFBRTtnQkFDdkUsSUFBSSxDQUFDLGNBQWMsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLGNBQWMsQ0FBQzthQUNsRDtZQUNELG9DQUFvQztZQUNwQyxJQUFNLGNBQVksR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU87Z0JBQ3RDLDRCQUE0QjtpQkFDM0IsTUFBTSxDQUFDLFVBQUMsTUFBTTtnQkFDYixJQUFJLE1BQU0sQ0FBQyxTQUFTLElBQUksTUFBTSxDQUFDLFNBQVMsS0FBSyxxQkFBcUIsSUFBSSxLQUFJLENBQUMsV0FBVyxLQUFLLEtBQUssRUFBRTtvQkFDaEcsT0FBTyxLQUFLLENBQUM7aUJBQ2Q7Z0JBQ0QsT0FBTyxJQUFJLENBQUM7WUFDZCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNO2dCQUNaLHlDQUF5QztnQkFDekMsT0FBTyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksZUFBZSxDQUFDLEtBQUksQ0FBQyxTQUFTLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztZQUNwRSxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNO2dCQUNaLElBQU0sZ0JBQWdCLEdBQUc7b0JBQ3ZCLElBQUksRUFBRSxNQUFNLENBQUMsUUFBUSxJQUFJLE1BQU0sQ0FBQyxJQUFJO29CQUNwQyxjQUFjLEVBQUUsTUFBTSxDQUFDLGNBQWMsSUFBSSxJQUFJLENBQUMsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxjQUFjLENBQUMsQ0FBQyxDQUFDLEVBQUU7b0JBQzFFLEtBQUssRUFBRSxLQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDO29CQUM5QyxRQUFRLEVBQUUsTUFBTSxDQUFDLGNBQWMsQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDcEUsT0FBTyxFQUFFLE1BQU0sQ0FBQyxjQUFjLENBQUMsUUFBUSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsSUFBSTtvQkFDaEUsSUFBSSxFQUFFLE1BQU0sQ0FBQyxJQUFJO2lCQUNsQixDQUFDO2dCQUVGLElBQUksTUFBTSxDQUFDLFNBQVMsRUFBRTtvQkFDcEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDOUIsU0FBUyxFQUFFLE1BQU0sQ0FBQyxTQUFTO3FCQUM1QixDQUFDLENBQUM7aUJBQ0o7cUJBQU07b0JBQ0wsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDOUIsU0FBUyxFQUFFLEVBQUU7cUJBQ2QsQ0FBQyxDQUFDO2lCQUNKO2dCQUVELElBQUksTUFBTSxDQUFDLFVBQVUsRUFBRTtvQkFDckIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTt3QkFDOUIsTUFBTSxFQUFOLFVBQU8sSUFBUyxFQUFFLElBQVksRUFBRSxHQUFRLEVBQUUsSUFBUzs0QkFDakQsSUFBSSxNQUFNLEdBQUcsSUFBSSxDQUFDOzRCQUNqQixNQUFNLENBQUMsVUFBb0IsQ0FBQyxPQUFPLENBQUMsVUFBQyxlQUFlO2dDQUNuRCxJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBQyxDQUFDO2dDQUNwRSxJQUFJLFNBQVMsSUFBSSxPQUFPLFNBQVMsQ0FBQyxNQUFNLEtBQUssVUFBVSxFQUFFO29DQUN2RCxNQUFNLENBQUMsWUFBWSxHQUFHLGVBQWUsQ0FBQyxZQUFZLENBQUM7b0NBQ25ELE1BQU0sQ0FBQyxhQUFhLEdBQUcsZUFBZSxDQUFDLGFBQWEsQ0FBQztpQ0FDdEQ7Z0NBQ0QsTUFBTSxHQUFHLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sRUFBRSxJQUFJLEVBQUUsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDOzRCQUNsRSxDQUFDLENBQUMsQ0FBQzs0QkFDSCxPQUFPLE1BQU0sQ0FBQyxZQUFZLENBQUM7NEJBQzNCLE9BQU8sTUFBTSxDQUFDLGFBQWEsQ0FBQzs0QkFDNUIsT0FBTyxNQUFNLENBQUM7d0JBQ2hCLENBQUM7cUJBQ0YsQ0FBQyxDQUFDO29CQUNILHNEQUFzRDtvQkFDdEQsSUFBTSxPQUFLLEdBQUcsTUFBTSxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQUMsVUFBQyxlQUFlO3dCQUNuRCxPQUFPLE9BQU8sZUFBZSxDQUFDLFdBQVcsS0FBSyxVQUFVLENBQUM7b0JBQzdELENBQUMsQ0FBQyxDQUFDO29CQUNILElBQUksT0FBSyxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQ3BCLE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7NEJBQzlCLFdBQVcsRUFBWCxVQUFZLElBQVMsRUFBRSxRQUFhLEVBQUUsT0FBWSxFQUFFLFFBQWdCLEVBQUUsUUFBZ0I7Z0NBQ3BGLE9BQUssQ0FBQyxPQUFPLENBQUMsVUFBQyxlQUFlO29DQUM1QixJQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsZUFBZSxDQUFDLFNBQVMsQ0FBdUMsQ0FBQztvQ0FDMUcsSUFBSSxTQUFTLElBQUksT0FBTyxTQUFTLENBQUMsV0FBVyxLQUFLLFVBQVUsRUFBRTt3Q0FDNUQsU0FBUyxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLENBQUMsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLEVBQUUsUUFBUSxFQUFFLFFBQVEsQ0FBQyxDQUFDO3FDQUNqRjtnQ0FDSCxDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDO3lCQUNGLENBQUMsQ0FBQztxQkFDSjtpQkFDRjtnQkFDRCxJQUFJLE1BQU0sQ0FBQyxTQUFTLEVBQUU7b0JBQ3BCLElBQU0sU0FBUyxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLENBQUM7b0JBQzNELElBQUksU0FBUyxJQUFJLE9BQU8sU0FBUyxDQUFDLE1BQU0sS0FBSyxVQUFVLEVBQUU7d0JBQ3ZELE1BQU0sQ0FBQyxNQUFNLENBQUMsZ0JBQWdCLEVBQUU7NEJBQzlCLE1BQU0sRUFBRSxTQUFTLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUM7eUJBQ3RDLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxJQUFNLG9CQUFvQixHQUFHLFNBQStDLENBQUM7b0JBQzdFLElBQUksb0JBQW9CLElBQUksT0FBTyxvQkFBb0IsQ0FBQyxXQUFXLEtBQUssVUFBVSxFQUFFO3dCQUNsRixNQUFNLENBQUMsTUFBTSxDQUFDLGdCQUFnQixFQUFFOzRCQUM5QixNQUFNLEVBQUUsU0FBUyxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3lCQUN0QyxDQUFDLENBQUM7d0JBQ0gsTUFBTSxDQUFDLE1BQU0sQ0FBQyxnQkFBZ0IsRUFBRTs0QkFDOUIsV0FBVyxFQUFFLG9CQUFvQixDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDO3lCQUMzRCxDQUFDLENBQUM7cUJBQ0o7aUJBQ0Y7Z0JBQ0QsT0FBTyxnQkFBZ0IsQ0FBQztZQUMxQixDQUFDLENBQUMsQ0FBQztZQUNMLG9CQUFvQjtZQUNwQixJQUFNLGNBQVksR0FBRyxNQUFNLENBQUMsSUFBSSxDQUFDLEtBQUssSUFBSSxJQUFJLENBQUMsS0FBSyxDQUFDLGFBQWEsQ0FBQyxDQUFDO1lBQ3BFLE1BQU0sQ0FBQyxNQUFNLENBQUMsQ0FBQyxFQUFFLENBQUMsUUFBUSxFQUFFO2dCQUMxQixVQUFVLENBQUM7b0JBQ1QsSUFBSSxLQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNsQixLQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztxQkFDakM7Z0JBQ0gsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO1lBQ1IsQ0FBQyxDQUFDLENBQUM7WUFDSCxpREFBaUQ7WUFDakQsY0FBWSxDQUFDLEVBQUUsQ0FBQyxlQUFlLEVBQUUsVUFBQyxLQUFLLEVBQUUsUUFBUSxFQUFFLFVBQVU7Z0JBQzNELElBQUksVUFBVSxFQUFFO29CQUNkLDRCQUE0QjtvQkFDNUIsY0FBWSxDQUFDLElBQUksQ0FBQyxtQkFBbUIsQ0FBQyxDQUFDLElBQUksQ0FBQyxFQUFFLENBQUMsQ0FBQztvQkFDaEQsVUFBVSxDQUFDO3dCQUNULGNBQVksQ0FBQyxRQUFRLENBQUMsWUFBWSxDQUFDLENBQUM7b0JBQ3RDLENBQUMsRUFBRSxDQUFDLENBQUMsQ0FBQztpQkFDUDtxQkFBTTtvQkFDTCxVQUFVLENBQUM7d0JBQ1QsY0FBWSxDQUFDLFdBQVcsQ0FBQyxZQUFZLENBQUMsQ0FBQztvQkFDekMsQ0FBQyxFQUFFLENBQUMsQ0FBQyxDQUFDO2lCQUNQO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFDSCxJQUFJLFdBQVMsR0FBRyxDQUFDLENBQUM7WUFDbEIsY0FBWSxDQUFDLEVBQUUsQ0FBQyxVQUFVLEVBQUUsVUFBQyxLQUFVO2dCQUNyQyxJQUFJLEtBQUksQ0FBQyxTQUFTLEVBQUU7b0JBQ2xCLElBQU0sS0FBSyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFLENBQUM7b0JBQ3JDLElBQU0sT0FBTyxHQUFHLGNBQVksQ0FBQztvQkFDN0IsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDekIsS0FBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7cUJBQ3hCO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFDLEtBQUs7Z0JBQ3JCLEtBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ2pCLElBQUksS0FBSSxDQUFDLFNBQVMsRUFBRTtvQkFDbEIsSUFBTSxJQUFJLEdBQW9DLEtBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO29CQUN6RSxLQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztvQkFDckIsSUFBSSxXQUFTLEdBQUcsQ0FBQyxFQUFFO3dCQUNqQixPQUFPO3FCQUNSO29CQUNELElBQUk7d0JBQ0YsV0FBUyxFQUFFLENBQUM7d0JBQ1osVUFBVSxDQUFDLGNBQU8sS0FBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsTUFBTSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUM7cUJBQzFEO29CQUFDLE9BQU8sR0FBRyxFQUFFO3dCQUNaLE9BQU8sQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLGlEQUFpRCxDQUFDLENBQUM7d0JBQzFFLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7cUJBQ3BCO2lCQUNGO1lBQ0gsQ0FBQyxDQUFDLENBQUM7WUFFSCxrQkFBa0I7WUFDbEIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQix3Q0FBd0M7Z0JBQ3hDLDRDQUE0QztnQkFDNUMsSUFBTSxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQzNDLG9CQUFvQjtnQkFDcEIsSUFBTSxzQkFBc0IsR0FBRztvQkFDN0IsU0FBUyxFQUFFLHVCQUF1QjtvQkFDbEMsSUFBSSxFQUFFLFdBQVcsQ0FBQyxRQUFRLElBQUksV0FBVyxDQUFDLElBQUk7b0JBQzlDLGNBQWMsRUFBRSxFQUFFO29CQUNsQixLQUFLLEVBQUUsRUFBRTtvQkFDVCxRQUFRLEVBQUUsS0FBSztvQkFDZixPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsWUFBWTtvQkFDM0IsSUFBSSxFQUFFLFdBQVcsQ0FBQyxJQUFJO2lCQUN2QixDQUFDO2dCQUNGLGtCQUFrQjtnQkFDbEIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxzQkFBc0IsRUFBRTtvQkFDcEMsTUFBTSxFQUFFLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztpQkFDdEMsQ0FBQyxDQUFDO2dCQUNILHlCQUF5QjtnQkFDekIsY0FBWSxDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxDQUFDO2dCQUM3QywyQkFBMkI7Z0JBQzNCLCtEQUErRDtnQkFDL0QsY0FBWTtvQkFDVixxQkFBcUI7cUJBQ3BCLEVBQUUsQ0FBQyxTQUFTLEVBQUU7b0JBRWIsSUFBSSxLQUFJLENBQUMsWUFBWSxFQUFFO3dCQUNyQiw2QkFBNkI7d0JBQzdCLGNBQVksQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxJQUFJLEVBQUU7NEJBQzNDLGFBQWE7NEJBQ2IsSUFBTSxHQUFHLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLENBQUM7NEJBQ3JDLFVBQVU7NEJBQ1YsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ3hCLENBQUMsQ0FBQyxDQUFDO3FCQUNKO29CQUNELElBQU0sUUFBUSxHQUFHLGNBQVksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7b0JBQ2xELFFBQVEsQ0FBQyxHQUFHLENBQUMsT0FBTyxDQUFDLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRSxLQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxDQUFDLEtBQUksQ0FBQyxDQUFDLENBQUM7b0JBQ3JFLGlDQUFpQztvQkFDakMsSUFBTSxHQUFHLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsUUFBUSxJQUFJLEVBQUUsQ0FBQztvQkFDbEQsSUFBSSxLQUFJLENBQUMsUUFBUSxDQUFDLE1BQU0sR0FBRyxDQUFDLEVBQUU7d0JBQzVCLDJCQUEyQjt3QkFDM0IsS0FBSSxDQUFDLFFBQVEsQ0FBQyxPQUFPLENBQUMsVUFBQyxJQUFJOzRCQUN6QixzQkFBc0I7NEJBQ3RCLElBQU0sRUFBRSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQzs0QkFDckIsMkJBQTJCOzRCQUMzQixJQUFJLEVBQUUsSUFBSSxJQUFJLEVBQUU7Z0NBQ2Qsc0VBQXNFO2dDQUN0RSxjQUFZLENBQUMsSUFBSSxDQUFDLG9CQUFrQixFQUFFLE9BQUksQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLENBQUM7NkJBQ25FO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNKO29CQUNELElBQUksS0FBSSxDQUFDLFdBQVcsRUFBRTt3QkFDcEIsb0NBQW9DO3dCQUNwQywrQ0FBK0M7d0JBQy9DLGNBQVksQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLLEVBQUUsT0FBTzs0QkFDdEQsY0FBYzs0QkFDZCxJQUFJLEtBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUMsQ0FBQztnQ0FDOUIseUNBQXlDO2dDQUN6QyxPQUFPLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxDQUFDOzRCQUNuRCxDQUFDLENBQUMsR0FBRyxDQUFDLEVBQUU7Z0NBQ04sS0FBSSxDQUFDLFNBQVMsQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDOzZCQUMzQzt3QkFDSCxDQUFDLENBQUMsQ0FBQztxQkFDSjt5QkFBTSxJQUFJLEtBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTt3QkFDckMsY0FBWSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLEVBQUUsS0FBSyxDQUFDLENBQUM7cUJBQzVEO2dCQUNILENBQUMsQ0FBQyxDQUFDO2FBQ047WUFDRCxzQkFBc0I7WUFDdEIsSUFBSSxJQUFJLENBQUMsZUFBZSxFQUFFO2dCQUN4QixJQUFNLGVBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLENBQUM7Z0JBQzFFLElBQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO2dCQUMzQyxJQUFNLDJCQUEyQixHQUFHO29CQUNsQyxTQUFTLEVBQUUsMkJBQTJCO29CQUN0QyxJQUFJLEVBQUUsV0FBVyxDQUFDLFFBQVEsSUFBSSxXQUFXLENBQUMsSUFBSTtvQkFDOUMsY0FBYyxFQUFFLEVBQUU7b0JBQ2xCLEtBQUssRUFBRSxFQUFFO29CQUNULFFBQVEsRUFBRSxLQUFLO29CQUNmLE9BQU8sRUFBRSxDQUFDLElBQUksQ0FBQyxZQUFZO29CQUMzQixJQUFJLEVBQUUsV0FBVyxDQUFDLElBQUk7b0JBQ3RCLE1BQU0sRUFBRTt3QkFDTixPQUFPLHFDQUFnQyxlQUFhLHlCQUFrQixlQUFhLGlCQUFhLENBQUM7b0JBQ25HLENBQUM7aUJBQ0YsQ0FBQztnQkFDRix5QkFBeUI7Z0JBQ3pCLGNBQVksQ0FBQyxPQUFPLENBQUMsMkJBQTJCLENBQUMsQ0FBQztnQkFFbEQsMkJBQTJCO2dCQUMzQixxREFBcUQ7Z0JBQ3JELGNBQVksQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLG9CQUFvQixFQUFFLFVBQUMsQ0FBQztvQkFDN0MsSUFBTSxFQUFFLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUM7b0JBQ2xDLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLEVBQUUsQ0FBQyxDQUFDO29CQUNuQyxJQUFNLFNBQVMsR0FBRyxRQUFRLENBQUMsYUFBYSxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUVoRCxJQUFNLGNBQWMsR0FBRyxLQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQUMsS0FBSSxDQUFDLGVBQWUsRUFBRTt3QkFDckYsT0FBTyxFQUFFLEdBQUcsQ0FBQyxJQUFJLEVBQUU7cUJBQ3BCLENBQUMsQ0FBQztvQkFDSCxjQUFjLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBRS9CLElBQUksY0FBYyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO3dCQUN6QyxNQUFNLElBQUksS0FBSyxDQUFDLGtEQUFrRCxDQUFDLENBQUM7cUJBQ3JFO29CQUVELFNBQVMsQ0FBQyxXQUFXLENBQUMsY0FBYyxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDO29CQUVuRCxJQUFJLEdBQUcsQ0FBQyxLQUFLLENBQUMsT0FBTyxFQUFFLEVBQUU7d0JBQ3JCLHNDQUFzQzt3QkFDdEMsS0FBSSxDQUFDLFdBQVcsQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFDeEIsR0FBRyxDQUFDLEtBQUssQ0FBQyxJQUFJLEVBQUUsQ0FBQzt3QkFFakIsY0FBYyxDQUFDLE9BQU8sRUFBRSxDQUFDO3FCQUMxQjt5QkFBTTt3QkFDTCxnQkFBZ0I7d0JBQ2hCLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLEVBQUMsR0FBRyxLQUFBLEVBQUMsQ0FBQyxDQUFDO3dCQUM3QixHQUFHLENBQUMsS0FBSyxDQUFDLFNBQVMsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO3dCQUM1QixHQUFHLENBQUMsS0FBSyxFQUFFLENBQUMsUUFBUSxDQUFDLFVBQVUsQ0FBQyxDQUFDO3FCQUNwQztnQkFDTCxDQUFDLENBQUMsQ0FBQzthQUNKO1lBQ0Qsd0JBQXdCO1lBQ3hCLElBQU0sUUFBUSxHQUFHO2dCQUNmLGtCQUFrQjtnQkFDbEIsVUFBVSxFQUFFLENBQUMsQ0FBQyxFQUFFLEVBQUUsRUFBRSxFQUFFLEVBQUUsR0FBRyxFQUFFLEdBQUcsRUFBRSxHQUFHLENBQUM7Z0JBQ3RDLG1CQUFtQjtnQkFDbkIsWUFBWSxFQUFFLEtBQUs7Z0JBQ25CLDBDQUEwQztnQkFDMUMsU0FBUyxFQUFFLElBQUk7Z0JBQ2YseUJBQXlCO2dCQUN6QixVQUFVLEVBQUUsSUFBSTtnQkFDaEIsa0NBQWtDO2dCQUNsQyxVQUFVLEVBQUUsSUFBSSxDQUFDLFVBQVU7Z0JBQzNCLDBCQUEwQjtnQkFDMUIsT0FBTyxFQUFFLGNBQVk7Z0JBQ3JCLFVBQVUsRUFBRyxJQUFJLENBQUMsY0FBYztnQkFDaEMsS0FBSyxFQUFFLEVBQUU7Z0JBQ1QsZUFBZTtnQkFDZixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87Z0JBQ3JCLEdBQUcsRUFBRSxRQUFRO2dCQUNiLFNBQVMsRUFBRSxLQUFLO2dCQUNoQixPQUFPLEVBQUU7b0JBQ1A7d0JBQ0UsTUFBTSxFQUFFLE9BQU87d0JBQ2YsUUFBUSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSzt3QkFDM0IsU0FBUyxFQUFFLFFBQVE7d0JBQ25CLGFBQWEsRUFBRTs0QkFDYixPQUFPLEVBQUUsc0JBQXNCO3lCQUNoQztxQkFDRjtpQkFDRjtnQkFDRCw4QkFBOEI7Z0JBQzlCLFlBQVksRUFBWixVQUFhLE9BQVksRUFBRSxNQUFXLEVBQUUsVUFBZSxFQUFFLFNBQWM7b0JBQ3JFLDBDQUEwQztvQkFDMUMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO3dCQUNuQiwyQkFBMkI7d0JBQzNCLElBQUksQ0FBQyxVQUFVLEdBQUcsS0FBSyxDQUFDO3dCQUN4QiwyQkFBMkI7d0JBQzNCLElBQUksSUFBSSxDQUFDLFFBQVEsS0FBSyxLQUFLLEVBQUU7NEJBQzNCLElBQU0sWUFBWSxHQUFHO2dDQUNuQixZQUFZLEVBQUUsQ0FBQztnQ0FDZixlQUFlLEVBQUUsQ0FBQztnQ0FDbEIsSUFBSSxFQUFFLEVBQUU7NkJBQ1QsQ0FBQzs0QkFDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsQ0FBQyxDQUFDOzRCQUM5QixrQkFBa0I7NEJBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDOzRCQUM3QixvQkFBb0I7NEJBQ3BCLE9BQU8sVUFBVSxDQUFDLFlBQVksQ0FBQyxDQUFDO3lCQUNqQztxQkFDRjtvQkFDRCxjQUFjO29CQUNkLElBQUksQ0FBQyxXQUFXLEVBQUUsQ0FBQztvQkFDbkIsNkJBQTZCO29CQUM3QixJQUFNLFdBQVcsR0FBRyxJQUFJLENBQUMsZUFBZSxDQUFDLFFBQVEsQ0FBQyxXQUFXLENBQUM7b0JBQzlELGNBQWM7b0JBQ2QsSUFBTSxPQUFPLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDaEMsdUJBQXVCO29CQUN2QixJQUFJLEtBQUssR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUM1Qix5QkFBeUI7b0JBQ3pCLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUM7b0JBQzdCLHNCQUFzQjtvQkFDdEIsSUFBTSxHQUFHLEdBQUcsTUFBTSxDQUFDLENBQUMsQ0FBQyxDQUFDLEtBQUssQ0FBQztvQkFDNUIsbUJBQW1CO29CQUNuQixJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDO29CQUMvQixxQkFBcUI7b0JBQ3JCLElBQU0sQ0FBQyxHQUFHLElBQUksQ0FBQyxNQUFNLFlBQVksbUJBQW1CLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7b0JBQzFILHNCQUFzQjtvQkFDdEIsSUFBSSxHQUFHLEVBQUU7d0JBQ1AsQ0FBQyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUM7cUJBQ3hCO29CQUNELHlFQUF5RTtvQkFDekUsSUFBSSxhQUFhLEdBQVUsRUFBRSxDQUFDO29CQUM5QixJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7d0JBQ3pDLElBQUksVUFBUSxHQUFHLEVBQUUsQ0FBQzt3QkFFbEIsb0NBQW9DO3dCQUNwQyxJQUFJLElBQUksR0FBRyxJQUFJLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxVQUFBLENBQUMsSUFBSSxPQUFBLGNBQVksQ0FBQyxTQUFTLENBQUMsVUFBQSxXQUFXLElBQUksT0FBQSxXQUFXLENBQUMsSUFBSSxLQUFLLENBQUMsRUFBdEIsQ0FBc0IsQ0FBQyxFQUE3RCxDQUE2RCxDQUFDLENBQUMsTUFBTSxDQUFDLFVBQUEsS0FBSyxJQUFJLE9BQUEsS0FBSyxJQUFJLENBQUMsRUFBVixDQUFVLENBQUMsQ0FBQzt3QkFDN0gsaUdBQWlHO3dCQUNqRyxnRUFBZ0U7d0JBQ2hFLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsY0FBYyxLQUFLLElBQUksRUFBRTs0QkFDL0UsVUFBUSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDOzRCQUM3QyxJQUFJLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBRSxVQUFDLEdBQVEsSUFBSyxPQUFBLFVBQVEsQ0FBQyxPQUFPLENBQUMsR0FBWSxDQUFDLEVBQTlCLENBQThCLENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLEdBQUcsQ0FBQyxDQUFDLEVBQVYsQ0FBVSxDQUFDLENBQUM7eUJBQzVGO3dCQUVELElBQUksUUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDO3dCQUNoQixJQUFJLFdBQVMsR0FBRyxLQUFLLENBQUM7d0JBRXRCLGlDQUFpQzt3QkFDakMsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTs0QkFDekIsUUFBTSxHQUFHLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUM7NEJBQ3pCLFdBQVMsR0FBRyxLQUFLLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDO3lCQUMxQjt3QkFDRCxhQUFhLEdBQUcsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFDLENBQUM7NEJBQ3pCLHlDQUF5Qzs0QkFDekMsZ0VBQWdFOzRCQUNoRSxJQUFJLENBQUMsSUFBSSxRQUFNLElBQUksSUFBSSxDQUFDLGlCQUFpQixJQUFJLElBQUksRUFBRTtnQ0FDakQsSUFBSSxDQUFDLEtBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLE1BQU0sRUFBRTtvQ0FDdkMsUUFBTSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxNQUFNLENBQUM7b0NBQ3ZDLFdBQVMsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsU0FBUyxDQUFDO2lDQUM5Qzs2QkFDRjs0QkFDRCxPQUFPO2dDQUNMLE1BQU0sRUFBRSxDQUFDO2dDQUNULEdBQUcsRUFBRSxDQUFDLEtBQUssUUFBTSxDQUFDLENBQUMsQ0FBQyxXQUFTLENBQUMsQ0FBQyxDQUFDLEtBQUs7NkJBQ3RDLENBQUE7d0JBQ0gsQ0FBQyxDQUFDLENBQUM7d0JBQ0gsS0FBSyxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7d0JBQ3BCLDJGQUEyRjt3QkFDM0YsS0FBSyxDQUFDLE9BQU8sT0FBYixLQUFLLFdBQVksYUFBYSxHQUFFO3dCQUVoQyw4REFBOEQ7d0JBQzlELElBQUksUUFBTSxHQUFHLENBQUMsQ0FBQyxFQUFFOzRCQUNmLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxFQUFFLE1BQU0sVUFBQSxFQUFFLFNBQVMsYUFBQSxFQUFFLENBQUM7eUJBQ2hEO3FCQUNGO29CQUNELHFCQUFxQjtvQkFDckIsSUFBSSxLQUFLLElBQUksS0FBSyxDQUFDLE1BQU0sRUFBRTt3QkFDekIsNkJBQTZCO3dCQUM3QixJQUFNLFVBQVUsR0FBRyxLQUFLLENBQUMsR0FBRyxDQUFDLFVBQUMsSUFBUzs0QkFDckMsSUFBSSxXQUFtQixDQUFDOzRCQUN4QixJQUFJLElBQUksQ0FBQyxjQUFjLEtBQUssS0FBSyxFQUFFO2dDQUNqQyxXQUFXLEdBQUcsSUFBSSxDQUFDLE1BQU0sQ0FBQzs2QkFDM0I7aUNBQU0sSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxFQUFFO2dDQUN0RCxpREFBaUQ7Z0NBQ2pELElBQU0sV0FBVyxHQUFhLElBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssRUFBRSxDQUFDO2dDQUNoRSw0REFBNEQ7Z0NBQzVELHFGQUFxRjtnQ0FDckYsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQyxNQUFNLEVBQUU7b0NBQ3hELFdBQVcsR0FBRyxXQUFXLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO2lDQUN4QztxQ0FBTTtvQ0FDTCxxRUFBcUU7b0NBQ3JFLFdBQVcsR0FBRyxDQUFDLENBQUM7aUNBQ2pCOzZCQUNGO2lDQUFNO2dDQUNMLFdBQVcsR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDOzZCQUMzQjs0QkFDRCxPQUFPLGNBQVksQ0FBQyxXQUFXLENBQUMsQ0FBQyxJQUFJLEdBQUcsR0FBRyxHQUFHLElBQUksQ0FBQyxHQUFHLElBQUksS0FBSyxDQUFDO3dCQUNsRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7d0JBQ2IsWUFBWTt3QkFDWixDQUFDLENBQUMsUUFBUSxDQUFDLFVBQVUsRUFBRSxVQUFVLENBQUMsQ0FBQztxQkFDcEM7b0JBQ0QsZ0NBQWdDO29CQUNoQyxJQUFJLElBQUksQ0FBQyxpQkFBaUIsSUFBSSxJQUFJLEVBQUU7d0JBQ2xDLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxDQUFDLFVBQUMsQ0FBQyxFQUFFLFFBQVE7NEJBQ3BDLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUN4QixDQUFDLENBQUMsQ0FBQztxQkFDSjtvQkFDRCxJQUFJLENBQUMsaUJBQWlCLENBQUMsSUFBSSxFQUFFLFVBQUMsS0FBSzt3QkFDakMsOEJBQThCO3dCQUM5QixJQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUUsVUFBQyxNQUFNOzRCQUNoRCxJQUFJLE1BQU0sQ0FBQyxPQUFPLEtBQUssSUFBSSxFQUFFO2dDQUMzQixPQUFPLEtBQUssQ0FBQzs2QkFDZDs0QkFDRCxJQUFJLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxFQUFFO2dDQUM1QixJQUFJLEtBQUssSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO29DQUMxQixJQUFNLEtBQUssR0FBRyxjQUFZLENBQUMsU0FBUyxDQUFDLFVBQUMsV0FBVyxJQUFLLE9BQUEsV0FBVyxDQUFDLElBQUksS0FBSyxNQUFNLENBQUMsSUFBSSxFQUFoQyxDQUFnQyxDQUFDLENBQUM7b0NBQ3hGLElBQUksS0FBSyxJQUFJLENBQUMsRUFBRTt3Q0FDZCxPQUFPLEtBQUssQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUMsT0FBTyxDQUFDO3FDQUNyQztpQ0FDRjtnQ0FDRCxPQUFPLEtBQUssQ0FBQzs2QkFDZDs0QkFDRCxPQUFPLElBQUksQ0FBQzt3QkFDZCxDQUFDLENBQUMsQ0FBQyxHQUFHLENBQUMsVUFBQyxNQUFNOzRCQUNaLElBQUksTUFBTSxDQUFDLFFBQVEsRUFBRTtnQ0FDbkIsT0FBTyxNQUFNLENBQUMsSUFBSSxHQUFHLE1BQU0sR0FBRyxNQUFNLENBQUMsUUFBUSxDQUFDOzZCQUMvQztpQ0FBTTtnQ0FDTCxPQUFPLE1BQU0sQ0FBQyxJQUFJLENBQUM7NkJBQ3BCO3dCQUNILENBQUMsQ0FBQyxDQUFDO3dCQUNILENBQUMsQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQzt3QkFDMUIsb0JBQW9CO3dCQUNwQixJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7NEJBQ3JELG1CQUFtQjs0QkFDbkIsSUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDOzRCQUM5QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQzs0QkFDNUIsSUFBTSxXQUFXLEdBQUcsQ0FBRSxXQUFXLENBQUMsT0FBTyxDQUFFLENBQUM7NEJBQzVDLElBQUksT0FBTyxDQUFDLE9BQU8sRUFBRTtnQ0FBRSxXQUFXLENBQUMsSUFBSSxDQUFDLEdBQUcsR0FBRyxPQUFPLENBQUMsT0FBTyxHQUFHLEdBQUcsQ0FBRSxDQUFDOzZCQUFFOzRCQUN4RSxDQUFDLENBQUMsTUFBTSxDQUFDLFdBQVcsQ0FBQyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQzt5QkFDckM7d0JBQ0QsMkNBQTJDO3dCQUMzQyxJQUFJLFdBQVcsQ0FBQyxPQUFPLElBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxNQUFNLEVBQUU7NEJBQ3JELG9CQUFvQjs0QkFDcEIsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUM1Qzs2QkFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsTUFBTSxFQUFFOzRCQUM3RSxDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsQ0FBQzt5QkFDcEQ7d0JBQ0QsSUFBSSxDQUFDLENBQUMsQ0FBQyxTQUFTLEVBQUUsQ0FBQyxVQUFVLENBQUMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTs0QkFDckcsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxVQUFVLEVBQUUsSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLENBQUMsT0FBTyxDQUFDLENBQUM7eUJBQ3REO3dCQUNELElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxPQUFPLEVBQUU7NEJBQ3ZFLENBQUMsQ0FBQyxRQUFRLENBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE9BQU8sQ0FBQyxDQUFDO3lCQUN0RDt3QkFDRCx3QkFBd0I7d0JBQ3hCLElBQUksSUFBSSxDQUFDLE1BQU0sSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7NEJBQ3RFLE9BQU8sSUFBSSxDQUFDLDRCQUE0QixDQUFDLGdCQUFnQixDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxDQUFDLElBQUksQ0FBQyxVQUFDLG1CQUFtQjtnQ0FDOUcsSUFBSSxtQkFBbUIsRUFBRTtvQ0FDdkIsSUFBTSxPQUFPLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO29DQUM5QixDQUFDLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FBQztvQ0FDNUIsSUFBTSxXQUFXLEdBQUcsQ0FBRSxtQkFBbUIsQ0FBRSxDQUFDO29DQUM1QyxJQUFJLE9BQU8sQ0FBQyxPQUFPLEVBQUU7d0NBQUUsV0FBVyxDQUFDLElBQUksQ0FBQyxHQUFHLEdBQUcsT0FBTyxDQUFDLE9BQU8sR0FBRyxHQUFHLENBQUUsQ0FBQztxQ0FBRTtvQ0FDeEUsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUM7aUNBQ3JDO2dDQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0NBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO2dDQUNyQyxPQUFPLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUMsVUFBQyxLQUFLO29DQUMxQixJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztvQ0FDakMsSUFBTSxPQUFPLEdBQUc7d0NBQ2QsWUFBWSxFQUFFLEtBQUssQ0FBQyxLQUFLO3dDQUN6QixlQUFlLEVBQUUsS0FBSyxDQUFDLEtBQUs7d0NBQzVCLElBQUksRUFBRSxLQUFLLENBQUMsS0FBSztxQ0FDbEIsQ0FBQztvQ0FDRixJQUFJLENBQUMsb0JBQW9CLEdBQUcsS0FBSyxDQUFDLEtBQUssQ0FBQztvQ0FDeEMsSUFBSSxLQUFLLENBQUMsS0FBSyxLQUFLLENBQUMsRUFBRTt3Q0FDckIsSUFBSSxDQUFDLGVBQWUsRUFBRSxDQUFDO3FDQUN4QjtvQ0FDRCxrQkFBa0I7b0NBQ2xCLElBQUksQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxDQUFDO29DQUN4QixjQUFjO29DQUNkLE9BQU8sVUFBVSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2dDQUMvQixDQUFDLENBQUMsQ0FBQzs0QkFDTCxDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxHQUFHO2dDQUNYLHVCQUF1QjtnQ0FDdkIsT0FBTyxDQUFDLEtBQUssQ0FBQyxRQUFRLEVBQUUsR0FBRyxDQUFDLENBQUM7Z0NBQzdCLGFBQWE7Z0NBQ2IsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztnQ0FDdEIsSUFBSSxDQUFDLG9CQUFvQixHQUFHLENBQUMsQ0FBQztnQ0FDOUIsNkJBQTZCO2dDQUM3QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxhQUFhLENBQUMsQ0FBQztnQ0FDOUIsT0FBTyxVQUFVLENBQUMsYUFBYSxDQUFDLENBQUM7NEJBQ25DLENBQUMsQ0FBQyxDQUFDO3lCQUNKO3dCQUNELElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDLENBQUM7d0JBQzlCLElBQUksQ0FBQyxlQUFlLEdBQUcsQ0FBQyxDQUFDLFNBQVMsRUFBRSxDQUFDO3dCQUNyQyxDQUFDLENBQUMsT0FBTyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsS0FBSzs0QkFDckIsSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLENBQUM7NEJBQ2pDLElBQU0sT0FBTyxHQUFHO2dDQUNkLFlBQVksRUFBRSxLQUFLLENBQUMsS0FBSztnQ0FDekIsZUFBZSxFQUFFLEtBQUssQ0FBQyxLQUFLO2dDQUM1QixJQUFJLEVBQUUsS0FBSyxDQUFDLEtBQUs7NkJBQ2xCLENBQUM7NEJBQ0YsSUFBSSxDQUFDLG9CQUFvQixHQUFHLEtBQUssQ0FBQyxLQUFLLENBQUM7NEJBQ3hDLElBQUksS0FBSyxDQUFDLEtBQUssS0FBSyxDQUFDLEVBQUU7Z0NBQ3JCLElBQUksQ0FBQyxlQUFlLEVBQUUsQ0FBQzs2QkFDeEI7NEJBQ0Qsa0JBQWtCOzRCQUNsQixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsQ0FBQzs0QkFDeEIsY0FBYzs0QkFDZCxPQUFPLFVBQVUsQ0FBQyxPQUFPLENBQUMsQ0FBQzt3QkFDN0IsQ0FBQyxDQUFDLENBQUMsS0FBSyxDQUFDLFVBQUMsR0FBRzs0QkFDWCx1QkFBdUI7NEJBQ3ZCLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLEdBQUcsQ0FBQyxDQUFDOzRCQUM3QixhQUFhOzRCQUNiLElBQUksQ0FBQyxXQUFXLENBQUMsR0FBRyxDQUFDLENBQUM7NEJBQ3RCLDZCQUE2Qjs0QkFDN0IsSUFBSSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsYUFBYSxDQUFDLENBQUM7NEJBQzlCLE9BQU8sVUFBVSxDQUFDLGFBQWEsQ0FBQyxDQUFDO3dCQUNuQyxDQUFDLENBQUMsQ0FBQztvQkFDTCxDQUFDLENBQUMsQ0FBQztnQkFDTCxDQUFDO2dCQUNELFFBQVEsRUFBRSxNQUFNLENBQUMsTUFBTSxDQUFDLEVBQUcsRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLFNBQVMsQ0FBQyxrQkFBa0IsQ0FBQyxFQUN4RSxFQUFDLFVBQVUsRUFBRSxHQUFHLEVBQUUsQ0FBQzthQUN0QixDQUFDO1lBQ0YsNERBQTREO1lBQzVELElBQUksSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLEVBQUU7Z0JBQ3hCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsY0FBWSxDQUFDLFNBQVMsQ0FBQyxVQUFBLFdBQVcsSUFBSSxPQUFBLFdBQVcsQ0FBQyxJQUFJLEtBQUssQ0FBQyxFQUF0QixDQUFzQixDQUFDLEVBQTdELENBQTZELENBQUMsQ0FBQyxNQUFNLENBQUMsVUFBQSxLQUFLLElBQUksT0FBQSxLQUFLLElBQUksQ0FBQyxFQUFWLENBQVUsQ0FBQyxDQUFDO2dCQUMvSCxJQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsR0FBRyxDQUFDLFVBQUEsQ0FBQyxJQUFJLE9BQUEsY0FBWSxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksRUFBcEIsQ0FBb0IsQ0FBQyxDQUFDO2dCQUNwRCxJQUFNLFdBQVcsR0FBRyxVQUFVLElBQW9CLEVBQUUsS0FBYSxFQUFFLEtBQWE7b0JBQzlFLElBQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxrQkFBa0IsQ0FDM0QsSUFBSSxDQUFDLGNBQXFCLEVBQzFCO3dCQUNFLEtBQUssT0FBQTt3QkFDTCxJQUFJLE1BQUE7d0JBQ0osS0FBSyxPQUFBO3FCQUNOLENBQ0YsQ0FBQztvQkFDRixhQUFhLENBQUMsYUFBYSxFQUFFLENBQUM7b0JBQzlCLElBQUksYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsQ0FBQyxFQUFFO3dCQUN0QyxNQUFNLElBQUksS0FBSyxDQUFDLGlEQUFpRCxDQUFDLENBQUE7cUJBQ25FO29CQUNELE9BQU8sYUFBYSxDQUFDLFNBQVMsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEMsQ0FBQyxDQUFBO2dCQUNELHFCQUFxQjtnQkFDckIsSUFBTSxTQUFTLEdBQUcsVUFBVSxJQUFvQixFQUFFLEtBQWEsRUFBRSxLQUFhO29CQUM1RSxJQUFNLGFBQWEsR0FBRyxJQUFJLENBQUMsaUJBQWlCLENBQUMsa0JBQWtCLENBQzNELElBQUksQ0FBQyxjQUFxQixFQUMxQjt3QkFDRSxLQUFLLE9BQUE7d0JBQ0wsSUFBSSxNQUFBO3dCQUNKLEtBQUssT0FBQTtxQkFDTixDQUNGLENBQUM7b0JBQ0YsYUFBYSxDQUFDLGFBQWEsRUFBRSxDQUFDO29CQUM5QixJQUFJLGFBQWEsQ0FBQyxTQUFTLENBQUMsTUFBTSxHQUFHLENBQUMsRUFBRTt3QkFDdEMsTUFBTSxJQUFJLEtBQUssQ0FBQyxpREFBaUQsQ0FBQyxDQUFBO3FCQUNuRTtvQkFDRCxPQUFPLGFBQWEsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3RDLENBQUMsQ0FBQTtnQkFDRCxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxFQUFFLFFBQVEsRUFBRSxFQUFFLE9BQU8sU0FBQSxFQUFFLFNBQVMsV0FBQSxFQUFFLFdBQVcsYUFBQSxFQUFFLEVBQUUsRUFBRSxFQUFFLENBQUMsQ0FBQzthQUNoRjtZQUVELElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxZQUFZLEVBQUU7Z0JBQzVCLElBQU0sSUFBSSxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLElBQUksSUFBSSxDQUFDLENBQUM7Z0JBQ2hELElBQU0sS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsWUFBWSxDQUFDLEtBQUssSUFBSSxDQUFDLENBQUM7Z0JBQ2xELElBQU0sWUFBWSxHQUFHO29CQUNuQixJQUFJLE1BQUE7b0JBQ0osS0FBSyxPQUFBO2lCQUNOLENBQUM7Z0JBQ0YsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUU7b0JBQ3RCLFlBQVksY0FBQTtpQkFDYixDQUFDLENBQUM7YUFDSjtZQUVELElBQU0sYUFBYSxHQUFHO2dCQUNwQixTQUFTLEVBQUUsSUFBSSxDQUFDLFNBQVM7YUFDMUIsQ0FBQztZQUNGLElBQUksSUFBSSxDQUFDLGlCQUFpQixFQUFFO2dCQUMxQixNQUFNLENBQUMsTUFBTSxDQUFDLGFBQWEsRUFBRTtvQkFDM0IsaUJBQWlCLEVBQUUsSUFBSSxDQUFDLGlCQUFpQjtpQkFDMUMsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUIsTUFBTSxDQUFDLE1BQU0sQ0FBQyxhQUFhLEVBQUU7b0JBQzNCLGlCQUFpQixFQUFFLElBQUksQ0FBQyxpQkFBaUI7aUJBQzFDLENBQUMsQ0FBQzthQUNKO1lBQ0QsTUFBTSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsYUFBYSxDQUFDLENBQUM7WUFFdkMsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQiwyQkFBMkI7Z0JBQzNCLE1BQU0sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFO29CQUN0QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87b0JBQ3JCLGNBQWMsRUFBRSxLQUFLO29CQUNyQixRQUFRLEVBQUU7d0JBQ1IsZ0JBQWdCLEVBQUUsS0FBSzt3QkFDdkIsYUFBYSxFQUFFLEtBQUssQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQyxFQUFFO3FCQUNuRjtpQkFDRixDQUFDLENBQUM7YUFDSjtpQkFBTTtnQkFDTCxNQUFNLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRTtvQkFDdEIsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO29CQUNyQixNQUFNLEVBQUUsSUFBSSxDQUFDLE1BQU07b0JBQ25CLFVBQVUsRUFBRSxJQUFJLENBQUMsVUFBVTtpQkFDNUIsQ0FBQyxDQUFDO2FBQ0o7WUFDRCxJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7YUFFcEI7WUFDRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7Z0JBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxFQUFFLENBQUM7YUFDMUI7WUFDRCw0Q0FBNEM7WUFDNUMsSUFBSSxDQUFDLFNBQVMsR0FBRyxjQUFZLENBQUMsRUFBRSxDQUFDLFNBQVMsRUFBRSxVQUFDLEtBQUs7Z0JBQ2hELElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxLQUFLLENBQUMsTUFBTSxDQUFDLENBQUMsTUFBTSxFQUFFLENBQUM7Z0JBQy9DLG1CQUFtQjtnQkFDbkIsUUFBUSxDQUFDLEVBQUUsQ0FBQyxRQUFRLEVBQUUsVUFBQyxXQUFXO29CQUNoQyxJQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsV0FBVyxDQUFDLE1BQU0sQ0FBQyxDQUFDO29CQUMxQyxJQUFNLEdBQUcsR0FBRyxNQUFNLENBQUMsU0FBUyxFQUFZLENBQUM7b0JBQ3pDLElBQU0sSUFBSSxHQUFHLE1BQU0sQ0FBQyxVQUFVLEVBQVksQ0FBQztvQkFDM0MsSUFBSSxLQUFJLENBQUMsU0FBUyxFQUFFO3dCQUNsQixLQUFJLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQzs0QkFDZixHQUFHLEtBQUE7NEJBQ0gsSUFBSSxNQUFBO3lCQUNMLENBQUMsQ0FBQztxQkFDSjtnQkFDSCxDQUFDLENBQUMsQ0FBQztZQUNMLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQztZQUN2QixJQUFJLENBQUMsSUFBSSxDQUFDLElBQUksRUFBRSxDQUFDO1lBQ2pCLHNCQUFzQjtZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUNwRSxJQUFNLFlBQVksR0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWdDO3FCQUNqRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDckMsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0QztnQkFDRCxJQUFNLGNBQWMsR0FBSyxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWdDO3FCQUNwRSxhQUFhLENBQUMsWUFBWSxDQUFDLENBQUM7Z0JBQy9CLElBQUksY0FBYyxFQUFFO29CQUNsQixjQUFjLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxNQUFNLENBQUMsQ0FBQztpQkFDdEM7YUFDRjtZQUNELHNCQUFzQjtZQUN0QixJQUFJLENBQUMsSUFBSSxDQUFDLFVBQVUsSUFBSSxJQUFJLENBQUMsUUFBUSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsYUFBYSxFQUFFO2dCQUNwRSxJQUFNLFlBQVksR0FBSSxJQUFJLENBQUMsUUFBUSxDQUFDLGFBQWdDO3FCQUNqRSxhQUFhLENBQUMsa0JBQWtCLENBQUMsQ0FBQztnQkFDckMsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLFlBQVksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDO2lCQUN0QzthQUNGO1lBQ0QsMkJBQTJCO1lBRTNCLElBQU0sYUFBYSxHQUFHLFVBQUMsS0FBVTtnQkFDL0IsSUFBTSxNQUFNLEdBQUcsS0FBSyxDQUFDLGFBQTRCLENBQUM7Z0JBQ2xELHdCQUF3QjtnQkFDeEIsSUFBTSxXQUFXLEdBQUcsTUFBTSxDQUFDLE9BQU8sQ0FBQyxLQUFLLElBQUksT0FBTyxDQUFDO2dCQUNwRCxVQUFVO2dCQUNWLElBQU0sR0FBRyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztnQkFDckQsZUFBZTtnQkFDZixJQUFNLElBQUksR0FBRyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUM7Z0JBQ3hCLEtBQUksQ0FBQyxXQUFXLENBQUMsSUFBSSxDQUFDO29CQUNwQixJQUFJLEVBQUUsV0FBVztvQkFDakIsSUFBSSxNQUFBO29CQUNKLEdBQUcsRUFBRSxHQUFHLENBQUMsS0FBSyxFQUFFO2lCQUNqQixDQUFDLENBQUM7WUFDTCxDQUFDLENBQUM7WUFDRixJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsQ0FBQyxPQUFPLEVBQUUsWUFBWSxDQUFDLENBQUM7WUFDMUMsSUFBSSxDQUFDLFNBQVMsQ0FBQyxFQUFFLENBQUMsT0FBTyxFQUFFLFlBQVksRUFBRSxhQUFhLENBQUMsQ0FBQztZQUN4RCxxQkFBcUI7WUFDckIsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFO2dCQUNuQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQzthQUN4QjtTQUNGO0lBQ0gsQ0FBQztJQUVELGdEQUFlLEdBQWY7SUFDQSxDQUFDO0lBRUQsMENBQVMsR0FBVCxVQUFVLEtBQWE7UUFDckIsSUFBSSxJQUFJLENBQUMsU0FBUyxFQUFFO1lBQ2xCLElBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQzFDO0lBQ0gsQ0FBQztJQUVELDJDQUFVLEdBQVYsVUFBVyxLQUFhO1FBQ3RCLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixJQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sRUFBRSxDQUFDLFVBQVUsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUMzQztJQUNILENBQUM7SUFFRCxzQkFBSSw2Q0FBUzthQUFiO1lBQUEsaUJBZ0JDO1lBZkMsSUFBSSxJQUFJLENBQUMsTUFBTSxJQUFJLElBQUksRUFBRTtnQkFDdkIsT0FBTzthQUNSO1lBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksRUFBRTtnQkFDaEMsT0FBTzthQUNSO1lBQ0QsbUNBQW1DO1lBQ25DLElBQU0sVUFBVSxHQUFHLElBQUksQ0FBQyxNQUFNLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEVBQUUsQ0FBQztZQUN6RCxJQUFNLEtBQUssR0FBRyxVQUFVLENBQUMsQ0FBQyxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUM7WUFDMUQsSUFBTSxDQUFDLEdBQUcsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7WUFDbkQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsZUFBZSxDQUFDLENBQUMsT0FBTyxDQUFFLFVBQUMsR0FBRztnQkFDN0MsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxHQUFHLEVBQUUsS0FBSSxDQUFDLGVBQWUsSUFBSSxLQUFJLENBQUMsZUFBZSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUM7WUFDckUsQ0FBQyxDQUFDLENBQUM7WUFDSCxlQUFlO1lBQ2YsT0FBTyxDQUFDLENBQUM7UUFDWCxDQUFDOzs7T0FBQTtJQUVEOzs7T0FHRztJQUNJLHlDQUFRLEdBQWYsVUFBZ0IsSUFBUztRQUF6QixpQkFvRUM7UUFuRUMsSUFBSSxJQUFJLElBQUksSUFBSSxFQUFFO1lBQ2hCLE9BQU87U0FDUjtRQUNELElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLEVBQUU7WUFDM0IsT0FBTztTQUNQO1FBQ0QsSUFBSSxJQUFJLENBQUMsZUFBZSxJQUFJLElBQUksRUFBRTtZQUNoQyxPQUFPO1NBQ1I7UUFDRCxXQUFXO1FBQ1gsSUFBTSxJQUFJLEdBQUcsS0FBSyxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsU0FBUyxDQUFDLElBQUksRUFBRSxDQUFDLElBQUksRUFBRSxDQUFDLENBQUM7UUFDdEQsSUFBSSxJQUFJLElBQUksSUFBSSxDQUFDLE1BQU0sRUFBRTtZQUN2QixjQUFjO1lBQ2QsSUFBTSxVQUFRLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztZQUNuQyxJQUFJLFVBQVEsQ0FBQyxNQUFNLEtBQUssQ0FBQyxFQUFFO2dCQUN6QixhQUFhO2dCQUNiLE9BQU87YUFDUjtZQUNELDRDQUE0QztZQUM1QyxJQUFNLFVBQVEsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQUMsR0FBUTtnQkFDdkMsT0FBTyxVQUFRLENBQUMsR0FBRyxDQUFFLFVBQUMsR0FBRztvQkFDdkIsT0FBTyxHQUFHLENBQUMsR0FBRyxDQUFDLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDO2dCQUNoQyxDQUFDLENBQUMsQ0FBQyxNQUFNLENBQUUsVUFBQyxHQUFHO29CQUNiLE9BQU8sR0FBRyxLQUFLLEtBQUssQ0FBQztnQkFDdkIsQ0FBQyxDQUFDLENBQUMsTUFBTSxLQUFLLENBQUMsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUNILHdCQUF3QjtZQUN4QixJQUFJLFVBQVEsSUFBSSxDQUFDLEVBQUU7Z0JBQ2pCLElBQU0sT0FBSyxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsS0FBSyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7Z0JBQ25FLG9CQUFvQjtnQkFDcEIsT0FBSyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUUsSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLENBQUMsQ0FBQztnQkFDeEQsSUFBSSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sRUFBRTtvQkFDaEMsMEJBQTBCO29CQUMxQixPQUFLLENBQUMsUUFBUSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sQ0FBQyxDQUFDO2lCQUN6RDtnQkFDRCx1QkFBdUI7Z0JBQ3ZCLFVBQVEsQ0FBQyxPQUFPLENBQUUsVUFBQyxHQUFHO29CQUNwQixJQUFNLE1BQU0sR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUUsVUFBQyxHQUFHO3dCQUMzQyxPQUFPLEdBQUcsQ0FBQyxRQUFRLEtBQUssR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLEtBQUssR0FBRyxDQUFDO29CQUNsRCxDQUFDLENBQUMsQ0FBQztvQkFDSCxJQUFJLE1BQU0sRUFBRTt3QkFDVix1QkFBdUI7d0JBQ3ZCLElBQU0sUUFBUSxHQUFHLE1BQU0sQ0FBQyxRQUFRLElBQUksTUFBTSxDQUFDLElBQUksQ0FBQzt3QkFDaEQsT0FBSyxDQUFDLEdBQUcsQ0FBQyxRQUFrQixDQUFDLENBQUMsS0FBSyxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsQ0FBQyxDQUFDO3FCQUNoRDt5QkFBTTt3QkFDTCxPQUFLLENBQUMsR0FBRyxDQUFDLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsQ0FBQztxQkFDakM7Z0JBQ0gsQ0FBQyxDQUFDLENBQUM7Z0JBQ0gsdUJBQXVCO2dCQUN2QixPQUFPLE9BQUssQ0FBQyxPQUFPLEVBQUUsQ0FBQyxJQUFJLENBQUUsVUFBQyxJQUFJO29CQUNoQyxpQkFBaUI7b0JBQ2pCLElBQU0sR0FBRyxHQUFHLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFVBQVEsQ0FBQyxDQUFDO29CQUN6QyxJQUFNLE9BQU8sR0FBRyxNQUFNLENBQUMsR0FBRyxDQUFDLElBQUksRUFBRSxDQUFDLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsQ0FBQztvQkFDckUsSUFBSSxJQUFJLEVBQUU7d0JBQ1IsYUFBYTt3QkFDYixHQUFHLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO3dCQUNmLE1BQU0sQ0FBQyxHQUFHLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxPQUFPLEVBQUUsS0FBSSxDQUFDLGlCQUFpQixDQUFDLElBQUksQ0FBQyxLQUFJLENBQUMsQ0FBQyxDQUFDO3dCQUNqRyw2QkFBNkI7d0JBQzdCLElBQUksT0FBTyxFQUFFOzRCQUNYLEtBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO3lCQUMzQjtxQkFDRjtvQkFDRCxPQUFPLE9BQU8sQ0FBQyxPQUFPLEVBQUUsQ0FBQztnQkFDM0IsQ0FBQyxDQUFDLENBQUM7YUFDSjtTQUNGO1FBQ0QsT0FBTyxPQUFPLENBQUMsT0FBTyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUVNLDRDQUFXLEdBQWxCO1FBQ0UsSUFBSSxJQUFJLENBQUMsa0JBQWtCLEVBQUU7WUFDM0IsSUFBSSxDQUFDLGtCQUFrQixDQUFDLFdBQVcsRUFBRSxDQUFDO1NBQ3ZDO0lBQ0gsQ0FBQztJQUVEOzs7T0FHRztJQUNJLGtEQUFpQixHQUF4QixVQUF5QixNQUFNO1FBQzdCLElBQU0sS0FBSyxHQUFJLE1BQU0sQ0FBQyxNQUEwQixDQUFDO1FBQ2pELElBQU0sU0FBUyxHQUFHLFVBQVUsQ0FBQyxJQUFJLENBQUMsS0FBSyxDQUFDLEVBQUUsQ0FBQyxDQUFDO1FBQzVDLGtCQUFrQjtRQUNsQixJQUFNLFFBQVEsR0FBRyxRQUFRLENBQUMsQ0FBQyxTQUFTLElBQUksU0FBUyxDQUFDLENBQUMsQ0FBQyxDQUFXLEVBQUUsRUFBRSxDQUFDLENBQUM7UUFDckUsVUFBVTtRQUNWLElBQU0sR0FBRyxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxDQUFDLFFBQVEsQ0FBQyxDQUFDLElBQUksRUFBRSxDQUFDO1FBQ2hELHFCQUFxQjtRQUNyQixJQUFJLEdBQUcsRUFBRTtZQUNQLElBQU0sS0FBRyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFFBQVEsSUFBSSxFQUFFLENBQUM7WUFDbEQsSUFBTSxJQUFFLEdBQUcsR0FBRyxDQUFDLEtBQUcsQ0FBQyxDQUFDO1lBQ3BCLElBQUksYUFBYSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSTtnQkFDL0MsT0FBTyxJQUFJLENBQUMsS0FBRyxDQUFDLEtBQUssSUFBRSxDQUFDO1lBQzFCLENBQUMsQ0FBQyxDQUFDO1lBQ0gsSUFBSSxLQUFLLENBQUMsT0FBTyxFQUFFO2dCQUNqQixJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUU7b0JBQ3JCLDJCQUEyQjtvQkFDM0IsSUFBSSxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3hCLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxRQUFRLENBQUMsQ0FBQztpQkFDeEM7YUFDRjtpQkFBTTtnQkFDTCxJQUFJLGFBQWEsSUFBSSxDQUFDLEVBQUU7b0JBQ3RCLHVCQUF1QjtvQkFDdkIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxNQUFNLENBQUMsYUFBYSxFQUFFLENBQUMsQ0FBQyxDQUFDO29CQUN2QyxJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7d0JBQ3BCLDZCQUE2Qjt3QkFDN0IsYUFBYSxHQUFHLElBQUksQ0FBQyxVQUFVLENBQUMsU0FBUyxDQUFDLFVBQUMsSUFBSTs0QkFDN0MsT0FBTyxJQUFJLENBQUMsS0FBRyxDQUFDLEtBQUssSUFBRSxDQUFDO3dCQUMxQixDQUFDLENBQUMsQ0FBQzt3QkFDSCxJQUFJLGFBQWEsR0FBRyxDQUFDLEVBQUU7NEJBQ3JCLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDOzRCQUMxQixJQUFJLENBQUMsYUFBYSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDLENBQUM7eUJBQ3hDO3FCQUNGO2lCQUNGO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTyxnREFBZSxHQUF2QjtRQUNFLDhCQUE4QjtRQUM5Qix5QkFBeUI7UUFDekIsZ0VBQWdFO1FBQ2hFLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsV0FBVztnQkFDL0MsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxJQUFJLENBQUMsVUFBVSxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsYUFBYSxDQUFDLFNBQVMsQ0FBQztTQUMvRztJQUNILENBQUM7SUFFTyw0Q0FBVyxHQUFuQixVQUFvQixHQUFTO1FBQzNCLElBQUksSUFBSSxDQUFDLFNBQVMsSUFBSSxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsRUFBRTtZQUMvQyxJQUFNLE9BQU8sR0FBRyxDQUFDLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUErQixDQUFDLENBQUM7WUFDM0YsSUFBSSxZQUFZLFNBQUssQ0FBQztZQUN0QixJQUFJLE9BQU8sRUFBRTtnQkFDWCxZQUFZLEdBQUcsT0FBTyxDQUFDLG9CQUFvQixDQUFDLE9BQU8sQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUM5RDtZQUNELElBQUksR0FBRyxFQUFFO2dCQUNQLElBQUksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDO2dCQUNyQixJQUFJLE9BQU8sR0FBRyxDQUFDLE1BQU0sS0FBSyxRQUFRLEVBQUU7b0JBQ2xDLElBQUksSUFBSSxDQUFDLGFBQWEsRUFBRTt3QkFDdEIsNERBQTREO3dCQUM1RCxpRUFBaUU7d0JBQ2pFLE1BQU0sQ0FBQyxNQUFNLENBQUMsR0FBRyxFQUFFOzRCQUNqQixTQUFTLEVBQUU7Z0NBQ1QsTUFBTSxFQUFFLEdBQUcsQ0FBQyxNQUFNO2dDQUNsQixVQUFVLEVBQUUsR0FBRyxDQUFDLFVBQVU7NkJBQzNCO3lCQUNGLENBQUMsQ0FBQzt3QkFDSCxJQUFJLENBQUMsYUFBYSxDQUFDLFdBQVcsQ0FBQyxHQUFHLENBQUMsQ0FBQztxQkFDckM7aUJBQ0Y7Z0JBQ0QsSUFBSSxZQUFZLEVBQUU7b0JBQ2hCLFlBQVksQ0FBQyxTQUFTLEdBQUcsR0FBRyxDQUFDLEtBQUssSUFBSSxHQUFHLENBQUMsS0FBSyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxDQUFDLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxPQUFPLENBQUM7aUJBQzNGO2dCQUNELElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXO29CQUMvQyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLElBQUksQ0FBQyxhQUFhLElBQUksSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDO2FBQ3JIO2lCQUFNO2dCQUNMLElBQUksWUFBWSxFQUFFO29CQUNoQixZQUFZLENBQUMsU0FBUyxHQUFHLEVBQUUsQ0FBQztpQkFDN0I7Z0JBQ0QsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFdBQVcsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQyxTQUFTLENBQUMsWUFBWSxHQUFHLEVBQUUsQ0FBQzthQUN6RztTQUNGO0lBQ0gsQ0FBQztJQUVPLGdEQUFlLEdBQXZCO1FBQ0UsSUFBSSxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQy9DLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsU0FBUyxDQUFDLFlBQVksR0FBRyxFQUFFLENBQUM7U0FDekc7SUFDSCxDQUFDO0lBRU0sdUNBQU0sR0FBYjtRQUNFLElBQU0sT0FBTyxHQUFnQixRQUFRLENBQUMsYUFBYSxDQUFDLDRCQUE0QixDQUFnQixDQUFDO1FBQ2pHLE9BQU8sQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNsQixDQUFDO0lBRU0sOENBQWEsR0FBcEIsVUFBcUIsYUFBYTtRQUNoQyxJQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDO1FBQzdCLElBQUksQ0FBQyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxPQUFPLENBQUMsVUFBQyxNQUFNLEVBQUUsQ0FBQztZQUM3QyxJQUFJLENBQUMsTUFBTSxDQUFDLE1BQU0sRUFBRTtnQkFDbEIsSUFBSSxhQUFhLENBQUMsUUFBUSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRTtvQkFDdkMseUNBQXlDO29CQUN6QyxLQUFLLENBQUMsTUFBTSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEdBQUcsT0FBTyxDQUFDLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxDQUFDO2lCQUNuRDtxQkFBTTtvQkFDTCx5Q0FBeUM7b0JBQ3pDLEtBQUssQ0FBQyxNQUFNLENBQUMsTUFBTSxDQUFDLElBQUksR0FBRyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsS0FBSyxDQUFDLENBQUM7aUJBQ3BEO2FBQ0Y7UUFDSCxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7SUFFTSwwQ0FBUyxHQUFoQjtRQUNFLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFDO0lBRU0sNENBQVcsR0FBbEIsVUFBbUIsT0FBc0I7UUFBekMsaUJBbUJDO1FBbEJDLElBQUksTUFBTSxDQUFDLFNBQVMsQ0FBQyxjQUFjLENBQUMsSUFBSSxDQUFDLE9BQU8sRUFBRSxXQUFXLENBQUMsRUFBRTtZQUM5RCxJQUFJLE9BQU8sQ0FBQyxTQUFTLElBQUksSUFBSSxFQUFFO2dCQUM3QixxQ0FBcUM7Z0JBQ3JDLDBDQUEwQztnQkFDMUMsSUFBSSxPQUFPLENBQUMsU0FBUyxDQUFDLFlBQVksSUFBSSxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxJQUFJLE9BQU8sQ0FBQyxTQUFTLENBQUMsYUFBYSxDQUFDLEVBQUU7b0JBQ3pHLElBQUksQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLE9BQU8sQ0FBQyxTQUFTLENBQUMsWUFBWSxDQUFDLENBQUMsU0FBUyxFQUFFLENBQUMsSUFBSSxDQUFDLFVBQUMsTUFBMEI7d0JBQ3pGLG9CQUFvQjt3QkFDcEIsS0FBSSxDQUFDLE1BQU0sR0FBRyxNQUFNLENBQUM7d0JBQ3JCLEtBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQzt3QkFDZixtQkFBbUI7d0JBQ25CLEtBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztvQkFDZixDQUFDLENBQUMsQ0FBQyxLQUFLLENBQUMsVUFBQyxHQUFHO3dCQUNYLE9BQU8sQ0FBQyxLQUFLLENBQUMsUUFBUSxFQUFFLHNEQUFzRCxDQUFDLENBQUM7d0JBQ2hGLE9BQU8sQ0FBQyxLQUFLLENBQUMsR0FBRyxDQUFDLENBQUM7b0JBQ3JCLENBQUMsQ0FBQyxDQUFDO2lCQUNKO2FBQ0Y7U0FDRjtJQUNILENBQUM7SUFFTSxzQ0FBSyxHQUFaLFVBQWEsSUFBYztRQUN6QixJQUFJLENBQUMsS0FBSyxHQUFHLFNBQVMsQ0FBQztRQUN2QixJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDZixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQyxJQUFJLENBQUM7UUFDdkIsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDO0lBQ2xCLENBQUM7SUFFRCw4Q0FBYSxHQUFiO1FBQUEsaUJBeUVDO1FBeEVDLHdDQUF3QztRQUN4QyxJQUFNLFdBQVcsR0FBYSxJQUFJLENBQUMsU0FBUyxDQUFDLFVBQVUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNoRSx5QkFBeUI7UUFDekIsSUFBTSxVQUFVLEdBQUcsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQyxJQUFJLEVBQUUsQ0FBQyxPQUFPLENBQUM7UUFDNUQsSUFBTSxPQUFPLEdBQUcsVUFBVSxDQUFDLEdBQUcsQ0FBQyxVQUM3QixTQUNvQyxFQUFFLENBQVM7WUFDL0MsSUFBTSxHQUFHLEdBQUcsWUFBVSxDQUFHLENBQUM7WUFDMUIsSUFBSSxLQUFLLEdBQUcsU0FBUyxDQUFDLEtBQUssQ0FBQztZQUM1QixtQkFBbUI7WUFDbkIsSUFBTSxLQUFLLEdBQUksV0FBVyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN0QyxJQUFNLE9BQU8sR0FBRyxLQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsQ0FBQztZQUN2RCw4QkFBOEI7WUFDOUIsSUFBSSxDQUFDLEtBQUssQ0FBQyxJQUFJLEtBQUksQ0FBQyxVQUFVLEVBQUU7Z0JBQzlCLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxHQUFHLEdBQUcsQ0FBQzthQUMzRTtZQUNELG1CQUFtQjtZQUNuQixJQUFJLEtBQUssSUFBSSxJQUFJLElBQUksS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7Z0JBQ3ZDLEtBQUssR0FBRyxTQUFTLENBQUM7YUFDbkI7WUFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2pCLGlDQUFpQztnQkFDakMsSUFBSSxXQUFXLFNBQW9CLENBQUM7Z0JBQ3BDLElBQUksS0FBSSxDQUFDLFVBQVUsRUFBRTtvQkFDbkIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO3dCQUNULFdBQVcsR0FBRyxLQUFJLENBQUMsTUFBTSxDQUFDLE9BQU8sQ0FBQyxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO3FCQUN0RDtpQkFDRjtxQkFBTTtvQkFDTCxXQUFXLEdBQUcsS0FBSSxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDLENBQUMsV0FBVyxDQUFDO2lCQUNsRDtnQkFDRCxJQUFJLFdBQVcsSUFBSSxJQUFJLEVBQUU7b0JBQ3ZCLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsR0FBRyxHQUFHLENBQUM7aUJBQ2pFO2FBQ0Y7WUFDRCxJQUFJLEtBQUssSUFBSSxJQUFJLEVBQUU7Z0JBQ2pCLEtBQUssR0FBRyxHQUFHLEdBQUcsS0FBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxzQkFBc0IsQ0FBQyxHQUFHLEdBQUcsQ0FBQzthQUM1RTtZQUNELE9BQU87Z0JBQ0wsR0FBRyxLQUFBO2dCQUNILEtBQUssT0FBQTtnQkFDTCxPQUFPLFNBQUE7Z0JBQ1AsS0FBSyxPQUFBO2FBQ04sQ0FBQztRQUNKLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGVBQWUsQ0FBQyxhQUFhLENBQUMsT0FBTyxDQUFDLENBQUMsSUFBSSxDQUFDLFVBQUMsS0FBSztZQUNyRCxJQUFJLEtBQUssQ0FBQyxNQUFNLEtBQUssSUFBSSxFQUFFO2dCQUN6QixJQUFNLE1BQU0sR0FBSSxLQUFLLENBQUMsT0FBaUI7cUJBQ3BDLEdBQUcsQ0FBQyxVQUFDLEdBQUc7b0JBQ1AsT0FBTzt3QkFDTCxHQUFHLEVBQUUsR0FBRyxDQUFDLEdBQUc7d0JBQ1osS0FBSyxFQUFFLEdBQUcsQ0FBQyxLQUFLO3FCQUNqQixDQUFDO2dCQUNKLENBQUMsQ0FBQztxQkFDRCxJQUFJLENBQUMsVUFBQyxDQUFDLEVBQUUsQ0FBQyxJQUFLLE9BQUEsQ0FBQyxDQUFDLEtBQUssR0FBRyxDQUFDLENBQUMsS0FBSyxFQUFqQixDQUFpQixDQUFDLENBQUM7Z0JBQ3JDLHdDQUF3QztnQkFDeEMsSUFBTSxPQUFPLEdBQUcsTUFBTTtxQkFDckIsR0FBRyxDQUFDLFVBQUMsSUFBSTtvQkFDUixPQUFRLEtBQUssQ0FBQyxPQUFpQixDQUFDLFNBQVMsQ0FBQyxVQUFDLElBQUksSUFBSyxPQUFBLElBQUksQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLEdBQUcsRUFBckIsQ0FBcUIsQ0FBQyxDQUFDO2dCQUM3RSxDQUFDLENBQUMsQ0FBQztnQkFDSCx5QkFBeUI7Z0JBQ3pCLEtBQUssSUFBSSxLQUFLLEdBQUcsQ0FBQyxFQUFFLEtBQUssR0FBSSxLQUFLLENBQUMsT0FBaUIsQ0FBQyxNQUFNLEVBQUUsS0FBSyxFQUFFLEVBQUU7b0JBQ3BFLElBQU0sT0FBTyxHQUFJLEtBQUssQ0FBQyxPQUFpQixDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUNoRCxJQUFNLFFBQVEsR0FBRyxXQUFXLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO29CQUM1QyxvQ0FBb0M7b0JBQ3BDLEtBQUksQ0FBQyxTQUFTLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsT0FBTyxFQUFFLElBQUksQ0FBQyxDQUFDO2lCQUNoRTtnQkFDRCw2QkFBNkI7Z0JBQzdCLEtBQUksQ0FBQyxTQUFTLENBQUMsVUFBVSxDQUFDLEtBQUssQ0FBQyxPQUFPLEVBQUUsSUFBSSxDQUFDLENBQUM7Z0JBQy9DLDBCQUEwQjtnQkFDMUIsS0FBSSxDQUFDLFNBQVMsQ0FBQyxJQUFJLEVBQUUsQ0FBQzthQUN2QjtRQUNILENBQUMsQ0FBQyxDQUFDO0lBQ0wsQ0FBQztJQUVEOzs7O09BSUc7SUFDVSwyQ0FBVSxHQUF2QixVQUF3QixPQUFnRDs7Ozs7Ozt3QkFFcEUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsQ0FBQzt3QkFDNUIsa0NBQWtDO3dCQUNsQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxvQkFBb0IsSUFBSSxJQUFJLENBQUMsTUFBTSxDQUFDLEVBQUU7NEJBQ2pFLGFBQWE7NEJBQ2Isc0JBQU87eUJBQ1I7d0JBRUssY0FBYyxHQUFHLElBQUksQ0FBQyxjQUFjLENBQUMsUUFBb0MsQ0FBQzt3QkFFMUUsV0FBVyxHQUNmLENBQUMsY0FBYyxJQUFJLGNBQWMsQ0FBQyxNQUFNLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLElBQUksY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLEdBQUcsQ0FBQyxDQUFDOzRCQUN2SCxDQUFDLENBQUMsY0FBYyxDQUFDLE1BQU0sQ0FBQyxXQUFXLENBQUMsQ0FBQyxDQUFDLGdCQUFnQixDQUFDO3dCQUN6RCxrQkFBa0I7d0JBQ2xCLElBQUksSUFBSSxDQUFDLG9CQUFvQixHQUFHLFdBQVcsRUFBRTs0QkFDM0MscUJBQXFCOzRCQUNyQixvQ0FBb0M7NEJBQ3BDLElBQUksT0FBTyxJQUFJLE9BQU8sQ0FBQyxZQUFZLEVBQUU7Z0NBQ25DLE9BQU8sQ0FBQyxZQUFZLENBQUMsSUFBSSx3QkFBd0IsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDLENBQUM7Z0NBQzVFLHNCQUFPOzZCQUNSOzRCQUNELGlDQUFpQzs0QkFDakMsSUFBSSxDQUFDLGFBQWEsQ0FBQyxpQkFBaUIsQ0FBQyxJQUFJLENBQUMsaUJBQWlCLENBQUMsT0FBTyxDQUFDLG1CQUFtQixDQUFDLEVBQ3RGLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsNEJBQTRCLEVBQ3pELEVBQUMsVUFBVSxFQUFFLElBQUksQ0FBQyxvQkFBb0IsRUFBRSxXQUFXLGFBQUEsRUFBQyxDQUFDLEVBQUUsY0FBYyxDQUFDLEVBQUUsQ0FBQyxDQUFDOzRCQUM5RSxzQkFBTzt5QkFDUjt3QkFFSyxtQkFBbUIsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDLFNBQVMsQ0FBQyxDQUFDLE1BQU0sQ0FBQzs2QkFFL0UsQ0FBQSxtQkFBbUIsS0FBSyxJQUFJLENBQUMsb0JBQW9CLENBQUEsRUFBakQsd0JBQWlEO3dCQUU3QyxLQUFpQixJQUFJLENBQUMsaUJBQWlCLEVBQUUsRUFBeEMsSUFBSSxVQUFBLEVBQUUsTUFBTSxZQUFBLENBQTZCO3dCQUNoRCwyQkFBMkI7d0JBQzNCLElBQUksQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFLLElBQUksQ0FBQyxpQkFBaUIsQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLElBQUksc0JBQXNCLENBQUMsVUFBTyxFQUFFOzRCQUN4SCxNQUFNLFFBQUE7NEJBQ04sVUFBVSxFQUFFLEtBQUs7eUJBQ3BCLENBQUMsQ0FBQzs7O3dCQUlHLGlCQUFpQixHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxFQUFFLENBQUMsSUFBSSxFQUFFLENBQUMsT0FBTyxFQUFFLENBQUM7d0JBSXpDLHFCQUFNLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQyxRQUFRLEVBQUUsRUFBQTs7d0JBQTNFLGVBQWUsR0FBRyxTQUF5RDt3QkFDakYsa0RBQWtEO3dCQUNsRCxJQUFJLENBQUMsU0FBUyxDQUFDLEtBQUssRUFBRSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsZUFBZSxDQUFDLENBQUM7d0JBRTNDLEtBQWlCLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxFQUF4QyxJQUFJLFVBQUEsRUFBRSxNQUFNLFlBQUEsQ0FBNkI7d0JBQ2hELG1CQUFtQjt3QkFDbkIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxLQUFLLEVBQUUsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLGlCQUFpQixDQUFDLENBQUM7d0JBQ25ELGtDQUFrQzt3QkFDbEMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUssSUFBSSxDQUFDLGlCQUFpQixDQUFDLE9BQU8sQ0FBQyxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssSUFBSSxzQkFBc0IsQ0FBQyxVQUFPLEVBQUU7NEJBQ3hILE1BQU0sUUFBQTs0QkFDTixVQUFVLEVBQUUsS0FBSzt5QkFDcEIsQ0FBQyxDQUFDOzs7b0JBRUwsT0FBTztvQkFDUCxzQkFBTzs7O3dCQUVQLFlBQVk7d0JBQ1osT0FBTyxDQUFDLEtBQUssQ0FBQyxLQUFHLENBQUMsQ0FBQzt3QkFDbkIsaUNBQWlDO3dCQUNqQyxJQUFJLE9BQU8sSUFBSSxPQUFPLENBQUMsWUFBWSxFQUFFOzRCQUNuQyxPQUFPLENBQUMsWUFBWSxDQUFDLEtBQUcsQ0FBQyxDQUFDO3lCQUMzQjs2QkFBTTs0QkFDTCw0QkFBNEI7NEJBQzVCLElBQUksQ0FBQyxhQUFhLENBQUMsU0FBUyxDQUFDLEtBQUcsRUFBRTtnQ0FDaEMsWUFBWSxFQUFFLEdBQUc7NkJBQ2xCLENBQUMsQ0FBQzt5QkFDSjs7O3dCQUVELElBQUksQ0FBQyxRQUFRLENBQUMsV0FBVyxFQUFFLENBQUM7Ozs7OztLQUUvQjtJQUVNLGtEQUFpQixHQUF4QjtRQUFBLGlCQStCQztRQTlCQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsU0FBUyxJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTztlQUN6QyxPQUFPLElBQUksQ0FBQyxTQUFTLENBQUMsT0FBTyxDQUFDLFVBQVUsS0FBSyxVQUFVLElBQUksSUFBSSxDQUFDLE1BQU0sQ0FBQyxFQUFFO1lBQzVFLE9BQU8sRUFBQyxJQUFJLEVBQUUsRUFBRSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUMsQ0FBQztTQUMvQjtRQUNELDhCQUE4QjtRQUMxQixJQUFBLHdDQUFvRCxFQUFuRCxjQUFJLEVBQUUsa0JBQTZDLENBQUM7UUFDekQsSUFBTSxjQUFjLEdBQWEsRUFBRSxDQUFDO1FBQ3BDLG1CQUFtQjtRQUNuQixNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxVQUFDLFVBQWtCLEVBQUUsS0FBYTtZQUN2RCx3QkFBd0I7WUFDeEIsSUFBSSxVQUFVLENBQUMsSUFBSSxFQUFFLENBQUMsTUFBTSxLQUFLLENBQUMsRUFBRTtnQkFDbEMsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELHlCQUF5QjtZQUN6Qiw2Q0FBNkM7WUFDN0Msd0VBQXdFO1lBQ3hFLElBQUksQ0FBQyxLQUFJLENBQUMsU0FBUyxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsQ0FBQyxPQUFPLEVBQUUsRUFBRTtnQkFDM0MsY0FBYyxDQUFDLElBQUksQ0FBQyxLQUFLLENBQUMsQ0FBQztnQkFDM0IsT0FBTyxLQUFLLENBQUM7YUFDZDtZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQyxDQUFDLENBQUM7UUFDSCxnQkFBZ0I7UUFDaEIsSUFBSSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsVUFBQyxHQUFXO1lBQzFCLE9BQU8sR0FBRyxDQUFDLE1BQU0sQ0FBQyxVQUFDLENBQUMsRUFBRSxRQUFnQjtnQkFDcEMsT0FBTyxjQUFjLENBQUMsT0FBTyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQyxDQUFDO1lBQ2pELENBQUMsQ0FBQyxDQUFDO1FBQ0wsQ0FBQyxDQUFDLENBQUM7UUFDSCxPQUFPLEVBQUMsSUFBSSxNQUFBLEVBQUUsTUFBTSxRQUFBLEVBQUMsQ0FBQztJQUN4QixDQUFDOztnQkFyNUM2QixrQkFBa0I7Z0RBQ25DLE1BQU0sU0FBQyxpQkFBaUI7Z0JBQ0EsY0FBYztnQkFDWixnQkFBZ0I7Z0JBQ3hCLFFBQVE7Z0JBQ1csMkJBQTJCO2dCQUMvQyxVQUFVO2dCQUNULFlBQVk7Z0JBQ2IsY0FBYztnQkFDakIsVUFBVTtnQkFDQSxxQkFBcUI7Z0JBQ3RCLG9CQUFvQjtnQkFDaEIsd0JBQXdCO2dCQUM3QixZQUFZO2dCQUNaLFlBQVk7Z0JBQ1IsZ0JBQWdCO2dCQUNSLFlBQVksdUJBQTlDLFFBQVE7O0lBaE5EO1FBQW5CLFNBQVMsQ0FBQyxPQUFPLENBQUM7eURBQTJCO0lBQ3JCO1FBQXhCLFNBQVMsQ0FBQyxZQUFZLENBQUM7OERBQWdDO0lBQzVCO1FBQTNCLFNBQVMsQ0FBQyxlQUFlLENBQUM7aUVBQW1DO0lBQ25DO1FBQTFCLFNBQVMsQ0FBQyxjQUFjLENBQUM7Z0VBQWtDO0lBQ25EO1FBQVIsS0FBSyxFQUFFOzBEQUFxQjtJQUNwQjtRQUFSLEtBQUssRUFBRTsrREFBMkI7SUFDMUI7UUFBUixLQUFLLEVBQUU7NERBQXdCO0lBQ1Q7UUFBdEIsTUFBTSxDQUFDLGFBQWEsQ0FBQzsrREFBaUU7SUFDdkU7UUFBZixNQUFNLENBQUMsTUFBTSxDQUFDO3dEQUFrRztJQUNqRztRQUFmLE1BQU0sQ0FBQyxNQUFNLENBQUM7d0RBQTBEO0lBQ3hEO1FBQWhCLEtBQUssQ0FBQyxRQUFRLENBQUM7MERBQTREO0lBQzFEO1FBQWpCLE1BQU0sQ0FBQyxRQUFRLENBQUM7MERBQTREO0lBQzdEO1FBQWYsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3REFBMEQ7SUFDekQ7UUFBZixNQUFNLENBQUMsTUFBTSxDQUFDO3dEQUEwRDtJQUN4RDtRQUFoQixNQUFNLENBQUMsT0FBTyxDQUFDO3lEQUFtRTtJQUNqRTtRQUFqQixNQUFNLENBQUMsUUFBUSxDQUFDOzBEQUFnSDtJQUN4RztRQUF4QixNQUFNLENBQUMsZUFBZSxDQUFDO2lFQUFtRTtJQUMvRDtRQUEzQixNQUFNLENBQUMsa0JBQWtCLENBQUM7b0VBQXNHO0lBQ3RHO1FBQTFCLE1BQU0sQ0FBQyxpQkFBaUIsQ0FBQzttRUFBMko7SUFDbEs7UUFBbEIsTUFBTSxDQUFDLFNBQVMsQ0FBQzsyREFJYjtJQUNrQjtRQUF0QixNQUFNLENBQUMsYUFBYSxDQUFDOytEQUFpRTtJQUNoRTtRQUF0QixNQUFNLENBQUMsYUFBYSxDQUFDOytEQUFpRTtJQUU5RTtRQUFSLEtBQUssRUFBRTs4REFBMEI7SUFDekI7UUFBUixLQUFLLEVBQUU7OERBQTBCO0lBQ3pCO1FBQVIsS0FBSyxFQUFFOzhEQUF5QztJQUN4QztRQUFSLEtBQUssRUFBRTswREFBc0I7SUFDckI7UUFBUixLQUFLLEVBQUU7OERBQXdCO0lBQ3ZCO1FBQVIsS0FBSyxFQUFFO2tFQUErQjtJQUM5QjtRQUFSLEtBQUssRUFBRTs2REFBMEI7SUFDekI7UUFBUixLQUFLLEVBQUU7cUVBQW9GO0lBQ25GO1FBQVIsS0FBSyxFQUFFO3FFQUFnRTtJQUUvRDtRQUFSLEtBQUssRUFBRTsyREFBc0I7SUFDckI7UUFBUixLQUFLLEVBQUU7MkRBQXVCO0lBSXRCO1FBQVIsS0FBSyxFQUFFOzhEQUFnRDtJQUkvQztRQUFSLEtBQUssRUFBRTtrRUFBbUQ7SUFJbEQ7UUFBUixLQUFLLEVBQUU7Z0VBQTZCO0lBQzVCO1FBQVIsS0FBSyxFQUFFOzREQUE2QjtJQUs1QjtRQUFSLEtBQUssRUFBRTs2REFBMkI7SUFNMUI7UUFBUixLQUFLLEVBQUU7NERBQTBCO0lBR3pCO1FBQVIsS0FBSyxFQUFFO2tFQUFtQztJQUNsQztRQUFSLEtBQUssRUFBRTtrRUFBbUM7SUFDbEM7UUFBUixLQUFLLEVBQUU7bUVBQTRDO0lBQy9CO1FBQXBCLFNBQVMsQ0FBQyxRQUFRLENBQUM7MERBQXFCO0lBQ3BCO1FBQXBCLFNBQVMsQ0FBQyxRQUFRLENBQUM7MERBQXFCO0lBTXpDO1FBREMsS0FBSyxDQUFDLFFBQVEsQ0FBQzt3REFLZjtJQWNEO1FBREMsS0FBSyxDQUFDLFlBQVksQ0FBQzs0REFnQm5CO0lBVUE7UUFEQyxLQUFLLENBQUMsWUFBWSxDQUFDOzREQXdCbkI7SUFVRjtRQURDLEtBQUssQ0FBQyxZQUFZLENBQUM7NERBZ0JuQjtJQVVEO1FBREMsS0FBSyxDQUFDLE9BQU8sQ0FBQzt1REFHZDtJQTlMVSxzQkFBc0I7UUFuQ2xDLFNBQVMsQ0FBQztZQUNULCtDQUErQztZQUMvQyxRQUFRLEVBQUUsb0JBQW9CO1lBQzlCLFFBQVEsRUFBRSxtakNBNEJUO1lBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7O1NBRXRDLENBQUM7UUE4TWEsV0FBQSxNQUFNLENBQUMsaUJBQWlCLENBQUMsQ0FBQTtRQWV6QixZQUFBLFFBQVEsRUFBRSxDQUFBO09BNU5aLHNCQUFzQixDQWttRGxDO0lBQUQsNkJBQUM7Q0FBQSxBQWxtREQsSUFrbURDO1NBbG1EWSxzQkFBc0I7O0FBb21EbkMsb0ZBQW9GO0FBQ3BGLHNJQUFzSTtBQUN0SSw2R0FBNkc7QUFDN0csc0hBQXNIIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gIENvbXBvbmVudCxcbiAgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLFxuICBJbmplY3QsXG4gIEluamVjdGlvblRva2VuLFxuICBJbmplY3RvcixcbiAgSW5wdXQsIE9uRGVzdHJveSxcbiAgT25Jbml0LCBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbiAgVmlld0VuY2Fwc3VsYXRpb24sXG4gIE9uQ2hhbmdlcyxcbiAgU2ltcGxlQ2hhbmdlcyxcbiAgQ29udGVudENoaWxkLFxuICBUZW1wbGF0ZVJlZixcbiAgVmlld0NvbnRhaW5lclJlZixcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgRXJyb3JIYW5kbGVyLFxuICBPcHRpb25hbFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7QW5ndWxhckRhdGFDb250ZXh0fSBmcm9tICdAdGhlbW9zdC9hbmd1bGFyJztcbmltcG9ydCB7VHJhbnNsYXRlUGlwZSwgVHJhbnNsYXRlU2VydmljZX0gZnJvbSAnQG5neC10cmFuc2xhdGUvY29yZSc7XG5pbXBvcnQge0FjdGl2YXRlZFJvdXRlfSBmcm9tICdAYW5ndWxhci9yb3V0ZXInO1xuaW1wb3J0IHtUYWJsZUNvbmZpZ3VyYXRpb259IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuaW50ZXJmYWNlcyc7XG5pbXBvcnQge0RhdGFTZXJ2aWNlUXVlcnlQYXJhbXN9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQge0FkdmFuY2VkQ29sdW1uRm9ybWF0dGVyLCBPbkFkdmFuY2VkQ29sdW1uQWZ0ZXJSZW5kZXJ9IGZyb20gJy4vYWR2YW5jZWQtdGFibGUuZm9ybWF0dGVycyc7XG5pbXBvcnQge0NsaWVudERhdGFRdWVyeWFibGV9IGZyb20gJ0B0aGVtb3N0L2NsaWVudCc7XG5pbXBvcnQge0FkdmFuY2VkRmlsdGVyVmFsdWVQcm92aWRlcn0gZnJvbSAnLi9hZHZhbmNlZC1maWx0ZXItdmFsdWUtcHJvdmlkZXIuc2VydmljZSc7XG5pbXBvcnQge1N1YnNjcmlwdGlvbiwgQmVoYXZpb3JTdWJqZWN0fSBmcm9tICdyeGpzJztcbmltcG9ydCB7VGVtcGxhdGVQaXBlLCBMb2FkaW5nU2VydmljZSwgQ29uZmlndXJhdGlvblNlcnZpY2UsXG4gIE1vZGFsU2VydmljZSwgRElBTE9HX0JVVFRPTlMsIEVycm9yU2VydmljZSwgRXhwb3J0U3ByZWFkc2hlZXRTZXJ2aWNlfSBmcm9tICdAdW5pdmVyc2lzL2NvbW1vbic7XG5pbXBvcnQge0FkdmFuY2VkVGFibGVGb3JtYXR0ZXJzfSBmcm9tICcuL2FkdmFuY2VkLXRhYmxlLmZvcm1hdHRlcnMuaW50ZXJmYWNlJztcbi8vIGltcG9ydGFudCBub3RlOiB1c2UgdGhpcyBpbXBvcnQgdG8gYXZvaWQgQ2Fubm90IGNhbGwgYSBuYW1lc3BhY2UgKCdqcXVlcnknKSBlcnJvclxuaW1wb3J0ICogYXMgalF1ZXJ5XyBmcm9tICdqcXVlcnknO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldCc7XG5pbXBvcnQge3RlbXBsYXRlfSBmcm9tICdsb2Rhc2gnO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1yb3dncm91cCc7IC8vIHRoaXMgcGx1Z2luIGltcG9ydCBsaW5lIG11c3QgY29tZSBiZWZvcmUgdGhlIGZvbGxvd2luZyBkYXRhdGFibGVzIHBsdWdpbiBpbXBvcnRzXG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LXNjcm9sbGVyJztcbmltcG9ydCAnZGF0YXRhYmxlcy5uZXQtY29scmVvcmRlcic7XG5pbXBvcnQgJ2RhdGF0YWJsZXMubmV0LWJ1dHRvbnMnO1xuaW1wb3J0ICdkYXRhdGFibGVzLm5ldC1maXhlZGNvbHVtbnMnO1xuaW1wb3J0IHsgSHR0cENsaWVudCB9IGZyb20gJ0Bhbmd1bGFyL2NvbW1vbi9odHRwJztcbmltcG9ydCB7IENvbHVtblNlbGVjdG9yU2VydmljZSB9IGZyb20gJy4uL2NvbHVtbi1zZWxlY3Rvci9jb2x1bW4tc2VsZWN0b3Iuc2VydmljZSc7XG5pbXBvcnQgeyBFeHBvcnRMaW1pdENvbmZpZ3VyYXRpb24sIE1BWF9FWFBPUlRfSVRFTVMgfSBmcm9tICcuLi8uLi9kaXJlY3RpdmVzL2J0bmV4cC5kaXJlY3RpdmUnO1xuXG4vLyByZXN0b3JlIGpxdWVyeSBpbXBvcnQgdG8gYXZvaWQgQ2Fubm90IGNhbGwgYSBuYW1lc3BhY2UgKCdqcXVlcnknKSBlcnJvclxuY29uc3QgalF1ZXJ5ID0galF1ZXJ5XztcbmV4cG9ydCBpbnRlcmZhY2UgQWR2YW5jZWRUYWJsZURhdGFSZXN1bHQge1xuICByZWNvcmRzVG90YWw6IG51bWJlcjtcbiAgcmVjb3Jkc0ZpbHRlcmVkOiBudW1iZXI7XG4gIGRhdGE6IEFycmF5PGFueT47XG59XG5cbmNvbnN0IERhdGFUYWJsZXNBcGk6IGFueSA9IGpRdWVyeS5mbi5kYXRhVGFibGUuQXBpO1xuRGF0YVRhYmxlc0FwaS5yZWdpc3RlciggJ3Byb2Nlc3NpbmcoKScsIGZ1bmN0aW9uKCBzaG93OiBhbnkgKSB7XG4gICAgcmV0dXJuIHRoaXMuaXRlcmF0b3IoJ3RhYmxlJywgKCBjdHg6IGFueSApID0+IHtcbiAgICAgICAgY3R4Lm9BcGkuX2ZuUHJvY2Vzc2luZ0Rpc3BsYXkoIGN0eCwgc2hvdyApO1xuICAgIH0gKTtcbn0pO1xuXG5jb25zdCBFTVBUWV9EQVRBU0VUID0ge1xuICByZWNvcmRzVG90YWw6IDAsXG4gIHJlY29yZHNGaWx0ZXJlZDogMCxcbiAgZGF0YTogW10sXG59O1xuXG5jbGFzcyBUYWJsZVRyYW5zbGF0aW9uQ2hhbmdlRGV0ZWN0b3IgZXh0ZW5kcyBDaGFuZ2VEZXRlY3RvclJlZiB7XG4gIHB1YmxpYyBjaGVja05vQ2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBkZXRhY2goKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgZGV0ZWN0Q2hhbmdlcygpOiB2b2lkIHtcbiAgfVxuXG4gIHB1YmxpYyBtYXJrRm9yQ2hlY2soKTogdm9pZCB7XG4gIH1cblxuICBwdWJsaWMgcmVhdHRhY2goKTogdm9pZCB7XG4gIH1cblxufVxuXG5leHBvcnQgbGV0IENPTFVNTl9GT1JNQVRURVJTID0gbmV3IEluamVjdGlvblRva2VuKCdjb2x1bW4uZm9ybWF0dGVycycpO1xuXG5leHBvcnQgY2xhc3MgRXhwb3J0TGltaXRFeGNlZWRlZEVycm9yIGV4dGVuZHMgUmFuZ2VFcnJvciB7XG4gIGNvbnN0cnVjdG9yKG1lc3NhZ2U6IHN0cmluZykge1xuICAgIHN1cGVyKG1lc3NhZ2UpO1xuICAgIHRoaXMubmFtZSA9ICdFeHBvcnRMaW1pdEV4Y2VlZGVkRXJyb3InO1xuICB9XG59XG5cbmNsYXNzIENvbHVtbkZvcm1hdHRlciBleHRlbmRzIEFkdmFuY2VkQ29sdW1uRm9ybWF0dGVyIHtcbiAgY29uc3RydWN0b3IocHJvdGVjdGVkIGluamVjdG9yOiBJbmplY3Rvcikge1xuICAgIHN1cGVyKCk7XG4gIH1cblxuICBwdWJsaWMgY2xhc3M/OiBzdHJpbmc7XG4gIHB1YmxpYyBjbGFzc05hbWU/OiBzdHJpbmc7XG4gIHB1YmxpYyBkZWZhdWx0Q29udGVudD86IHN0cmluZztcbiAgcHVibGljIGZvcm1hdFN0cmluZz86IHN0cmluZztcbiAgcHVibGljIGZvcm1hdHRlcj86IHN0cmluZztcbiAgcHVibGljIGhpZGRlbj86IGJvb2xlYW47XG4gIHB1YmxpYyBuYW1lPzogc3RyaW5nO1xuICBwdWJsaWMgb3JkZXI/OiBzdHJpbmc7XG4gIHB1YmxpYyBwcm9wZXJ0eT86IHN0cmluZztcbiAgcHVibGljIHNvcnRhYmxlPzogYm9vbGVhbjtcbiAgcHVibGljIHRpdGxlID0gJyc7XG5cbiAgcHVibGljIHJlbmRlcihkYXRhOiBhbnksIHR5cGU6IGFueSwgcm93OiBhbnksIG1ldGE6IGFueSkge1xuICAgIC8vXG4gIH1cbn1cblxuZnVuY3Rpb24gZm9yY2VDYXN0PFQ+KGlucHV0OiBhbnkpOiBUIHtcbiAgcmV0dXJuIGlucHV0O1xufVxuXG5leHBvcnQgY2xhc3MgQWR2YW5jZWRUYWJsZUNvbmZpZ3VyYXRpb24ge1xuICBwdWJsaWMgc3RhdGljIGNhc3QoaW5wdXQ6IGFueSwgY2xvbmU/OiBib29sZWFuKTogVGFibGVDb25maWd1cmF0aW9uIHtcbiAgICBpZiAoY2xvbmUpIHtcbiAgICAgIHJldHVybiBmb3JjZUNhc3Q8VGFibGVDb25maWd1cmF0aW9uPihKU09OLnBhcnNlKEpTT04uc3RyaW5naWZ5KGlucHV0KSkpO1xuICAgIH1cbiAgICByZXR1cm4gZm9yY2VDYXN0PFRhYmxlQ29uZmlndXJhdGlvbj4oaW5wdXQpO1xuICB9XG59XG5cbmZ1bmN0aW9uIGdldFJhbmRvbUlkZW50aWZpZXIoKSB7XG4gIHJldHVybiAoXG4gICAgTnVtYmVyKFN0cmluZyhNYXRoLnJhbmRvbSgpKS5zbGljZSgyKSlcbiAgKS50b1N0cmluZygzNik7XG59XG5cbkBDb21wb25lbnQoe1xuICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2FwcC1hZHZhbmNlZC10YWJsZScsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRhYmxlICN0YWJsZSBjbGFzcz1cImRhdGFUYWJsZVwiPlxuICAgIDwvdGFibGU+XG4gICAgPGRpdiAjZW1wdHlUYWJsZSBjbGFzcz1cImQtbm9uZVwiPlxuICAgICAgPGRpdj5cbiAgICAgICAgPGRpdiBjbGFzcz1cIm10LTRcIj5cbiAgICAgICAgICA8ZGl2IGNsYXNzPVwiaWNvbi1jaXJjbGUgYmctZ3JheS0zMDAgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtZGFya1wiIFt0cmFuc2xhdGVdPVwiJ1RhYmxlcy5FbXB0eVRhYmxlVGl0bGUnXCI+PC9oND5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1kYXJrXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkVtcHR5VGFibGVNZXNzYWdlJ1wiPjwvcD5cbiAgICAgICAgPC9kaXY+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2ICNlcnJvclRlbXBsYXRlIGNsYXNzPVwiZC1ub25lIGVycm9yLW1lc3NhZ2VcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJ0ZXh0LWNlbnRlclwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxkaXYgY2xhc3M9XCJpY29uLWNpcmNsZSBiZy1kYW5nZXIgYm9yZGVyLWdyYXktMTAwXCI+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2IGNsYXNzPVwibXQtNFwiPlxuICAgICAgICAgIDxoNCBjbGFzcz1cImZvbnQtM3hsIHRleHQtc2Vjb25kYXJ5XCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkRhdGFFcnJvci5UaXRsZSdcIj48L2g0PlxuICAgICAgICAgIDxwIGNsYXNzPVwiZm9udC1sZyB0ZXh0LXNlY29uZGFyeSBtYi0xXCIgW3RyYW5zbGF0ZV09XCInVGFibGVzLkRhdGFFcnJvci5NZXNzYWdlJ1wiPjwvcD5cbiAgICAgICAgICA8cCBjbGFzcz1cImZvbnQtbGcgdGV4dC1zZWNvbmRhcnkgZXJyb3ItaW5uZXItbWVzc2FnZVwiPlxuICAgICAgICAgICAgPHNtYWxsPjwvc21hbGw+XG4gICAgICAgICAgPC9wPlxuICAgICAgICA8L2Rpdj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICBgLFxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBzdHlsZVVybHM6IFsnLi9hZHZhbmNlZC10YWJsZS5jb21wb25lbnQuc2NzcyddLFxufSlcbmV4cG9ydCBjbGFzcyBBZHZhbmNlZFRhYmxlQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3ksIE9uQ2hhbmdlcywgQWZ0ZXJWaWV3SW5pdCB7XG5cbiAgcHJpdmF0ZSBfcXVlcnk/OiBDbGllbnREYXRhUXVlcnlhYmxlO1xuICBwcml2YXRlIF9jb25maWc/OiBUYWJsZUNvbmZpZ3VyYXRpb247XG4gIHByaXZhdGUgX2ZpcnN0TG9hZCA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dGb290ZXIgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfc2hvd0hlYWRlciA9IHRydWU7XG4gIHByaXZhdGUgX3Nob3dQYWdpbmcgPSBmYWxzZTtcbiAgcHJpdmF0ZSBfaWQgPSBnZXRSYW5kb21JZGVudGlmaWVyKCk7XG4gIHB1YmxpYyBzbWFydFNlbGVjdCA9IGZhbHNlO1xuICBwdWJsaWMgY29uZmlnQ2hhbmdlcyA9IG5ldyBCZWhhdmlvclN1YmplY3Q8YW55PihudWxsKTtcblxuICBAVmlld0NoaWxkKCd0YWJsZScpIHB1YmxpYyB0YWJsZT86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2VtcHR5VGFibGUnKSBwdWJsaWMgZW1wdHlUYWJsZT86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2Vycm9yVGVtcGxhdGUnKSBwdWJsaWMgZXJyb3JUZW1wbGF0ZT86IEVsZW1lbnRSZWY7XG4gIEBWaWV3Q2hpbGQoJ2xvYWRpbmdUYWJsZScpIHB1YmxpYyBsb2FkaW5nVGFibGU/OiBFbGVtZW50UmVmO1xuICBASW5wdXQoKSBwdWJsaWMgaGVpZ2h0ID0gODAwO1xuICBASW5wdXQoKSBwdWJsaWMgc2hvd0FjdGlvbnMgPSB0cnVlO1xuICBASW5wdXQoKSBwdWJsaWMgYXV0b0xvYWQgPSB0cnVlO1xuICBAT3V0cHV0KCdjdXN0b21FdmVudCcpIHB1YmxpYyBjdXN0b21FdmVudDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgnbG9hZCcpIHB1YmxpYyBsb2FkOiBFdmVudEVtaXR0ZXI8QWR2YW5jZWRUYWJsZURhdGFSZXN1bHQ+ID0gbmV3IEV2ZW50RW1pdHRlcjxBZHZhbmNlZFRhYmxlRGF0YVJlc3VsdD4oKTtcbiAgQE91dHB1dCgnaW5pdCcpIHB1YmxpYyBpbml0OiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBASW5wdXQoJ3JlbG9hZCcpIHB1YmxpYyByZWxvYWQ6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ3NlbGVjdCcpIHB1YmxpYyBzZWxlY3Q6IEV2ZW50RW1pdHRlcjxhbnk+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gIEBPdXRwdXQoJ2RyYXcnKSBwdWJsaWMgZHJhdzogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgQE91dHB1dCgncGFnZScpIHB1YmxpYyBwYWdlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdvcmRlcicpIHB1YmxpYyBvcmRlcjogRXZlbnRFbWl0dGVyPGFueVtdW10+ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnlbXVtdPigpO1xuICBAT3V0cHV0KCdzY3JvbGwnKSBwdWJsaWMgc2Nyb2xsOiBFdmVudEVtaXR0ZXI8eyB0b3A6IG51bWJlcjsgbGVmdDogbnVtYmVyIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHRvcDogbnVtYmVyOyBsZWZ0OiBudW1iZXIgfT4oKTtcbiAgQE91dHB1dCgnc2VsZWN0ZWRJdGVtcycpIHB1YmxpYyBzZWxlY3RlZEl0ZW1zOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdiZWZvcmVTZXJ2ZXJEYXRhJykgcHVibGljIGJlZm9yZVNlcnZlckRhdGE6IEV2ZW50RW1pdHRlcjxDbGllbnREYXRhUXVlcnlhYmxlPiA9IG5ldyBFdmVudEVtaXR0ZXI8Q2xpZW50RGF0YVF1ZXJ5YWJsZT4oKTtcbiAgQE91dHB1dCgnYWZ0ZXJTZXJ2ZXJEYXRhJykgcHVibGljIGFmdGVyU2VydmVyRGF0YTogRXZlbnRFbWl0dGVyPHsgc2tpcD86IG51bWJlciwgdG90YWw/OiBudW1iZXIsIHZhbHVlOiBhbnlbXX0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7IHNraXA/OiBudW1iZXIsIHRvdGFsPzogbnVtYmVyLCB2YWx1ZTogYW55W119PigpO1xuICBAT3V0cHV0KCdsb2FkaW5nJykgcHVibGljIGxvYWRpbmc6IEV2ZW50RW1pdHRlcjx7XG4gICAgdGFyZ2V0OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50XG4gIH0+ID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgdGFyZ2V0OiBBZHZhbmNlZFRhYmxlQ29tcG9uZW50XG4gIH0+KCk7XG4gIEBPdXRwdXQoJ3Nob3dEZXRhaWxzJykgcHVibGljIHNob3dEZXRhaWxzOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICBAT3V0cHV0KCdoaWRlRGV0YWlscycpIHB1YmxpYyBoaWRlRGV0YWlsczogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcblxuICBASW5wdXQoKSBwdWJsaWMgc2Nyb2xsYWJsZSA9IHRydWU7XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXJ2ZXJTaWRlID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIGxlbmd0aE1lbnUgPSBbNTAsIDEwMCwgMjAwLCA1MDBdO1xuICBASW5wdXQoKSBwdWJsaWMgcGFnaW5nID0gdHJ1ZTtcbiAgQElucHV0KCkgcHVibGljIHBhZ2VMZW5ndGggPSAyNTtcbiAgQElucHV0KCkgcHVibGljIGNvbHVtbk9yZGVyaW5nID0gZmFsc2U7XG4gIEBJbnB1dCgpIHB1YmxpYyBzdGF0ZVNhdmUgPSBmYWxzZTtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlTG9hZENhbGxiYWNrPzogKHNldHRpbmdzOiBhbnksIGNhbGxiYWNrOiAoc3RhdGU6IGFueSkgPT4gdm9pZCkgPT4gdm9pZDtcbiAgQElucHV0KCkgcHVibGljIHN0YXRlU2F2ZUNhbGxiYWNrPzogKHNldHRpbmdzOiBhbnksIHN0YXRlOiBhbnkpID0+IHZvaWQ7XG5cbiAgQElucHV0KCkgcHVibGljIHNjcm9sbFkgPSA4MDA7XG4gIEBJbnB1dCgpIHB1YmxpYyBzY3JvbGxYID0gdHJ1ZTtcbiAgLyoqXG4gICAqIEVuYWJsZXMgcm93IHNlbGVjdGlvbi4gVGhlIGRlZmF1bHIgdmFsdWUgaXMgZmFsc2VcbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBzZWxlY3RhYmxlOiBib29sZWFuIHwgdW5kZWZpbmVkID0gZmFsc2U7XG4gIC8qKlxuICAgKiBFbmFibGVzIG9yIGRpc2FibGUgbXVsdGlwbGUgc2VsZWN0aW9uLiBUaGUgZGVmYXVsdCB2YWx1ZXMgaXMgdHJ1ZS5cbiAgICovXG4gIEBJbnB1dCgpIHB1YmxpYyBtdWx0aXBsZVNlbGVjdDogYm9vbGVhbiB8IHVuZGVmaW5lZCA9IHRydWU7XG4gIC8qKlxuICAgKiBFbmFibGVzIGN1c3RvbSBzZWxlY3Rpb24gYW5kIGhpZGVzIHNlbGVjdCBjb2x1bW4uIFRoZSBkZWZhdWx0IHZhbHVlIGlzICBmYWxzZVxuICAgKi9cbiAgQElucHV0KCkgcHVibGljIGN1c3RvbVNlbGVjdCA9IGZhbHNlO1xuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWQ6IGFueVtdID0gW107XG4gIHB1YmxpYyB1bnNlbGVjdGVkOiBhbnlbXSA9IFtdO1xuICAvKipcbiAgICogR2V0cyBvciBzZXRzIGEgVVJMIHRvIGxvYWQgdGFibGUgY29uZmlndXJhdGlvbiBmcm9tXG4gICAqL1xuICBASW5wdXQoKSBwdWJsaWMgY29uZmlnU3JjPzogc3RyaW5nO1xuICBwdWJsaWMgbGFzdEVycm9yOiBhbnk7XG5cbiAgLyoqXG4gICAqIEFjY2VwdHMgYXJyYXkgb2YgcHJvcGVydGllcyBhcyByb3cgZ3JvdXAgZmFjdG9ycyBhbmQgZGlzcGxheXMgZ3JvdXBlZCB0YWJsZS5cbiAgICovXG4gIEBJbnB1dCgpIHJvd0dyb3VwOiAgc3RyaW5nW10gPSBbXTtcbiAgcHJpdmF0ZSBsYXN0Um93R3JvdXBPcmRlcj86IHsgY29sdW1uOiBudW1iZXI7IGRpcmVjdGlvbjogc3RyaW5nOyB9IHwgbnVsbDtcblxuICBASW5wdXQoKSBoZWFkZXJUZW1wbGF0ZT86IFRlbXBsYXRlUmVmPGFueT47XG4gIEBJbnB1dCgpIGZvb3RlclRlbXBsYXRlPzogVGVtcGxhdGVSZWY8YW55PjtcbiAgQElucHV0KCkgcHJpdmF0ZSBkZXRhaWxzVGVtcGxhdGU/OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdoZWFkZXInKSBoZWFkZXI/OiBFbGVtZW50UmVmO1xuICBAVmlld0NoaWxkKCdmb290ZXInKSBmb290ZXI/OiBFbGVtZW50UmVmO1xuXG4gIC8qKlxuICAgKiBHZXRzIG9yIHNldHMgdGFibGUgY29uZmlndXJhdGlvblxuICAgKi9cbiAgQElucHV0KCdjb25maWcnKVxuICBwdWJsaWMgc2V0IGNvbmZpZyh2YWx1ZTogVGFibGVDb25maWd1cmF0aW9uKSB7XG4gICAgdGhpcy5fY29uZmlnID0gdmFsdWU7XG4gICAgLy8gcmFpc2Ugc3Vic2NyaXB0aW9uXG4gICAgdGhpcy5jb25maWdDaGFuZ2VzLm5leHQodGhpcy5fY29uZmlnKTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgY29uZmlnKCkge1xuICAgIHJldHVybiB0aGlzLl9jb25maWcgYXMgVGFibGVDb25maWd1cmF0aW9uO1xuICB9XG5cbiAgcHVibGljIGdldCBsYXN0UXVlcnlUb3RhbEl0ZW1zKCkge1xuICAgIHJldHVybiB0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICBASW5wdXQoJ3Nob3dGb290ZXInKVxuICBwdWJsaWMgc2V0IHNob3dGb290ZXIodmFsdWU6IGJvb2xlYW4pIHtcbiAgICB0aGlzLl9zaG93Rm9vdGVyID0gdmFsdWU7XG4gICAgLy8gc2hvdyBvciBoaWRlIGZvb3RlclxuICAgIGlmICh0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZXNfaW5mbycpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QucmVtb3ZlKCdkLW5vbmUnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93Rm9vdGVyKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93Rm9vdGVyO1xuICB9XG5cbiAgLyoqXG4gICAqIEluZGljYXRlcyB3aGV0aGVyIHRhYmxlIGZvb3RlciB3aWxsIGJlIHZpc2libGUgb3Igbm90XG4gICAqL1xuICAgQElucHV0KCdzaG93SGVhZGVyJylcbiAgIHB1YmxpYyBzZXQgc2hvd0hlYWRlcih2YWx1ZTogYm9vbGVhbikge1xuICAgICB0aGlzLl9zaG93SGVhZGVyID0gdmFsdWU7XG4gICAgIC8vIHNob3cgb3IgaGlkZSBmb290ZXJcbiAgICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICAgY29uc3QgZWxlbWVudCA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGU+dGhlYWQnKTtcbiAgICAgICBpZiAoZWxlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICByZXR1cm47XG4gICAgICAgfVxuICAgICAgIGNvbnN0IGRhdGFUYWJsZSA9ICggdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KS5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlJyk7XG4gICAgICAgaWYgKGRhdGFUYWJsZSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgICB9XG4gICAgICAgaWYgKHZhbHVlKSB7XG4gICAgICAgICBlbGVtZW50LmNsYXNzTGlzdC5yZW1vdmUoJ2Qtbm9uZScpO1xuICAgICAgICAgLy8gYWRkIHRvcCBtYXJnaW5cbiAgICAgICAgIGRhdGFUYWJsZS5jbGFzc0xpc3QucmVtb3ZlKCdtdC0yJyk7XG4gICAgICAgfSBlbHNlIHtcbiAgICAgICAgIGVsZW1lbnQuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgICAvLyByZW1vdmUgdG9wIG1hcmdpblxuICAgICAgICAgZGF0YVRhYmxlLmNsYXNzTGlzdC5hZGQoJ210LTInKTtcbiAgICAgICB9XG4gICAgIH1cbiAgIH1cblxuICAgcHVibGljIGdldCBzaG93SGVhZGVyKCkge1xuICAgICByZXR1cm4gdGhpcy5fc2hvd0hlYWRlcjtcbiAgIH1cblxuICAvKipcbiAgICogSW5kaWNhdGVzIHdoZXRoZXIgcGFnaW5nIGluZm9ybWF0aW9uIHdpbGwgYmUgdmlzaWJsZSBvciBub3RcbiAgICovXG4gIEBJbnB1dCgnc2hvd1BhZ2luZycpXG4gIHB1YmxpYyBzZXQgc2hvd1BhZ2luZyh2YWx1ZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Nob3dQYWdpbmcgPSB2YWx1ZTtcbiAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgaWYgKHRoaXMuX2VsZW1lbnQgJiYgdGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50KSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKCB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19wYWdpbmF0ZScpO1xuICAgICAgaWYgKGVsZW1lbnQgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgalF1ZXJ5KGVsZW1lbnQpLnNob3coKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGpRdWVyeShlbGVtZW50KS5oaWRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGdldCBzaG93UGFnaW5nKCkge1xuICAgIHJldHVybiB0aGlzLl9zaG93UGFnaW5nO1xuICB9XG5cbiAgLyoqXG4gICAqIEdldHMgb3Igc2V0cyBhbiBhY3RpdmUgcXVlcnkgZm9yIHRoaXMgdGFibGVcbiAgICovXG4gIEBJbnB1dCgncXVlcnknKVxuICBwdWJsaWMgc2V0IHF1ZXJ5KHZhbHVlOiBDbGllbnREYXRhUXVlcnlhYmxlIHwgdW5kZWZpbmVkKSB7XG4gICAgdGhpcy5fcXVlcnkgPSB2YWx1ZTtcbiAgfVxuXG4gIHB1YmxpYyBnZXQgcXVlcnkoKSB7XG4gICAgcmV0dXJuIHRoaXMuX3F1ZXJ5IGFzIENsaWVudERhdGFRdWVyeWFibGU7XG4gIH1cblxuICBwdWJsaWMgcmVhZG9ubHkgdHJhbnNsYXRvcjogVHJhbnNsYXRlUGlwZTtcbiAgcHVibGljIGRhdGFUYWJsZTogYW55O1xuICBwdWJsaWMgZHRPcHRpb25zOiBhbnk7XG4gIHByaXZhdGUgbGFzdFF1ZXJ5UGFyYW1zPzogRGF0YVNlcnZpY2VRdWVyeVBhcmFtcztcbiAgcHJpdmF0ZSBfbGFzdFF1ZXJ5VG90YWxJdGVtcyA9IDA7XG4gIHByaXZhdGUgcmVsb2FkU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XG5cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9jb250ZXh0OiBBbmd1bGFyRGF0YUNvbnRleHQsXG4gICAgICAgICAgICAgIEBJbmplY3QoQ09MVU1OX0ZPUk1BVFRFUlMpIHByaXZhdGUgX2NvbHVtbkZvcm1hdHRlcnM6IEFkdmFuY2VkVGFibGVGb3JtYXR0ZXJzLFxuICAgICAgICAgICAgICBwcml2YXRlIF9hY3RpdmF0ZWRSb3V0ZTogQWN0aXZhdGVkUm91dGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RyYW5zbGF0ZVNlcnZpY2U6IFRyYW5zbGF0ZVNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2luamVjdG9yOiBJbmplY3RvcixcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfYWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyOiBBZHZhbmNlZEZpbHRlclZhbHVlUHJvdmlkZXIsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2VsZW1lbnQ6IEVsZW1lbnRSZWYsXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RlbXBsYXRlOiBUZW1wbGF0ZVBpcGUsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2xvYWRpbmc6IExvYWRpbmdTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9odHRwOiBIdHRwQ2xpZW50LFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb2x1bW5TZWxlY3RvcjogQ29sdW1uU2VsZWN0b3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF9jb25maWd1cmF0aW9uOiBDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfZXhwb3J0U3ByZWFkc2hlZXQ6IEV4cG9ydFNwcmVhZHNoZWV0U2VydmljZSxcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfbW9kYWxTZXJ2aWNlOiBNb2RhbFNlcnZpY2UsXG4gICAgICAgICAgICAgIHByaXZhdGUgX2Vycm9yU2VydmljZTogRXJyb3JTZXJ2aWNlLFxuICAgICAgICAgICAgICBwcml2YXRlIF92aWV3Q29udGFpbmVyUmVmOiBWaWV3Q29udGFpbmVyUmVmLFxuICAgICAgICAgICAgICBAT3B0aW9uYWwoKSBwcml2YXRlIF9lcnJvckhhbmRsZXI6IEVycm9ySGFuZGxlcikge1xuICAgIC8vIGluaXRpYWxpemUgdHJhbnNsYXRlIHBpcGVcbiAgICB0aGlzLnRyYW5zbGF0b3IgPSBuZXcgVHJhbnNsYXRlUGlwZSh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLCBuZXcgVGFibGVUcmFuc2xhdGlvbkNoYW5nZURldGVjdG9yKCkpO1xuICAgIGpRdWVyeS5mbi5kYXRhVGFibGUuZXh0LmNsYXNzZXMuc1BhZ2VCdXR0b24gPSAnYnRuJztcbiAgICBqUXVlcnkuZm4uZGF0YVRhYmxlLmV4dC5jbGFzc2VzLnNQYWdlQnV0dG9uQWN0aXZlID0gJ2J0biBidG4tbGlnaHQnO1xuICAgIHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uID0gdGhpcy5yZWxvYWQuc3Vic2NyaWJlKChkYXRhKSA9PiB7XG4gICAgICB0aGlzLmZldGNoKCk7XG4gICAgfSk7XG4gIH1cblxuICAvLyBzaW1wbGUgc2VhcmNoXG4gIHB1YmxpYyBzZWFyY2goc2VhcmNoVGV4dCkge1xuICAgIHRoaXMucXVlcnkgPSB0aGlzLnF1ZXJ5IHx8IHRoaXMuX2NvbnRleHQubW9kZWwodGhpcy5jb25maWcubW9kZWwpLmFzUXVlcnlhYmxlKCk7XG4gICAgaWYgKHRoaXMuc2VydmVyU2lkZSkge1xuICAgICAgaWYgKHNlYXJjaFRleHQgJiYgdGhpcy5jb25maWcuc2VhcmNoRXhwcmVzc2lvbikge1xuICAgICAgICAvLyB2YWxpZGF0ZSBzZWFyY2ggdGV4dCBpbiBkb3VibGUgcXVvdGVzXG4gICAgICAgIGlmICgvXlwiKC4qPylcIiQvLnRlc3Qoc2VhcmNoVGV4dCkpIHtcbiAgICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJyxcbiAgICAgICAgICAgIHRoaXMuX3RlbXBsYXRlLnRyYW5zZm9ybSh0aGlzLmNvbmZpZy5zZWFyY2hFeHByZXNzaW9uLCB7XG4gICAgICAgICAgICAgIHRleHQ6IHNlYXJjaFRleHQucmVwbGFjZSgvXlwifFwiJC9nLCAnJyksXG4gICAgICAgICAgICB9KSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gdHJ5IHRvIHNwbGl0IHdvcmRzXG4gICAgICAgICAgY29uc3Qgd29yZHMgPSBzZWFyY2hUZXh0LnNwbGl0KCcgJyk7XG4gICAgICAgICAgLy8gam9pbiB3b3JkcyB0byBhIHNpbmdsZSBmaWx0ZXJcbiAgICAgICAgICBjb25zdCBmaWx0ZXIgPSB3b3Jkcy5tYXAoKHdvcmQpID0+IHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLl90ZW1wbGF0ZS50cmFuc2Zvcm0oKHRoaXMuY29uZmlnICYmIHRoaXMuY29uZmlnLnNlYXJjaEV4cHJlc3Npb24pIGFzIHN0cmluZywge1xuICAgICAgICAgICAgICB0ZXh0OiB3b3JkLFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSkuam9pbignIGFuZCAnKTtcbiAgICAgICAgICAvLyBzZXQgZmlsdGVyXG4gICAgICAgICAgdGhpcy5xdWVyeS5zZXRQYXJhbSgnJGZpbHRlcicsIGZpbHRlcik7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGNsZWFyIGZpbHRlclxuICAgICAgICB0aGlzLnF1ZXJ5LnNldFBhcmFtKCckZmlsdGVyJywgbnVsbCk7XG4gICAgICB9XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSBmYWxzZTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gZW5zdXJlIGVtcHR5IHRhYmxlIGxheW91dFxuICAgICAgdGhpcy5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgIC8vIHNlYXJjaCBsb2NhbGx5XG4gICAgICB0aGlzLmRhdGFUYWJsZS5zZWFyY2goc2VhcmNoVGV4dC50cmltKCkpLmRyYXcoKTtcbiAgICAgIC8vIGdldCBpbmRleGVzIG9mIGZpbHRlcmVkIHJvd3NcbiAgICAgIGNvbnN0IGluZGV4ZXMgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0uYWlEaXNwbGF5KTtcbiAgICAgIC8vIHNldCByZWNvcmRzRmlsdGVyZWRcbiAgICAgIGNvbnN0IHJlY29yZHNGaWx0ZXJlZCA9IGluZGV4ZXMubGVuZ3RoO1xuICAgICAgLy8gc2V0IHJlY29yZHNUb3RhbFxuICAgICAgY29uc3QgcmVjb3Jkc1RvdGFsID0gaW5kZXhlcy5sZW5ndGg7XG4gICAgICAvLyByZXRyaWV2ZSBkYXRhIGZyb20gaW5kZXhlc1xuICAgICAgY29uc3Qgcm93cyA9IEFycmF5LmZyb20odGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKSk7XG4gICAgICBjb25zdCBkYXRhID0gaW5kZXhlcy5tYXAoaW5kZXggPT4gcm93c1s8bnVtYmVyPmluZGV4XSk7XG4gICAgICAvLyBlbWl0IHJlc3VsdHMgdG8gbG9hZCBvdXRwdXRcbiAgICAgIHRoaXMubG9hZC5lbWl0KHtcbiAgICAgICAgZGF0YTogZGF0YSxcbiAgICAgICAgcmVjb3Jkc0ZpbHRlcmVkOiByZWNvcmRzRmlsdGVyZWQsXG4gICAgICAgIHJlY29yZHNUb3RhbDogcmVjb3Jkc1RvdGFsXG4gICAgICB9KTtcbiAgICB9XG4gIH1cblxuICBwdWJsaWMgZmV0Y2goY2xlYXJTZWxlY3RlZD86IGJvb2xlYW4pIHtcbiAgICAvLyBpZiBkYXRhIHRhYmxlIGlzIG51bGxcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgPT0gbnVsbCkge1xuICAgICAgLy8gaW5pdGlhbGl6ZSBkYXRhIHRhYmxlXG4gICAgICByZXR1cm4gdGhpcy5uZ09uSW5pdCgpO1xuICAgIH1cbiAgICAvLyBjbGVhciBzZWxlY3Rpb24gaWYgcGFyYW1ldGVyIGlzIG5vdCBkZWNsYXJlZCBvciBpdCdzIHRydWVcbiAgICBpZiAoY2xlYXJTZWxlY3RlZCA9PSBudWxsIHx8IGNsZWFyU2VsZWN0ZWQgPT09IHRydWUpIHtcbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICB9XG4gICAgLy8gb3RoZXJ3aXNlIGxvYWQgZGF0YSBvbmx5XG4gICAgdGhpcy5kYXRhVGFibGUuZHJhdygpO1xuICB9XG5cbiAgcHVibGljIGRlc3Ryb3koKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5kZXN0cm95KCk7XG4gICAgICB0aGlzLl9maXJzdExvYWQgPSB0cnVlO1xuICAgICAgaWYgKHRoaXMudGFibGUpIHtcbiAgICAgICAgalF1ZXJ5KHRoaXMudGFibGUubmF0aXZlRWxlbWVudCkuZW1wdHkoKTtcbiAgICAgIH1cbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gbnVsbDtcbiAgICAgIC8vIGNsZWFyIHNlbGVjdGVkIGl0ZW1zXG4gICAgICBpZiAodGhpcy5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgfVxuICAgICAgLy8gY2xlYXIgdW5zZWxlY3RlZCBpdGVtc1xuICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpIHtcbiAgICAgICAgdGhpcy51bnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnVuc2VsZWN0ZWQubGVuZ3RoKTtcbiAgICAgIH1cbiAgICAgIC8vIHNldCBzbWFydCBzZWxlY3QgdG8gZmFsc2VcbiAgICAgIHRoaXMuc21hcnRTZWxlY3QgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogU2VsZWN0cyB0aGUgc3BlY2lmaWVkIGRhdGEgcm93XG4gICAqL1xuICBwdWJsaWMgc2VsZWN0Um93KHJvdzogYW55LCBzaWxlbnQ/OiBib29sZWFuKSB7XG4gICAgaWYgKHJvdykge1xuICAgICAgLy8gZ2V0IHJvd1xuICAgICAgY29uc3Qgcm93Tm9kZSA9IHJvdy5ub2RlKCk7XG4gICAgICAvLyBpZiBtdWx0aXBsZSBzZWxlY3QgaXMgZmFsc2VcbiAgICAgIGlmICh0aGlzLm11bHRpcGxlU2VsZWN0ID09PSBmYWxzZSkge1xuICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgICAgLy8gZW51bWVyYXRlIHJvd1xuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ub2RlcygpLmVhY2goKG5vZGU6IGFueSkgPT4ge1xuICAgICAgICAgICAgaWYgKG5vZGUgIT09IHJvd05vZGUpIHtcbiAgICAgICAgICAgICAgalF1ZXJ5KG5vZGUpLmZpbmQoJzpjaGVja2JveCcpLnByb3AoJ2NoZWNrZWQnLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdGhpcy5kYXRhVGFibGUucm93cygnLnNlbGVjdGVkJykubm9kZXMoKS5lYWNoKChub2RlOiBhbnkpID0+IHtcbiAgICAgICAgICAgIGlmIChub2RlICE9PSByb3dOb2RlKSB7XG4gICAgICAgICAgICAgIGpRdWVyeShub2RlKS5yZW1vdmVDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBjbGVhciBzZWxlY3RlZFxuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZSgwLCB0aGlzLnNlbGVjdGVkLmxlbmd0aCk7XG4gICAgICB9XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3dOb2RlKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBvdGhlcndpc2UgYWRkIGNsYXNzXG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5hZGRDbGFzcygnc2VsZWN0ZWQnKTtcbiAgICAgIH1cbiAgICAgIC8vIGdldCByb3cgZGF0YVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIHNlYXJjaCBzZWxlY3RlZCBpdGVtc1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSW5kZXgsIDEpO1xuICAgICAgfVxuICAgICAgdGhpcy5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgLy8gdmFsaWRhdGUgdW5zZWxlY3RlZCBkYXRhXG4gICAgICBmaW5kSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGRhdGFba2V5XTtcbiAgICAgIH0pO1xuICAgICAgaWYgKGZpbmRJbmRleCA+PSAwKSB7XG4gICAgICAgIC8vIHJlbW92ZSBwcmV2aW91c2x5IHNlbGVjdGVkIHJvd1xuICAgICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKGZpbmRJbmRleCwgMSk7XG4gICAgICB9XG4gICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBVbnNlbGVjdHMgdGhlIHNwZWNpZmllZCBkYXRhIHJvdyBpZiBpdCdzIHNlbGVjdGVkXG4gICAqL1xuICBwdWJsaWMgdW5TZWxlY3RSb3cocm93OiBhbnksIHNpbGVudD86IGJvb2xlYW4pIHtcbiAgICBpZiAocm93KSB7XG4gICAgICAvLyBpZiBjdXN0b20gc2VsZWN0IG1vZGUgaXMgb2ZmXG4gICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QgPT09IGZhbHNlKSB7XG4gICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgLy8gb3RoZXJ3aXNlIGFkZCBjbGFzc1xuICAgICAgICBqUXVlcnkocm93Lm5vZGUoKSkucmVtb3ZlQ2xhc3MoJ3NlbGVjdGVkJyk7XG4gICAgICB9XG4gICAgICAvLyBnZXQgZmlyc3QgY29sdW1uIGtleVxuICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLm5hbWUgfHwgJyc7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIGNvbnN0IGlkID0gZGF0YVtrZXldO1xuICAgICAgbGV0IGZpbmRJbmRleCA9IHRoaXMuc2VsZWN0ZWQuZmluZEluZGV4KCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICBpZiAoZmluZEluZGV4ID49IDApIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoZmluZEluZGV4LCAxKTtcbiAgICAgICAgaWYgKHRoaXMuc21hcnRTZWxlY3QpIHtcbiAgICAgICAgICAvLyBhZGQgdGhpcyByb3cgdG8gdW5zZWxlY3RlZCByb3dzXG4gICAgICAgICAgZmluZEluZGV4ID0gdGhpcy51bnNlbGVjdGVkLmZpbmRJbmRleCgoeCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHhba2V5XSA9PT0gaWQ7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGZpbmRJbmRleCA8IDApIHtcbiAgICAgICAgICAgIHRoaXMudW5zZWxlY3RlZC5wdXNoKGRhdGEpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBpZiAoc2lsZW50KSB7XG4gICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBzZWxlY3RBbnkoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gdHJ1ZTtcbiAgICAgIC8vIHNlbGVjdCBhbnkgcm93XG4gICAgICB0aGlzLmRhdGFUYWJsZS5yb3dzKCkuZXZlcnkoKGluZGV4OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3Qgcm93ID0gdGhpcy5kYXRhVGFibGUucm93KCBpbmRleCApO1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgfSk7XG4gICAgICAvLyBlbWl0IHNlbGVjdGlvbiBldmVudFxuICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHNlbGVjdE5vbmUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuc2VsZWN0YWJsZSkge1xuICAgICAgLy8gc2V0IHNtYXJ0IHNlbGVjdCBmbGFnXG4gICAgICB0aGlzLnNtYXJ0U2VsZWN0ID0gZmFsc2U7XG4gICAgICB0aGlzLnVuc2VsZWN0ZWQuc3BsaWNlKDAsIHRoaXMudW5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gc2VsZWN0IGFueSByb3dcbiAgICAgIHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5ldmVyeSgoaW5kZXg6IGFueSkgPT4ge1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3coIGluZGV4ICk7XG4gICAgICAgIHRoaXMudW5TZWxlY3RSb3cocm93LCB0cnVlKTtcbiAgICAgIH0pO1xuICAgICAgdGhpcy5zZWxlY3RlZC5zcGxpY2UoMCwgdGhpcy5zZWxlY3RlZC5sZW5ndGgpO1xuICAgICAgLy8gZW1pdCBzZWxlY3Rpb24gZXZlbnRcbiAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyB0b2dnbGVTZWxlY3RSb3cocm93OiBhbnkpIHtcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBkYXRhID0gcm93LmRhdGEoKTtcbiAgICAgIC8vIGdldCBmaXJzdCBjb2x1bW4ga2V5XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8IHRoaXMuY29uZmlnLmNvbHVtbnNbMF0ubmFtZSB8fCAnJztcbiAgICAgIC8vIGdldCBpZFxuICAgICAgY29uc3QgaWQgPSBkYXRhW2tleV07XG4gICAgICAvLyBmaW5kIGlmIHJvdyBpcyBzZWxlY3RlZFxuICAgICAgY29uc3QgZmluZEluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kKCh4KSA9PiB7XG4gICAgICAgIHJldHVybiB4W2tleV0gPT09IGlkO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaXMgc2VsZWN0ZWRcbiAgICAgIGlmIChmaW5kSW5kZXggPj0gMCkge1xuICAgICAgICAvLyB1bnNlbGVjdFxuICAgICAgICB0aGlzLnVuU2VsZWN0Um93KHJvdyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3cpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIC8vIG5vaW5zcGVjdGlvbiBKU01ldGhvZENhbkJlU3RhdGljXG4gIC8qKlxuICAgKiBEYXRhdGFibGVzIGNvbHVtbiByZW5kZXJlciBmb3Igc2VsZWN0IGNoZWNrYm94XG4gICAqIEBwYXJhbSBkYXRhXG4gICAqIEBwYXJhbSB0eXBlXG4gICAqIEBwYXJhbSByb3dcbiAgICogQHBhcmFtIG1ldGFcbiAgICovXG4gIHByaXZhdGUgX3JlbmRlclNlbGVjdChkYXRhLCB0eXBlLCByb3csIG1ldGEpIHtcbiAgICAvLyBnZXQgY29sdW1uXG4gICAgY29uc3QgY29sdW1uID0gbWV0YS5zZXR0aW5ncy5hb0NvbHVtbnNbbWV0YS5jb2xdO1xuICAgIGlmICh0eXBlb2YgY29sdW1uLnNlbGVjdFRlbXBsYXRlICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICBPYmplY3QuYXNzaWduKGNvbHVtbiwge1xuICAgICAgICBzZWxlY3RUZW1wbGF0ZTogdGVtcGxhdGUoYDxpbnB1dCBjbGFzcz1cImNoZWNrYm94IGNoZWNrYm94LXRoZW1lIHMtcm93XCIgdHlwZT1cImNoZWNrYm94XCJcbiAgICAgICAgaWQ9XCJzLSR7dGhpcy5faWR9LVxcJHttZXRhLnJvd31cIiBkYXRhLWlkPVwiXFwke2RhdGF9XCIgLz48bGFiZWwgZm9yPVwicy0ke3RoaXMuX2lkfS1cXCR7bWV0YS5yb3d9XCI+Jm5ic3A7PC9sYWJlbD5cbiAgICAgICAgYCksXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gcmVuZGVyIHRlbXBsYXRlXG4gICAgcmV0dXJuIGNvbHVtbi5zZWxlY3RUZW1wbGF0ZSh7XG4gICAgICBtZXRhLFxuICAgICAgZGF0YSxcbiAgICB9KTtcbiAgfVxuXG4gIHB1YmxpYyBuZ09uSW5pdCgpIHtcbiAgICBjb25zdCBzZWxmID0gdGhpcztcbiAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgIHRoaXMuZGVzdHJveSgpO1xuICAgIH1cbiAgICBpZiAodGhpcy5jb25maWcpIHtcbiAgICAgIHRoaXMubG9hZGluZy5lbWl0KHtcbiAgICAgICAgdGFyZ2V0OiB0aGlzXG4gICAgICB9KTtcbiAgICAgIC8vIHBhcnNlIHByb3BlcnRpZXNcbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdzZWxlY3RhYmxlJykpIHtcbiAgICAgICAgdGhpcy5zZWxlY3RhYmxlID0gdGhpcy5jb25maWcuc2VsZWN0YWJsZTtcbiAgICAgIH1cbiAgICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodGhpcy5jb25maWcsICdtdWx0aXBsZVNlbGVjdCcpKSB7XG4gICAgICAgIHRoaXMubXVsdGlwbGVTZWxlY3QgPSB0aGlzLmNvbmZpZy5tdWx0aXBsZVNlbGVjdDtcbiAgICAgIH1cbiAgICAgIC8vIHByZXBhcmUgY29uZmlndXJhdGlvbiBmb3IgY29sdW1uc1xuICAgICAgY29uc3QgdGFibGVDb2x1bW5zID0gdGhpcy5jb25maWcuY29sdW1uc1xuICAgICAgICAvLyBmaWx0ZXIgYWN0aW9uIGxpbmsgY29sdW1uXG4gICAgICAgIC5maWx0ZXIoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGlmIChjb2x1bW4uZm9ybWF0dGVyICYmIGNvbHVtbi5mb3JtYXR0ZXIgPT09ICdBY3Rpb25MaW5rRm9ybWF0dGVyJyAmJiB0aGlzLnNob3dBY3Rpb25zID09PSBmYWxzZSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSkubWFwKChjb2x1bW4pID0+IHtcbiAgICAgICAgICAvLyBjb252ZXJ0IGNvbHVtbiB0byBhZHZhbmNlIHRhYmxlIGNvbHVtblxuICAgICAgICAgIHJldHVybiBPYmplY3QuYXNzaWduKG5ldyBDb2x1bW5Gb3JtYXR0ZXIodGhpcy5faW5qZWN0b3IpLCBjb2x1bW4pO1xuICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgICBkYXRhOiBjb2x1bW4ucHJvcGVydHkgfHwgY29sdW1uLm5hbWUsXG4gICAgICAgICAgICBkZWZhdWx0Q29udGVudDogY29sdW1uLmRlZmF1bHRDb250ZW50ICE9IG51bGwgPyBjb2x1bW4uZGVmYXVsdENvbnRlbnQgOiAnJyxcbiAgICAgICAgICAgIHRpdGxlOiB0aGlzLnRyYW5zbGF0b3IudHJhbnNmb3JtKGNvbHVtbi50aXRsZSksXG4gICAgICAgICAgICBzb3J0YWJsZTogY29sdW1uLmhhc093blByb3BlcnR5KCdzb3J0YWJsZScpID8gY29sdW1uLnNvcnRhYmxlIDogdHJ1ZSxcbiAgICAgICAgICAgIHZpc2libGU6IGNvbHVtbi5oYXNPd25Qcm9wZXJ0eSgnaGlkZGVuJykgPyAhY29sdW1uLmhpZGRlbiA6IHRydWUsXG4gICAgICAgICAgICBuYW1lOiBjb2x1bW4ubmFtZSxcbiAgICAgICAgICB9O1xuXG4gICAgICAgICAgaWYgKGNvbHVtbi5jbGFzc05hbWUpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICBjbGFzc05hbWU6IGNvbHVtbi5jbGFzc05hbWUsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgIGNsYXNzTmFtZTogJycsXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBpZiAoY29sdW1uLmZvcm1hdHRlcnMpIHtcbiAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICByZW5kZXIoZGF0YTogYW55LCB0eXBlOiBzdHJpbmcsIHJvdzogYW55LCBtZXRhOiBhbnkpIHtcbiAgICAgICAgICAgICAgICBsZXQgcmVzdWx0ID0gZGF0YTtcbiAgICAgICAgICAgICAgICAoY29sdW1uLmZvcm1hdHRlcnMgYXMgYW55W10pLmZvckVhY2goKGNvbHVtbkZvcm1hdHRlcikgPT4ge1xuICAgICAgICAgICAgICAgICAgY29uc3QgZm9ybWF0dGVyID0gc2VsZi5fY29sdW1uRm9ybWF0dGVyc1tjb2x1bW5Gb3JtYXR0ZXIuZm9ybWF0dGVyXTtcbiAgICAgICAgICAgICAgICAgIGlmIChmb3JtYXR0ZXIgJiYgdHlwZW9mIGZvcm1hdHRlci5yZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sdW1uLmZvcm1hdFN0cmluZyA9IGNvbHVtbkZvcm1hdHRlci5mb3JtYXRTdHJpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbHVtbi5mb3JtYXRPcHRpb25zID0gY29sdW1uRm9ybWF0dGVyLmZvcm1hdE9wdGlvbnM7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXN1bHQgPSBmb3JtYXR0ZXIucmVuZGVyLmJpbmQoY29sdW1uKShyZXN1bHQsIHR5cGUsIHJvdywgbWV0YSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5mb3JtYXRTdHJpbmc7XG4gICAgICAgICAgICAgICAgZGVsZXRlIGNvbHVtbi5mb3JtYXRPcHRpb25zO1xuICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGNvbHVtbiBmb3JtYXR0ZXJzIGV4cG9ydCBjcmVhdGVkQ2VsbCBldmVudFxuICAgICAgICAgICAgY29uc3QgaXRlbXMgPSBjb2x1bW4uZm9ybWF0dGVycy5maWx0ZXIoKGNvbHVtbkZvcm1hdHRlcikgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiB0eXBlb2YgY29sdW1uRm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoaXRlbXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICBPYmplY3QuYXNzaWduKGNvbHVtbkRlZmluaXRpb24sIHtcbiAgICAgICAgICAgICAgICBjcmVhdGVkQ2VsbChjZWxsOiBhbnksIGNlbGxEYXRhOiBhbnksIHJvd0RhdGE6IGFueSwgcm93SW5kZXg6IG51bWJlciwgY29sSW5kZXg6IG51bWJlcikge1xuICAgICAgICAgICAgICAgICAgaXRlbXMuZm9yRWFjaCgoY29sdW1uRm9ybWF0dGVyKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHNlbGYuX2NvbHVtbkZvcm1hdHRlcnNbY29sdW1uRm9ybWF0dGVyLmZvcm1hdHRlcl0gYXMgYW55IGFzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlcjtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGZvcm1hdHRlciAmJiB0eXBlb2YgZm9ybWF0dGVyLmFmdGVyUmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVyLmFmdGVyUmVuZGVyLmJpbmQoY29sdW1uKShjZWxsLCBjZWxsRGF0YSwgcm93RGF0YSwgcm93SW5kZXgsIGNvbEluZGV4KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKGNvbHVtbi5mb3JtYXR0ZXIpIHtcbiAgICAgICAgICAgIGNvbnN0IGZvcm1hdHRlciA9IHNlbGYuX2NvbHVtbkZvcm1hdHRlcnNbY29sdW1uLmZvcm1hdHRlcl07XG4gICAgICAgICAgICBpZiAoZm9ybWF0dGVyICYmIHR5cGVvZiBmb3JtYXR0ZXIucmVuZGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIHJlbmRlcjogZm9ybWF0dGVyLnJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYWZ0ZXJSZW5kZXJGb3JtYXR0ZXIgPSBmb3JtYXR0ZXIgYXMgYW55IGFzIE9uQWR2YW5jZWRDb2x1bW5BZnRlclJlbmRlcjtcbiAgICAgICAgICAgIGlmIChhZnRlclJlbmRlckZvcm1hdHRlciAmJiB0eXBlb2YgYWZ0ZXJSZW5kZXJGb3JtYXR0ZXIuYWZ0ZXJSZW5kZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihjb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgICAgICAgcmVuZGVyOiBmb3JtYXR0ZXIucmVuZGVyLmJpbmQoY29sdW1uKSxcbiAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgIE9iamVjdC5hc3NpZ24oY29sdW1uRGVmaW5pdGlvbiwge1xuICAgICAgICAgICAgICAgIGNyZWF0ZWRDZWxsOiBhZnRlclJlbmRlckZvcm1hdHRlci5hZnRlclJlbmRlci5iaW5kKGNvbHVtbiksXG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gY29sdW1uRGVmaW5pdGlvbjtcbiAgICAgICAgfSk7XG4gICAgICAvLyBnZXQgdGFibGUgZWxlbWVudFxuICAgICAgY29uc3QgdGFibGVFbGVtZW50ID0galF1ZXJ5KHRoaXMudGFibGUgJiYgdGhpcy50YWJsZS5uYXRpdmVFbGVtZW50KTtcbiAgICAgIGpRdWVyeSh3aW5kb3cpLm9uKCdyZXNpemUnLCAoKSA9PiB7XG4gICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5kYXRhVGFibGUuY29sdW1ucy5hZGp1c3QoKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0sIDEpO1xuICAgICAgfSk7XG4gICAgICAvLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IG5vLXNoYWRvd2VkLXZhcmlhYmxlXG4gICAgICB0YWJsZUVsZW1lbnQub24oJ3Byb2Nlc3NpbmcuZHQnLCAoZXZlbnQsIHNldHRpbmdzLCBwcm9jZXNzaW5nKSA9PiB7XG4gICAgICAgIGlmIChwcm9jZXNzaW5nKSB7XG4gICAgICAgICAgLy8gY2xlYXIgZW1wdHkgdGFibGUgZWxlbWVudFxuICAgICAgICAgIHRhYmxlRWxlbWVudC5maW5kKCcuZGF0YVRhYmxlc19lbXB0eScpLmh0bWwoJycpO1xuICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGFibGVFbGVtZW50LmFkZENsYXNzKCdwcm9jZXNzaW5nJyk7XG4gICAgICAgICAgfSwgMCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICB0YWJsZUVsZW1lbnQucmVtb3ZlQ2xhc3MoJ3Byb2Nlc3NpbmcnKTtcbiAgICAgICAgICB9LCAwKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICBsZXQgZHJhd0luZGV4ID0gMTtcbiAgICAgIHRhYmxlRWxlbWVudC5vbignb3JkZXIuZHQnLCAoZXZlbnQ6IGFueSkgPT4ge1xuICAgICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgICBjb25zdCBvcmRlciA9IHRoaXMuZGF0YVRhYmxlLm9yZGVyKCk7XG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IHRhYmxlQ29sdW1ucztcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICB0aGlzLm9yZGVyLmVtaXQob3JkZXIpO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfSkub24oJ2RyYXcuZHQnLCAoZXZlbnQpID0+IHtcbiAgICAgICAgdGhpcy5kcmF3LmVtaXQoKTtcbiAgICAgICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICAgICAgY29uc3QgaW5mbzogeyBwYWdlOiBudW1iZXI7IHBhZ2VzOiBudW1iZXIgfSA9IHRoaXMuZGF0YVRhYmxlLnBhZ2UuaW5mbygpO1xuICAgICAgICAgIHRoaXMucGFnZS5lbWl0KGluZm8pO1xuICAgICAgICAgIGlmIChkcmF3SW5kZXggPiAxKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgfVxuICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICBkcmF3SW5kZXgrKztcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge3RoaXMuZGF0YVRhYmxlLmNvbHVtbnMuYWRqdXN0KCk7IH0sIDEpO1xuICAgICAgICAgIH0gY2F0Y2ggKGVycikge1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcignRVJST1InLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgYWRqdXN0aW5nIHRhYmxlIGNvbHVtbnMnKTtcbiAgICAgICAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgIH0pO1xuXG4gICAgICAvLyBhbGxvdyBzZWxlY3Rpb25cbiAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgLy8gZ2V0IGZpcnN0IGNvbHVtbiAoYXMgcm93IHByaW1hcnkga2V5KVxuICAgICAgICAvLyB0b2RvOjphbGxvdyByb3cgcHJpbWFyeSBrZXkgY29uZmlndXJhdGlvblxuICAgICAgICBjb25zdCBmaXJzdENvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnNbMF07XG4gICAgICAgIC8vIGFkZCBzZWxlY3QgY29sdW1uXG4gICAgICAgIGNvbnN0IHNlbGVjdENvbHVtbkRlZmluaXRpb24gPSB7XG4gICAgICAgICAgY2xhc3NOYW1lOiAndGV4dC1jZW50ZXIgcGwtNCBwci0wJyxcbiAgICAgICAgICBkYXRhOiBmaXJzdENvbHVtbi5wcm9wZXJ0eSB8fCBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICAgIGRlZmF1bHRDb250ZW50OiAnJyxcbiAgICAgICAgICB0aXRsZTogJycsXG4gICAgICAgICAgc29ydGFibGU6IGZhbHNlLFxuICAgICAgICAgIHZpc2libGU6ICF0aGlzLmN1c3RvbVNlbGVjdCxcbiAgICAgICAgICBuYW1lOiBmaXJzdENvbHVtbi5uYW1lLFxuICAgICAgICB9O1xuICAgICAgICAvLyBhc3NpZ24gcmVuZGVyZXJcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZWxlY3RDb2x1bW5EZWZpbml0aW9uLCB7XG4gICAgICAgICAgcmVuZGVyOiB0aGlzLl9yZW5kZXJTZWxlY3QuYmluZCh0aGlzKSxcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIGFuZCBmaW5hbGx5IGFkZCBjb2x1bW5cbiAgICAgICAgdGFibGVDb2x1bW5zLnVuc2hpZnQoc2VsZWN0Q29sdW1uRGVmaW5pdGlvbik7XG4gICAgICAgIC8vIHVzZXIgaW50ZXJmYWNlIGFkZGl0aW9uc1xuICAgICAgICAvLyBoYW5kbGUgcGFnZSBjaGFuZ2UgZXZlbnQgKGEgdHJpY2sgZm9yIGZpcmluZyBkcmF3LmR0IGV2ZW50cylcbiAgICAgICAgdGFibGVFbGVtZW50XG4gICAgICAgICAgLy8gaGFuZGxlIGRyYXcgZXZlbnRzXG4gICAgICAgICAgLm9uKCdkcmF3LmR0JywgKCkgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGhpcy5jdXN0b21TZWxlY3QpIHtcbiAgICAgICAgICAgICAgLy8gZW5hYmxlIHJvdyBzZWxlY3Rpb24gZXZlbnRcbiAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoJ3Rib2R5Jykub24oJ2NsaWNrJywgJ3RyJywgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgLy8gc2VsZWN0IHJvd1xuICAgICAgICAgICAgICAgIGNvbnN0IHJvdyA9IHNlbGYuZGF0YVRhYmxlLnJvdyh0aGlzKTtcbiAgICAgICAgICAgICAgICAvLyBhZGQgcm93XG4gICAgICAgICAgICAgICAgc2VsZi5zZWxlY3QuZW1pdChyb3cpO1xuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvbnN0IGVsZW1lbnRzID0gdGFibGVFbGVtZW50LmZpbmQoJ2lucHV0LnMtcm93Jyk7XG4gICAgICAgICAgICBlbGVtZW50cy5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIG1ha2Ugc2VsZWN0aW9uIG9uIGN1cnJlbnQgcGFnZVxuICAgICAgICAgICAgY29uc3Qga2V5ID0gdGhpcy5jb25maWcuY29sdW1uc1swXS5wcm9wZXJ0eSB8fCAnJztcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgLy8gZW51bWVyYXRlIHNlbGVjdGVkIGl0ZW1zXG4gICAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWQuZm9yRWFjaCgoaXRlbSkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGZpbmQgcm93IGlkZW50aWZpZXJcbiAgICAgICAgICAgICAgICBjb25zdCBpZCA9IGl0ZW1ba2V5XTtcbiAgICAgICAgICAgICAgICAvLyBpZiBpZGVudGlmaWVyIGlzIGRlZmluZWRcbiAgICAgICAgICAgICAgICBpZiAoaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgLy8gdHJ5IHRvIGZpbmQgY2hlY2sgZWxlbWVudCB3aXRoIHRoaXMgaWRlbnRpZmllciBpbiBhdHRyaWJ1dGUgZGF0YS1pZFxuICAgICAgICAgICAgICAgICAgdGFibGVFbGVtZW50LmZpbmQoYGlucHV0W2RhdGEtaWQ9JyR7aWR9J11gKS5wcm9wKCdjaGVja2VkJywgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmICh0aGlzLnNtYXJ0U2VsZWN0KSB7XG4gICAgICAgICAgICAgIC8vIHNlbGVjdCByb3dzIHRoYXQgYXJlIG5vdCBzZWxlY3RlZFxuICAgICAgICAgICAgICAvLyBhbmQgZG8gbm90IGluY2x1ZGVkIGluIHVuc2VsZWN0ZWQgY29sbGVjdGlvblxuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5lYWNoKChpbmRleCwgZWxlbWVudCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGdldCBkYXRhIGlkXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMudW5zZWxlY3RlZC5maW5kSW5kZXgoKHgpID0+IHtcbiAgICAgICAgICAgICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTp0cmlwbGUtZXF1YWxzXG4gICAgICAgICAgICAgICAgICByZXR1cm4geFtrZXldID09IGpRdWVyeShlbGVtZW50KS5hdHRyKCdkYXRhLWlkJyk7XG4gICAgICAgICAgICAgICAgfSkgPCAwKSB7XG4gICAgICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyh0aGlzLmRhdGFUYWJsZS5yb3coaW5kZXgpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgICB0YWJsZUVsZW1lbnQuZmluZCgnaW5wdXRbZGF0YS1pZF0nKS5wcm9wKCdjaGVja2VkJywgZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gZGlzcGxheSByb3cgZGV0YWlsc1xuICAgICAgaWYgKHRoaXMuZGV0YWlsc1RlbXBsYXRlKSB7XG4gICAgICAgIGNvbnN0IGRldGFpbHNTdHJpbmcgPSB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5Sb3dEZXRhaWxzJyk7XG4gICAgICAgIGNvbnN0IGZpcnN0Q29sdW1uID0gdGhpcy5jb25maWcuY29sdW1uc1swXTtcbiAgICAgICAgY29uc3Qgc2hvd0RldGFpbHNDb2x1bW5EZWZpbml0aW9uID0ge1xuICAgICAgICAgIGNsYXNzTmFtZTogJ2RldGFpbHMtY29udHJvbCBwbC00IHByLTAnLFxuICAgICAgICAgIGRhdGE6IGZpcnN0Q29sdW1uLnByb3BlcnR5IHx8IGZpcnN0Q29sdW1uLm5hbWUsXG4gICAgICAgICAgZGVmYXVsdENvbnRlbnQ6ICcnLFxuICAgICAgICAgIHRpdGxlOiAnJyxcbiAgICAgICAgICBzb3J0YWJsZTogZmFsc2UsXG4gICAgICAgICAgdmlzaWJsZTogIXRoaXMuY3VzdG9tU2VsZWN0LFxuICAgICAgICAgIG5hbWU6IGZpcnN0Q29sdW1uLm5hbWUsXG4gICAgICAgICAgcmVuZGVyOiAoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gYDxidXR0b24gcm9sZT1cImJ1dHRvblwiIHRpdGxlPVwiJHtkZXRhaWxzU3RyaW5nfVwiIGFyaWFsLWxhYmVsPVwiJHtkZXRhaWxzU3RyaW5nfVwiPjwvYnV0dG9uPmA7XG4gICAgICAgICAgfSxcbiAgICAgICAgfTtcbiAgICAgICAgLy8gYW5kIGZpbmFsbHkgYWRkIGNvbHVtblxuICAgICAgICB0YWJsZUNvbHVtbnMudW5zaGlmdChzaG93RGV0YWlsc0NvbHVtbkRlZmluaXRpb24pO1xuXG4gICAgICAgIC8vIHVzZXIgaW50ZXJmYWNlIGFkZGl0aW9uc1xuICAgICAgICAvLyBBZGQgZXZlbnQgbGlzdGVuZXIgZm9yIG9wZW5pbmcgYW5kIGNsb3NpbmcgZGV0YWlsc1xuICAgICAgICB0YWJsZUVsZW1lbnQub24oJ2NsaWNrJywgJ3RkLmRldGFpbHMtY29udHJvbCcsIChlKSA9PiB7XG4gICAgICAgICAgICBjb25zdCB0ciA9IGUudGFyZ2V0LmNsb3Nlc3QoJ3RyJyk7XG4gICAgICAgICAgICBjb25zdCByb3cgPSBzZWxmLmRhdGFUYWJsZS5yb3codHIpO1xuICAgICAgICAgICAgY29uc3QgY29udGFpbmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG5cbiAgICAgICAgICAgIGNvbnN0IGRldGFpbHNWaWV3UmVmID0gdGhpcy5fdmlld0NvbnRhaW5lclJlZi5jcmVhdGVFbWJlZGRlZFZpZXcodGhpcy5kZXRhaWxzVGVtcGxhdGUsIHtcbiAgICAgICAgICAgICAgcm93RGF0YTogcm93LmRhdGEoKSxcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGV0YWlsc1ZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuXG4gICAgICAgICAgICBpZiAoZGV0YWlsc1ZpZXdSZWYucm9vdE5vZGVzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0RldGFpbHNUZW1wbGF0ZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBub2RlLicpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBjb250YWluZXIuYXBwZW5kQ2hpbGQoZGV0YWlsc1ZpZXdSZWYucm9vdE5vZGVzWzBdKTtcblxuICAgICAgICAgICAgaWYgKHJvdy5jaGlsZC5pc1Nob3duKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJvdyBpcyBhbHJlYWR5IG9wZW4gLSBjbG9zZSBpdFxuICAgICAgICAgICAgICAgIHRoaXMuaGlkZURldGFpbHMuZW1pdCgpO1xuICAgICAgICAgICAgICAgIHJvdy5jaGlsZC5oaWRlKCk7XG5cbiAgICAgICAgICAgICAgICBkZXRhaWxzVmlld1JlZi5kZXN0cm95KCk7XG4gICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gT3BlbiB0aGlzIHJvd1xuICAgICAgICAgICAgICAgIHRoaXMuc2hvd0RldGFpbHMuZW1pdCh7cm93fSk7XG4gICAgICAgICAgICAgICAgcm93LmNoaWxkKGNvbnRhaW5lcikuc2hvdygpO1xuICAgICAgICAgICAgICAgIHJvdy5jaGlsZCgpLmFkZENsYXNzKCdkdC1jaGlsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemUgZGF0YSB0YWJsZVxuICAgICAgY29uc3Qgc2V0dGluZ3MgPSB7XG4gICAgICAgIC8vIHNldCBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhNZW51OiBbNSwgMTAsIDUwLCAxMDAsIDIwMCwgNTAwXSxcbiAgICAgICAgLy8gaGlkZSBsZW5ndGggbWVudVxuICAgICAgICBsZW5ndGhDaGFuZ2U6IGZhbHNlLFxuICAgICAgICAvLyBlbmFibGUgc2VhcmNoIGJ1dCBoaWRlIHNlYXJjaCBib3ggKGNzcylcbiAgICAgICAgc2VhcmNoaW5nOiB0cnVlLFxuICAgICAgICAvLyBlbmFibGUgZGF0YSBwcm9jZXNzaW5nXG4gICAgICAgIHByb2Nlc3Npbmc6IHRydWUsXG4gICAgICAgIC8vIGVuYWJsZSBnZXR0aW5nIHNlcnZlciBzaWRlIGRhdGFcbiAgICAgICAgc2VydmVyU2lkZTogdGhpcy5zZXJ2ZXJTaWRlLFxuICAgICAgICAvLyBlbnVtZXJhdGUgdGFibGUgY29sdW1uc1xuICAgICAgICBjb2x1bW5zOiB0YWJsZUNvbHVtbnMsXG4gICAgICAgIGNvbFJlb3JkZXI6ICB0aGlzLmNvbHVtbk9yZGVyaW5nLFxuICAgICAgICBvcmRlcjogW10sXG4gICAgICAgIC8vIHNldCBzY3JvbGwgeFxuICAgICAgICBzY3JvbGxYOiB0aGlzLnNjcm9sbFgsXG4gICAgICAgIGRvbTogJ0JmcnRpcCcsXG4gICAgICAgIGF1dG9XaWR0aDogZmFsc2UsXG4gICAgICAgIGJ1dHRvbnM6IFtcbiAgICAgICAgICB7XG4gICAgICAgICAgICBleHRlbmQ6ICdleGNlbCcsXG4gICAgICAgICAgICBmaWxlbmFtZTogdGhpcy5jb25maWcudGl0bGUsXG4gICAgICAgICAgICBjbGFzc05hbWU6ICdkLW5vbmUnLFxuICAgICAgICAgICAgZXhwb3J0T3B0aW9uczoge1xuICAgICAgICAgICAgICBjb2x1bW5zOiAndGg6bm90KDpmaXJzdC1jaGlsZCknLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgICB9LFxuICAgICAgICBdLFxuICAgICAgICAvLyBkZWZpbmUgc2VydmVyIGRhdGEgY2FsbGJhY2tcbiAgICAgICAgZm5TZXJ2ZXJEYXRhKHNTb3VyY2U6IGFueSwgYW9EYXRhOiBhbnksIGZuQ2FsbGJhY2s6IGFueSwgb1NldHRpbmdzOiBhbnkpIHtcbiAgICAgICAgICAvLyBpZiBtZXRob2QgaXMgaW52b2tlZCBmb3IgdGhlIGZpcnN0IHRpbWVcbiAgICAgICAgICBpZiAoc2VsZi5fZmlyc3RMb2FkKSB7XG4gICAgICAgICAgICAvLyBkaXNhYmxlZCBmaXJzdCBsb2FkIGZsYWdcbiAgICAgICAgICAgIHNlbGYuX2ZpcnN0TG9hZCA9IGZhbHNlO1xuICAgICAgICAgICAgLy8gaWYgYXV0byBsb2FkIGlzIGRpc2FibGVkXG4gICAgICAgICAgICBpZiAoc2VsZi5hdXRvTG9hZCA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgY29uc3QgZW1wdHlEYXRhU2V0ID0ge1xuICAgICAgICAgICAgICAgIHJlY29yZHNUb3RhbDogMCxcbiAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IDAsXG4gICAgICAgICAgICAgICAgZGF0YTogW10sXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAvLyBlbWl0IGVtcHR5IGRhdGFcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZW1wdHlEYXRhU2V0KTtcbiAgICAgICAgICAgICAgLy8gcmV0dXJuIGVtcHR5IGRhdGFcbiAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soZW1wdHlEYXRhU2V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gcmVzZXQgZXJyb3JcbiAgICAgICAgICBzZWxmLnRvZ2dsZUVycm9yKCk7XG4gICAgICAgICAgLy8gZ2V0IGFjdGl2YXRlZCByb3V0ZSBwYXJhbXNcbiAgICAgICAgICBjb25zdCBxdWVyeVBhcmFtcyA9IHNlbGYuX2FjdGl2YXRlZFJvdXRlLnNuYXBzaG90LnF1ZXJ5UGFyYW1zO1xuICAgICAgICAgIC8vIGdldCBjb2x1bW5zXG4gICAgICAgICAgY29uc3QgY29sdW1ucyA9IGFvRGF0YVsxXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgb3JkZXIgZXhwcmVzc2lvblxuICAgICAgICAgIGxldCBvcmRlciA9IGFvRGF0YVsyXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgc2tpcCByZWNvcmRzIHBhcmFtXG4gICAgICAgICAgY29uc3Qgc2tpcCA9IGFvRGF0YVszXS52YWx1ZTtcbiAgICAgICAgICAvLyBnZXQgcGFnZSBzaXplIHBhcmFtXG4gICAgICAgICAgY29uc3QgdG9wID0gYW9EYXRhWzRdLnZhbHVlO1xuICAgICAgICAgIC8vIGdldCBzZWFyY2ggdmFsdWVcbiAgICAgICAgICBjb25zdCBzZWFyY2ggPSBhb0RhdGFbNV0udmFsdWU7XG4gICAgICAgICAgLy8gZ2V0IGRhdGEgcXVlcnlhYmxlXG4gICAgICAgICAgY29uc3QgcSA9IHNlbGYuX3F1ZXJ5IGluc3RhbmNlb2YgQ2xpZW50RGF0YVF1ZXJ5YWJsZSA/IHNlbGYuX3F1ZXJ5IDogc2VsZi5fY29udGV4dC5tb2RlbChzZWxmLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgICAvLyBhcHBseSBwYWdpbmcgcGFyYW1zXG4gICAgICAgICAgaWYgKHRvcCkge1xuICAgICAgICAgICAgcS50YWtlKHRvcCkuc2tpcChza2lwKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gaW5pdGlhbGl6ZSBwYXJhbWV0ZXJzIChyb3dHcm91cCBhbmQgb3JkZXIpIGlmIHRoZXJlIGlzIHJvdyBncm91cCBpbnB1dFxuICAgICAgICAgIGxldCByb3dHcm91cE9yZGVyOiBhbnlbXSA9IFtdO1xuICAgICAgICAgIGlmIChzZWxmLnJvd0dyb3VwICYmIHNlbGYucm93R3JvdXAubGVuZ3RoKSB7XG4gICAgICAgICAgICBsZXQgY29sT3JkZXIgPSBbXTtcblxuICAgICAgICAgICAgLy8gZmluZCBpbmRleCBvZiB0aGUgcm93R3JvdXAgY29sdW1uXG4gICAgICAgICAgICBsZXQgY29scyA9IHNlbGYucm93R3JvdXAubWFwKHggPT4gdGFibGVDb2x1bW5zLmZpbmRJbmRleCh0YWJsZUNvbHVtbiA9PiB0YWJsZUNvbHVtbi5kYXRhID09PSB4KSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgICAgICAgICAgLy8gZmluZCBuZXcgaW5kZXggb2YgdGhlIHJvd0dyb3VwIGNvbHVtbiBpbiBjYXNlIG9mIHRhYmxlIG9mZmVycyB0aGUgY29sdW1uIHJlb3JkZXJpbmcgY2FwYWJpbGl0eVxuICAgICAgICAgICAgLy8gaS5lLiBzZXR0aW5ncy5jb2xSZW9yZGVyID09PSBmYWxzZSAoY29sdW1uT3JkZXJpbmcgPT09IGZhbHNlKVxuICAgICAgICAgICAgaWYgKHNlbGYuZGF0YVRhYmxlICYmIHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIgJiYgdGhpcy5jb2x1bW5PcmRlcmluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICBjb2xPcmRlciA9IHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoKTtcbiAgICAgICAgICAgICAgY29scyA9IGNvbHMubWFwKCAoY29sOiBhbnkpID0+IGNvbE9yZGVyLmluZGV4T2YoY29sIGFzIG5ldmVyKSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ID4gLTEpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgY29sdW1uID0gLTE7XG4gICAgICAgICAgICBsZXQgZGlyZWN0aW9uID0gJ2FzYyc7XG5cbiAgICAgICAgICAgIC8vIHNldCBjb2x1bW4gYW5kIG9yZGVyIGRpcmVjdGlvblxuICAgICAgICAgICAgaWYgKG9yZGVyICYmIG9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICBjb2x1bW4gPSBvcmRlclswXS5jb2x1bW47XG4gICAgICAgICAgICAgIGRpcmVjdGlvbiA9IG9yZGVyWzBdLmRpcjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJvd0dyb3VwT3JkZXIgPSBjb2xzLm1hcCgoeCkgPT4ge1xuICAgICAgICAgICAgICAvLyBjaGVjayBpZiBjb2x1bW4gb3JkZXIgaGFzIGJlZW4gY2hhbmdlZFxuICAgICAgICAgICAgICAvLyBhbmQgZmluZCB0aGUgbmV3IGluZGV4IChjb2x1bW4taW5kZXgpIG9mIHRoZSByb3cgZ3JvdXAgY29sdW1uXG4gICAgICAgICAgICAgIGlmICh4ICE9IGNvbHVtbiAmJiBzZWxmLmxhc3RSb3dHcm91cE9yZGVyICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBpZiAoeCA9PT0gc2VsZi5sYXN0Um93R3JvdXBPcmRlci5jb2x1bW4pIHtcbiAgICAgICAgICAgICAgICAgIGNvbHVtbiA9IHNlbGYubGFzdFJvd0dyb3VwT3JkZXIuY29sdW1uO1xuICAgICAgICAgICAgICAgICAgZGlyZWN0aW9uID0gc2VsZi5sYXN0Um93R3JvdXBPcmRlci5kaXJlY3Rpb247XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgY29sdW1uOiB4LFxuICAgICAgICAgICAgICAgIGRpcjogeCA9PT0gY29sdW1uID8gZGlyZWN0aW9uIDogJ2FzYydcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBvcmRlciA9IG9yZGVyIHx8IFtdO1xuICAgICAgICAgICAgLy8gc2V0IHRoZSByb3cgZ3JvdXAgY29sdW1uIHF1ZXJ5IHBhcmFtIGFsd2F5cyBmaXJzdCBhbmQgYmVmb3JlIHRhYmxlIG9yZGVyaW5nIHF1ZXJ5IHBhcmFtc1xuICAgICAgICAgICAgb3JkZXIudW5zaGlmdCguLi5yb3dHcm91cE9yZGVyKTtcblxuICAgICAgICAgICAgLy8gc2F2ZSBvcmRlcmluZyBjb2x1bW4gYW5kIGRpcmVjdGlvbiAocmVnYXJkbGVzcyByb3dHcm91cGluZylcbiAgICAgICAgICAgIGlmIChjb2x1bW4gPiAtMSkge1xuICAgICAgICAgICAgICBzZWxmLmxhc3RSb3dHcm91cE9yZGVyID0geyBjb2x1bW4sIGRpcmVjdGlvbiB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICAvLyBhcHBseSBvcmRlciBwYXJhbXNcbiAgICAgICAgICBpZiAob3JkZXIgJiYgb3JkZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBnZXQgb3JkZXIgcXVlcnkgZXhwcmVzc2lvblxuICAgICAgICAgICAgY29uc3Qgb3JkZXJCeVN0ciA9IG9yZGVyLm1hcCgoZXhwcjogYW55KSA9PiB7XG4gICAgICAgICAgICAgIGxldCBjb2x1bW5JbmRleDogbnVtYmVyO1xuICAgICAgICAgICAgICBpZiAoc2VsZi5jb2x1bW5PcmRlcmluZyA9PT0gZmFsc2UpIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGV4cHIuY29sdW1uO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHNlbGYuZGF0YVRhYmxlICYmIHNlbGYuZGF0YVRhYmxlLmNvbFJlb3JkZXIpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgY29sdW1uIG9yZGVyIChmcm9tIGNvbFJlb3JkZXIpXG4gICAgICAgICAgICAgICAgY29uc3QgY29sdW1uT3JkZXI6IG51bWJlcltdID0gc2VsZi5kYXRhVGFibGUuY29sUmVvcmRlci5vcmRlcigpO1xuICAgICAgICAgICAgICAgIC8vIGFuZCBtYXRjaCB0aGUgZGF0YVRhYmxlIGluZGV4IHRvIHRoZSBjb25maWcgY29sdW1ucyBpbmRleFxuICAgICAgICAgICAgICAgIC8vIGV4cHIuY29sdW1uIHNob3VsZCBhbHdheXMgYmUgdmFsaWQgKGUuZy4gaW4gcmFuZ2UpLCBidXQgcGVyZm9ybSBhIG1pbm9yIHZhbGlkYXRpb25cbiAgICAgICAgICAgICAgICBpZiAoZXhwci5jb2x1bW4gPj0gMCAmJiBleHByLmNvbHVtbiA8IGNvbHVtbk9yZGVyLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSBjb2x1bW5PcmRlcltleHByLmNvbHVtbl07XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgIC8vIHVzZSB0aGUgZmlyc3QgY29sdW1uIGFzIGEgZmFsbGJhY2sgKHdvbid0IGhhcHBlbiwganVzdCBmb3Igc2FmZXR5KVxuICAgICAgICAgICAgICAgICAgY29sdW1uSW5kZXggPSAwO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBjb2x1bW5JbmRleCA9IGV4cHIuY29sdW1uO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHJldHVybiB0YWJsZUNvbHVtbnNbY29sdW1uSW5kZXhdLm5hbWUgKyAnICcgKyBleHByLmRpciB8fCAnYXNjJztcbiAgICAgICAgICAgIH0pLmpvaW4oJywnKTtcbiAgICAgICAgICAgIC8vIHNldCBvcmRlclxuICAgICAgICAgICAgcS5zZXRQYXJhbSgnJG9yZGVyYnknLCBvcmRlckJ5U3RyKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgLy8gZW5zdXJlIHNlbGYuc3RhdGVMb2FkQ2FsbGJhY2tcbiAgICAgICAgICBpZiAoc2VsZi5zdGF0ZUxvYWRDYWxsYmFjayA9PSBudWxsKSB7XG4gICAgICAgICAgICBzZWxmLnN0YXRlTG9hZENhbGxiYWNrID0gKChfLCBjYWxsYmFjaykgID0+IHtcbiAgICAgICAgICAgICAgcmV0dXJuIGNhbGxiYWNrKG51bGwpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICAgIHNlbGYuc3RhdGVMb2FkQ2FsbGJhY2sobnVsbCwgKHN0YXRlKSA9PiB7XG4gICAgICAgICAgICAvLyBjb25maWd1cmUgJHNlbGVjdCBwYXJhbWV0ZXJcbiAgICAgICAgICAgIGNvbnN0IHNlbGVjdCA9IHNlbGYuY29uZmlnLmNvbHVtbnMuZmlsdGVyKCAoY29sdW1uKSA9PiB7XG4gICAgICAgICAgICAgIGlmIChjb2x1bW4udmlydHVhbCA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICBpZiAoY29sdW1uLm9wdGlvbmFsID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgaWYgKHN0YXRlICYmIHN0YXRlLmNvbHVtbnMpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IGluZGV4ID0gdGFibGVDb2x1bW5zLmZpbmRJbmRleCgodGFibGVDb2x1bW4pID0+IHRhYmxlQ29sdW1uLm5hbWUgPT09IGNvbHVtbi5uYW1lKTtcbiAgICAgICAgICAgICAgICAgIGlmIChpbmRleCA+PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBzdGF0ZS5jb2x1bW5zW2luZGV4XS52aXNpYmxlO1xuICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9KS5tYXAoKGNvbHVtbikgPT4ge1xuICAgICAgICAgICAgICBpZiAoY29sdW1uLnByb3BlcnR5KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbHVtbi5uYW1lICsgJyBhcyAnICsgY29sdW1uLnByb3BlcnR5O1xuICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJldHVybiBjb2x1bW4ubmFtZTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBxLnNlbGVjdC5hcHBseShxLCBzZWxlY3QpO1xuICAgICAgICAgICAgLy8gY29uZmlndXJlICRmaWx0ZXJcbiAgICAgICAgICAgIGlmIChxdWVyeVBhcmFtcy4kZmlsdGVyICYmIHF1ZXJ5UGFyYW1zLiRmaWx0ZXIubGVuZ3RoKSB7XG4gICAgICAgICAgICAgIC8vIHNldCByb3V0ZSBmaWx0ZXJcbiAgICAgICAgICAgICAgY29uc3QgcVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICAgIHEuc2V0UGFyYW0oJyRmaWx0ZXInLCBudWxsKTtcbiAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbIHF1ZXJ5UGFyYW1zLiRmaWx0ZXIgXTtcbiAgICAgICAgICAgICAgaWYgKHFQYXJhbXMuJGZpbHRlcikgeyBleHByZXNzaW9ucy5wdXNoKCcoJyArIHFQYXJhbXMuJGZpbHRlciArICcpJyApOyB9XG4gICAgICAgICAgICAgIHEuZmlsdGVyKGV4cHJlc3Npb25zLmpvaW4oJyBhbmQgJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gY2hlY2sgaWYgcXVlcnkgcGFyYW1ldGVycyBjb250YWluIGZpbHRlclxuICAgICAgICAgICAgaWYgKHF1ZXJ5UGFyYW1zLiRleHBhbmQgJiYgcXVlcnlQYXJhbXMuJGV4cGFuZC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgLy8gc2V0IHJvdXRlICRleHBhbmRcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGV4cGFuZCcsIHF1ZXJ5UGFyYW1zLiRleHBhbmQpO1xuICAgICAgICAgICAgfSBlbHNlIGlmIChzZWxmLmNvbmZpZyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cyAmJiBzZWxmLmNvbmZpZy5kZWZhdWx0cy5leHBhbmQpIHtcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGV4cGFuZCcsIHNlbGYuY29uZmlnLmRlZmF1bHRzLmV4cGFuZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAoIXEuZ2V0UGFyYW1zKClbJyRvcmRlcmJ5J10gJiYgc2VsZi5jb25maWcgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMgJiYgc2VsZi5jb25maWcuZGVmYXVsdHMub3JkZXJCeSkge1xuICAgICAgICAgICAgICBxLnNldFBhcmFtKCckb3JkZXJieScsIHNlbGYuY29uZmlnLmRlZmF1bHRzLm9yZGVyQnkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmdyb3VwQnkpIHtcbiAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGdyb3VwYnknLCBzZWxmLmNvbmZpZy5kZWZhdWx0cy5ncm91cEJ5KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGFwcGVuZCBkZWZhdWx0IGZpbHRlclxuICAgICAgICAgICAgaWYgKHNlbGYuY29uZmlnICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzICYmIHNlbGYuY29uZmlnLmRlZmF1bHRzLmZpbHRlcikge1xuICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fYWR2YW5jZWRGaWx0ZXJWYWx1ZVByb3ZpZGVyLmFzeW5jQnVpbGRGaWx0ZXIoc2VsZi5jb25maWcuZGVmYXVsdHMuZmlsdGVyKS50aGVuKChkZWZhdWx0RmlsdGVyU3RyaW5nKSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKGRlZmF1bHRGaWx0ZXJTdHJpbmcpIHtcbiAgICAgICAgICAgICAgICAgIGNvbnN0IHFQYXJhbXMgPSBxLmdldFBhcmFtcygpO1xuICAgICAgICAgICAgICAgICAgcS5zZXRQYXJhbSgnJGZpbHRlcicsIG51bGwpO1xuICAgICAgICAgICAgICAgICAgY29uc3QgZXhwcmVzc2lvbnMgPSBbIGRlZmF1bHRGaWx0ZXJTdHJpbmcgXTtcbiAgICAgICAgICAgICAgICAgIGlmIChxUGFyYW1zLiRmaWx0ZXIpIHsgZXhwcmVzc2lvbnMucHVzaCgnKCcgKyBxUGFyYW1zLiRmaWx0ZXIgKyAnKScgKTsgfVxuICAgICAgICAgICAgICAgICAgcS5maWx0ZXIoZXhwcmVzc2lvbnMuam9pbignIGFuZCAnKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHNlbGYuYmVmb3JlU2VydmVyRGF0YS5lbWl0KHEpO1xuICAgICAgICAgICAgICAgIHNlbGYubGFzdFF1ZXJ5UGFyYW1zID0gcS5nZXRQYXJhbXMoKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gcS5nZXRMaXN0KCkudGhlbigoaXRlbXMpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5hZnRlclNlcnZlckRhdGEuZW1pdChpdGVtcyk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IGRhdGFTZXQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgcmVjb3Jkc1RvdGFsOiBpdGVtcy50b3RhbCxcbiAgICAgICAgICAgICAgICAgICAgICByZWNvcmRzRmlsdGVyZWQ6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgICAgICAgIGRhdGE6IGl0ZW1zLnZhbHVlLFxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID0gaXRlbXMudG90YWw7XG4gICAgICAgICAgICAgICAgICAgIGlmIChpdGVtcy50b3RhbCA9PT0gMCkge1xuICAgICAgICAgICAgICAgICAgICAgIHNlbGYucmVzZXRFbXB0eVRhYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgLy8gZW1pdCBsb2FkIGV2ZW50XG4gICAgICAgICAgICAgICAgICAgIHNlbGYubG9hZC5lbWl0KGRhdGFTZXQpO1xuICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gZGF0YVxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gZm5DYWxsYmFjayhkYXRhU2V0KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZyBlcnJvciB0byBjb25zb2xlXG4gICAgICAgICAgICAgICAgY29uc29sZS5lcnJvcignVEFCTEVTJywgZXJyKTtcbiAgICAgICAgICAgICAgICAvLyBzaG93IGVycm9yXG4gICAgICAgICAgICAgICAgc2VsZi50b2dnbGVFcnJvcihlcnIpO1xuICAgICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSAwO1xuICAgICAgICAgICAgICAgIC8vIGJ5IHJldHVybmluZyBlbXB0eSBkYXRhc2V0XG4gICAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZuQ2FsbGJhY2soRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc2VsZi5iZWZvcmVTZXJ2ZXJEYXRhLmVtaXQocSk7XG4gICAgICAgICAgICBzZWxmLmxhc3RRdWVyeVBhcmFtcyA9IHEuZ2V0UGFyYW1zKCk7XG4gICAgICAgICAgICBxLmdldExpc3QoKS50aGVuKChpdGVtcykgPT4ge1xuICAgICAgICAgICAgICBzZWxmLmFmdGVyU2VydmVyRGF0YS5lbWl0KGl0ZW1zKTtcbiAgICAgICAgICAgICAgY29uc3QgZGF0YVNldCA9IHtcbiAgICAgICAgICAgICAgICByZWNvcmRzVG90YWw6IGl0ZW1zLnRvdGFsLFxuICAgICAgICAgICAgICAgIHJlY29yZHNGaWx0ZXJlZDogaXRlbXMudG90YWwsXG4gICAgICAgICAgICAgICAgZGF0YTogaXRlbXMudmFsdWUsXG4gICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgIHNlbGYuX2xhc3RRdWVyeVRvdGFsSXRlbXMgPSBpdGVtcy50b3RhbDtcbiAgICAgICAgICAgICAgaWYgKGl0ZW1zLnRvdGFsID09PSAwKSB7XG4gICAgICAgICAgICAgICAgc2VsZi5yZXNldEVtcHR5VGFibGUoKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAvLyBlbWl0IGxvYWQgZXZlbnRcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoZGF0YVNldCk7XG4gICAgICAgICAgICAgIC8vIHJldHVybiBkYXRhXG4gICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKGRhdGFTZXQpO1xuICAgICAgICAgICAgfSkuY2F0Y2goKGVycikgPT4ge1xuICAgICAgICAgICAgICAvLyBsb2cgZXJyb3IgdG8gY29uc29sZVxuICAgICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCBlcnIpO1xuICAgICAgICAgICAgICAvLyBzaG93IGVycm9yXG4gICAgICAgICAgICAgIHNlbGYudG9nZ2xlRXJyb3IoZXJyKTtcbiAgICAgICAgICAgICAgLy8gYnkgcmV0dXJuaW5nIGVtcHR5IGRhdGFzZXRcbiAgICAgICAgICAgICAgc2VsZi5sb2FkLmVtaXQoRU1QVFlfREFUQVNFVCk7XG4gICAgICAgICAgICAgIHJldHVybiBmbkNhbGxiYWNrKEVNUFRZX0RBVEFTRVQpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0sXG4gICAgICAgIGxhbmd1YWdlOiBPYmplY3QuYXNzaWduKHsgfSwgc2VsZi50cmFuc2xhdG9yLnRyYW5zZm9ybSgnVGFibGVzLkRhdGFUYWJsZScpLFxuICAgICAgICAgIHtlbXB0eVRhYmxlOiAnICcgfSksXG4gICAgICB9O1xuICAgICAgLy8gY2hlY2sgaWYgdGhlcmUgaXMgYSByb3dHcm91cCBpbnB1dCBhbmQgYXNzaWduIGl0IHRvIHRhYmxlXG4gICAgICBpZiAoc2VsZi5yb3dHcm91cC5sZW5ndGgpIHtcbiAgICAgICAgY29uc3QgY29scyA9IHNlbGYucm93R3JvdXAubWFwKHggPT4gdGFibGVDb2x1bW5zLmZpbmRJbmRleCh0YWJsZUNvbHVtbiA9PiB0YWJsZUNvbHVtbi5kYXRhID09PSB4KSkuZmlsdGVyKGluZGV4ID0+IGluZGV4ID49IDApO1xuICAgICAgICBjb25zdCBkYXRhU3JjID0gY29scy5tYXAoeCA9PiB0YWJsZUNvbHVtbnNbeF0uZGF0YSk7XG4gICAgICAgIGNvbnN0IHN0YXJ0UmVuZGVyID0gZnVuY3Rpb24gKHJvd3M6IERhdGFUYWJsZXMuQXBpLCBncm91cDogc3RyaW5nLCBsZXZlbDogbnVtYmVyKSB7XG4gICAgICAgICAgY29uc3QgaGVhZGVyVmlld1JlZiA9IHNlbGYuX3ZpZXdDb250YWluZXJSZWYuY3JlYXRlRW1iZWRkZWRWaWV3KFxuICAgICAgICAgICAgICBzZWxmLmhlYWRlclRlbXBsYXRlIGFzIGFueSxcbiAgICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGdyb3VwLFxuICAgICAgICAgICAgICAgIHJvd3MsXG4gICAgICAgICAgICAgICAgbGV2ZWxcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIGhlYWRlclZpZXdSZWYuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICAgICAgaWYgKGhlYWRlclZpZXdSZWYucm9vdE5vZGVzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdIZWFkZXJUZW1wbGF0ZSBtdXN0IGhhdmUgZXhhY3RseSBvbmUgcm9vdCBub2RlLicpXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gaGVhZGVyVmlld1JlZi5yb290Tm9kZXNbMF07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZW5kUmVuZGVyIHByb3BlcnR5XG4gICAgICAgIGNvbnN0IGVuZFJlbmRlciA9IGZ1bmN0aW9uIChyb3dzOiBEYXRhVGFibGVzLkFwaSwgZ3JvdXA6IHN0cmluZywgbGV2ZWw6IG51bWJlcikge1xuICAgICAgICAgIGNvbnN0IGZvb3RlclZpZXdSZWYgPSBzZWxmLl92aWV3Q29udGFpbmVyUmVmLmNyZWF0ZUVtYmVkZGVkVmlldyhcbiAgICAgICAgICAgICAgc2VsZi5mb290ZXJUZW1wbGF0ZSBhcyBhbnksXG4gICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICBncm91cCxcbiAgICAgICAgICAgICAgICByb3dzLFxuICAgICAgICAgICAgICAgIGxldmVsXG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBmb290ZXJWaWV3UmVmLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgICAgIGlmIChmb290ZXJWaWV3UmVmLnJvb3ROb2Rlcy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignRm9vdGVyVGVtcGxhdGUgbXVzdCBoYXZlIGV4YWN0bHkgb25lIHJvb3Qgbm9kZS4nKVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZvb3RlclZpZXdSZWYucm9vdE5vZGVzWzBdO1xuICAgICAgICB9XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHsgcm93R3JvdXA6IHsgZGF0YVNyYywgZW5kUmVuZGVyLCBzdGFydFJlbmRlciB9IH0sIHt9KTtcbiAgICAgIH1cblxuICAgICAgaWYgKHNlbGYuY29uZmlnLmZpeGVkQ29sdW1ucykge1xuICAgICAgICBjb25zdCBsZWZ0ID0gc2VsZi5jb25maWcuZml4ZWRDb2x1bW5zLmxlZnQgfHwgMDtcbiAgICAgICAgY29uc3QgcmlnaHQgPSBzZWxmLmNvbmZpZy5maXhlZENvbHVtbnMucmlnaHQgfHwgMDtcbiAgICAgICAgY29uc3QgZml4ZWRDb2x1bW5zID0ge1xuICAgICAgICAgIGxlZnQsXG4gICAgICAgICAgcmlnaHRcbiAgICAgICAgfTtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIGZpeGVkQ29sdW1uc1xuICAgICAgICB9KTtcbiAgICAgIH1cblxuICAgICAgY29uc3Qgc3RhdGVTZXR0aW5ncyA9IHtcbiAgICAgICAgc3RhdGVTYXZlOiB0aGlzLnN0YXRlU2F2ZVxuICAgICAgfTtcbiAgICAgIGlmICh0aGlzLnN0YXRlTG9hZENhbGxiYWNrKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc3RhdGVTZXR0aW5ncywge1xuICAgICAgICAgIHN0YXRlTG9hZENhbGxiYWNrOiB0aGlzLnN0YXRlTG9hZENhbGxiYWNrXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2spIHtcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzdGF0ZVNldHRpbmdzLCB7XG4gICAgICAgICAgc3RhdGVTYXZlQ2FsbGJhY2s6IHRoaXMuc3RhdGVTYXZlQ2FsbGJhY2tcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICBPYmplY3QuYXNzaWduKHNldHRpbmdzLCBzdGF0ZVNldHRpbmdzKTtcblxuICAgICAgaWYgKHRoaXMuc2Nyb2xsYWJsZSkge1xuICAgICAgICAvLyBzZXQgY29udGludW91cyBzY3JvbGxpbmdcbiAgICAgICAgT2JqZWN0LmFzc2lnbihzZXR0aW5ncywge1xuICAgICAgICAgIHNjcm9sbFk6IHRoaXMuc2Nyb2xsWSxcbiAgICAgICAgICBzY3JvbGxDb2xsYXBzZTogZmFsc2UsXG4gICAgICAgICAgc2Nyb2xsZXI6IHtcbiAgICAgICAgICAgIGxvYWRpbmdJbmRpY2F0b3I6IGZhbHNlLFxuICAgICAgICAgICAgZGlzcGxheUJ1ZmZlcjogQXJyYXkuaXNBcnJheSh0aGlzLnJvd0dyb3VwKSAmJiB0aGlzLnJvd0dyb3VwLmxlbmd0aCA+IDAgPyAxMDAgOiAxMCxcbiAgICAgICAgICB9LFxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24oc2V0dGluZ3MsIHtcbiAgICAgICAgICBzY3JvbGxZOiB0aGlzLnNjcm9sbFksXG4gICAgICAgICAgcGFnaW5nOiB0aGlzLnBhZ2luZyxcbiAgICAgICAgICBwYWdlTGVuZ3RoOiB0aGlzLnBhZ2VMZW5ndGgsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgaWYgKHRoaXMuc2VsZWN0YWJsZSkge1xuXG4gICAgICB9XG4gICAgICBpZiAodGhpcy5kYXRhVGFibGUpIHtcbiAgICAgICAgdGhpcy5kYXRhVGFibGUuZGVzdHJveSgpO1xuICAgICAgfVxuICAgICAgLy8gaGFuZGxlIGluaXQuZHQgZXZlbnQgYW5kIGVtaXQgbG9jYWwgZXZlbnRcbiAgICAgIHRoaXMuZGF0YVRhYmxlID0gdGFibGVFbGVtZW50Lm9uKCdpbml0LmR0JywgKGV2ZW50KSA9PiB7XG4gICAgICAgIGNvbnN0IHNjcm9sbGVyID0galF1ZXJ5KGV2ZW50LnRhcmdldCkucGFyZW50KCk7XG4gICAgICAgIC8vIGhhbmRsZSBzY3JvbGxpbmdcbiAgICAgICAgc2Nyb2xsZXIub24oJ3Njcm9sbCcsIChzY3JvbGxFdmVudCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRhcmdldCA9IGpRdWVyeShzY3JvbGxFdmVudC50YXJnZXQpO1xuICAgICAgICAgIGNvbnN0IHRvcCA9IHRhcmdldC5zY3JvbGxUb3AoKSBhcyBudW1iZXI7XG4gICAgICAgICAgY29uc3QgbGVmdCA9IHRhcmdldC5zY3JvbGxMZWZ0KCkgYXMgbnVtYmVyO1xuICAgICAgICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgICAgICAgdGhpcy5zY3JvbGwuZW1pdCh7XG4gICAgICAgICAgICAgIHRvcCxcbiAgICAgICAgICAgICAgbGVmdFxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgIH0pLkRhdGFUYWJsZShzZXR0aW5ncyk7XG4gICAgICB0aGlzLmluaXQuZW1pdCgpO1xuICAgICAgLy8gc2hvdyBvciBoaWRlIGhlYWRlclxuICAgICAgaWYgKCF0aGlzLnNob3dIZWFkZXIgJiYgdGhpcy5fZWxlbWVudCAmJiB0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQpIHtcbiAgICAgICAgY29uc3QgaGlkZVNlbGVjdG9yID0gKHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudClcbiAgICAgICAgICAucXVlcnlTZWxlY3RvcignLmRhdGFUYWJsZT50aGVhZCcpO1xuICAgICAgICBpZiAoaGlkZVNlbGVjdG9yKSB7XG4gICAgICAgICAgaGlkZVNlbGVjdG9yLmNsYXNzTGlzdC5hZGQoJ2Qtbm9uZScpO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGFkanVzdFNlbGVjdG9yID0gICh0aGlzLl9lbGVtZW50Lm5hdGl2ZUVsZW1lbnQgYXMgSFRNTERpdkVsZW1lbnQpXG4gICAgICAgICAgLnF1ZXJ5U2VsZWN0b3IoJy5kYXRhVGFibGUnKTtcbiAgICAgICAgaWYgKGFkanVzdFNlbGVjdG9yKSB7XG4gICAgICAgICAgYWRqdXN0U2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnbXQtMicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgICAvLyBzaG93IG9yIGhpZGUgZm9vdGVyXG4gICAgICBpZiAoIXRoaXMuc2hvd0Zvb3RlciAmJiB0aGlzLl9lbGVtZW50ICYmIHRoaXMuX2VsZW1lbnQubmF0aXZlRWxlbWVudCkge1xuICAgICAgICBjb25zdCBpbmZvU2VsZWN0b3IgPSAodGhpcy5fZWxlbWVudC5uYXRpdmVFbGVtZW50IGFzIEhUTUxEaXZFbGVtZW50KVxuICAgICAgICAgIC5xdWVyeVNlbGVjdG9yKCcuZGF0YVRhYmxlc19pbmZvJyk7XG4gICAgICAgIGlmIChpbmZvU2VsZWN0b3IpIHtcbiAgICAgICAgICBpbmZvU2VsZWN0b3IuY2xhc3NMaXN0LmFkZCgnZC1ub25lJyk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vIGFkZCBjdXN0b20gZXZlbnQgaGFuZGxlclxuXG4gICAgICBjb25zdCBvbkN1c3RvbUV2ZW50ID0gKGV2ZW50OiBhbnkpID0+IHtcbiAgICAgICAgY29uc3QgdGFyZ2V0ID0gZXZlbnQuY3VycmVudFRhcmdldCBhcyBIVE1MRWxlbWVudDtcbiAgICAgICAgLy8gZ2V0IGN1c3RvbSBldmVudCBuYW1lXG4gICAgICAgIGNvbnN0IGN1c3RvbUV2ZW50ID0gdGFyZ2V0LmRhdGFzZXQuZXZlbnQgfHwgJ2V2ZW50JztcbiAgICAgICAgLy8gZ2V0IHJvd1xuICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3codGFyZ2V0LmNsb3Nlc3QoJ3RyJykpO1xuICAgICAgICAvLyBnZXQgcm93IGRhdGFcbiAgICAgICAgY29uc3QgZGF0YSA9IHJvdy5kYXRhKCk7XG4gICAgICAgIHRoaXMuY3VzdG9tRXZlbnQuZW1pdCh7XG4gICAgICAgICAgbmFtZTogY3VzdG9tRXZlbnQsXG4gICAgICAgICAgZGF0YSxcbiAgICAgICAgICByb3c6IHJvdy5pbmRleCgpXG4gICAgICAgIH0pO1xuICAgICAgfTtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLm9mZignY2xpY2snLCAnLmR0LWN1c3RvbScpO1xuICAgICAgdGhpcy5kYXRhVGFibGUub24oJ2NsaWNrJywgJy5kdC1jdXN0b20nLCBvbkN1c3RvbUV2ZW50KTtcbiAgICAgIC8vIHNob3cgb3IgaGlkZSBwYWdlclxuICAgICAgaWYgKHRoaXMuc2hvd1BhZ2luZykge1xuICAgICAgICB0aGlzLnNob3dQYWdpbmcgPSB0cnVlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgfVxuXG4gIHNjcm9sbFRvcCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlKSB7XG4gICAgICB0aGlzLmRhdGFUYWJsZS5wYXJlbnQoKS5zY3JvbGxUb3AodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHNjcm9sbExlZnQodmFsdWU6IG51bWJlcikge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUucGFyZW50KCkuc2Nyb2xsTGVmdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgZ2V0IGxhc3RRdWVyeSgpOiBDbGllbnREYXRhUXVlcnlhYmxlIHwgdW5kZWZpbmVkIHtcbiAgICBpZiAodGhpcy5jb25maWcgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBjaGVjayBpZiBxdWVyeSBtb2RlbCBoYXMgY2hhbmdlZFxuICAgIGNvbnN0IHF1ZXJ5TW9kZWwgPSB0aGlzLl9xdWVyeSAmJiB0aGlzLl9xdWVyeS5nZXRNb2RlbCgpO1xuICAgIGNvbnN0IG1vZGVsID0gcXVlcnlNb2RlbCA/IHF1ZXJ5TW9kZWwgOiB0aGlzLmNvbmZpZy5tb2RlbDtcbiAgICBjb25zdCBxID0gdGhpcy5fY29udGV4dC5tb2RlbChtb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICBPYmplY3Qua2V5cyh0aGlzLmxhc3RRdWVyeVBhcmFtcykuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgcS5zZXRQYXJhbShrZXksIHRoaXMubGFzdFF1ZXJ5UGFyYW1zICYmIHRoaXMubGFzdFF1ZXJ5UGFyYW1zW2tleV0pO1xuICAgIH0pO1xuICAgIC8vIHJldHVybiBxdWVyeVxuICAgIHJldHVybiBxO1xuICB9XG5cbiAgLyoqXG4gICAqIEZldGNoZXMgYW5kIHVwZGF0ZXMgYSBzaW5nbGUgcm93XG4gICAqIEBwYXJhbSBmaW5kIC0gQW55IG9iamVjdCB3aGljaCBpcyBiZWluZyBjb252ZXJ0ZWQgdG8gYSBxdWVyeVxuICAgKi9cbiAgcHVibGljIGZldGNoT25lKGZpbmQ6IGFueSkge1xuICAgIGlmIChmaW5kID09IG51bGwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlID09IG51bGwpIHtcbiAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBpZiAodGhpcy5sYXN0UXVlcnlQYXJhbXMgPT0gbnVsbCkge1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBnZXQgcm93c1xuICAgIGNvbnN0IHJvd3MgPSBBcnJheS5mcm9tKHRoaXMuZGF0YVRhYmxlLnJvd3MoKS5kYXRhKCkpO1xuICAgIGlmIChyb3dzICYmIHJvd3MubGVuZ3RoKSB7XG4gICAgICAvLyBmaW5kIHJlc3VsdFxuICAgICAgY29uc3QgZmluZEtleXMgPSBPYmplY3Qua2V5cyhmaW5kKTtcbiAgICAgIGlmIChmaW5kS2V5cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBmaW5kIHJvdyBpbmRleCBieSBzZWFyY2hpbmcgZWFjaCBwcm9wZXJ0eVxuICAgICAgY29uc3Qgcm93SW5kZXggPSByb3dzLmZpbmRJbmRleCgocm93OiBhbnkpID0+IHtcbiAgICAgICAgcmV0dXJuIGZpbmRLZXlzLm1hcCggKGtleSkgPT4ge1xuICAgICAgICAgIHJldHVybiByb3dba2V5XSA9PT0gZmluZFtrZXldO1xuICAgICAgICB9KS5maWx0ZXIoIChyZXMpID0+IHtcbiAgICAgICAgICByZXR1cm4gcmVzID09PSBmYWxzZTtcbiAgICAgICAgfSkubGVuZ3RoID09PSAwO1xuICAgICAgfSk7XG4gICAgICAvLyBpZiByb3cgaGFzIGJlZW4gZm91bmRcbiAgICAgIGlmIChyb3dJbmRleCA+PSAwKSB7XG4gICAgICAgIGNvbnN0IHF1ZXJ5ID0gdGhpcy5fY29udGV4dC5tb2RlbCh0aGlzLmNvbmZpZy5tb2RlbCkuYXNRdWVyeWFibGUoKTtcbiAgICAgICAgLy8gc2VsZWN0IGF0dHJpYnV0ZXNcbiAgICAgICAgcXVlcnkuc2V0UGFyYW0oJyRzZWxlY3QnLCB0aGlzLmxhc3RRdWVyeVBhcmFtcy4kc2VsZWN0KTtcbiAgICAgICAgaWYgKHRoaXMubGFzdFF1ZXJ5UGFyYW1zLiRleHBhbmQpIHtcbiAgICAgICAgICAvLyBhcHBseSBleHBhbmQgYXR0cmlidXRlc1xuICAgICAgICAgIHF1ZXJ5LnNldFBhcmFtKCckZXhwYW5kJywgdGhpcy5sYXN0UXVlcnlQYXJhbXMuJGV4cGFuZCk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gYXBwbHkgZmlsdGVyIGZvciByb3dcbiAgICAgICAgZmluZEtleXMuZm9yRWFjaCggKGtleSkgPT4ge1xuICAgICAgICAgIGNvbnN0IGNvbHVtbiA9IHRoaXMuY29uZmlnLmNvbHVtbnMuZmluZCggKGNvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIGNvbC5wcm9wZXJ0eSA9PT0ga2V5IHx8IGNvbC5uYW1lID09PSBrZXk7XG4gICAgICAgICAgfSk7XG4gICAgICAgICAgaWYgKGNvbHVtbikge1xuICAgICAgICAgICAgLy8gZ2V0IHByb3BlcnR5IG9yIG5hbWVcbiAgICAgICAgICAgIGNvbnN0IHByb3BlcnR5ID0gY29sdW1uLnByb3BlcnR5IHx8IGNvbHVtbi5uYW1lO1xuICAgICAgICAgICAgcXVlcnkuYW5kKHByb3BlcnR5IGFzIHN0cmluZykuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcXVlcnkuYW5kKGtleSkuZXF1YWwoZmluZFtrZXldKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICAvLyBhbmQgZmluYWxseSBnZXQgaXRlbVxuICAgICAgICByZXR1cm4gcXVlcnkuZ2V0SXRlbSgpLnRoZW4oIChpdGVtKSA9PiB7XG4gICAgICAgICAgLy8gaWYgaXRlbSBleGlzdHNcbiAgICAgICAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpO1xuICAgICAgICAgIGNvbnN0IGNoZWNrZWQgPSBqUXVlcnkocm93Lm5vZGUoKSkuZmluZCgnOmNoZWNrYm94JykucHJvcCgnY2hlY2tlZCcpO1xuICAgICAgICAgIGlmIChpdGVtKSB7XG4gICAgICAgICAgICAvLyByZWRyYXcgcm93XG4gICAgICAgICAgICByb3cuZGF0YShpdGVtKTtcbiAgICAgICAgICAgIGpRdWVyeShyb3cubm9kZSgpKS5maW5kKCc6Y2hlY2tib3gnKS5vZmYoJ2NsaWNrJykub24oJ2NsaWNrJywgdGhpcy5vblNlbGVjdGlvbkNoYW5nZS5iaW5kKHRoaXMpKTtcbiAgICAgICAgICAgIC8vIGlmIHJvdyBpcyBhbHJlYWR5IHNlbGVjdGVkXG4gICAgICAgICAgICBpZiAoY2hlY2tlZCkge1xuICAgICAgICAgICAgICB0aGlzLnNlbGVjdFJvdyhyb3csIHRydWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gIH1cblxuICBwdWJsaWMgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgaWYgKHRoaXMucmVsb2FkU3Vic2NyaXB0aW9uKSB7XG4gICAgICB0aGlzLnJlbG9hZFN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBIYW5kbGUgc2VsZWN0aW9uIGNoYW5nZVxuICAgKiBAcGFyYW0gJGV2ZW50XG4gICAqL1xuICBwdWJsaWMgb25TZWxlY3Rpb25DaGFuZ2UoJGV2ZW50KSB7XG4gICAgY29uc3QgaW5wdXQgPSAgJGV2ZW50LnRhcmdldCBhcyBIVE1MSW5wdXRFbGVtZW50O1xuICAgIGNvbnN0IGV4ZWNSZWdleCA9IC8tKFxcZCspJC9nLmV4ZWMoaW5wdXQuaWQpO1xuICAgIC8vIGdldCByb3cgZnJvbSBpZFxuICAgIGNvbnN0IHJvd0luZGV4ID0gcGFyc2VJbnQoKGV4ZWNSZWdleCAmJiBleGVjUmVnZXhbMV0pIGFzIHN0cmluZywgMTApO1xuICAgIC8vIGdldCByb3dcbiAgICBjb25zdCByb3cgPSB0aGlzLmRhdGFUYWJsZS5yb3cocm93SW5kZXgpLmRhdGEoKTtcbiAgICAvLyBnZXQgcm93IGlkZW50aWZpZXJcbiAgICBpZiAocm93KSB7XG4gICAgICBjb25zdCBrZXkgPSB0aGlzLmNvbmZpZy5jb2x1bW5zWzBdLnByb3BlcnR5IHx8ICcnO1xuICAgICAgY29uc3QgaWQgPSByb3dba2V5XTtcbiAgICAgIGxldCBmaW5kSXRlbUluZGV4ID0gdGhpcy5zZWxlY3RlZC5maW5kSW5kZXgoKGl0ZW0pID0+IHtcbiAgICAgICAgcmV0dXJuIGl0ZW1ba2V5XSA9PT0gaWQ7XG4gICAgICB9KTtcbiAgICAgIGlmIChpbnB1dC5jaGVja2VkKSB7XG4gICAgICAgIGlmIChmaW5kSXRlbUluZGV4IDwgMCkge1xuICAgICAgICAgIC8vIGFkZCByb3cgdG8gc2VsZWN0ZWQgcm93c1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWQucHVzaChyb3cpO1xuICAgICAgICAgIHRoaXMuc2VsZWN0ZWRJdGVtcy5lbWl0KHRoaXMuc2VsZWN0ZWQpO1xuICAgICAgICB9XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA+PSAwKSB7XG4gICAgICAgICAgLy8gcmVtb3ZlIHNlbGVjdGVkIGl0ZW1cbiAgICAgICAgICB0aGlzLnNlbGVjdGVkLnNwbGljZShmaW5kSXRlbUluZGV4LCAxKTtcbiAgICAgICAgICBpZiAodGhpcy5zbWFydFNlbGVjdCkge1xuICAgICAgICAgICAgLy8gYWRkIHJvdyB0byB1bnNlbGVjdGVkIHJvd3NcbiAgICAgICAgICAgIGZpbmRJdGVtSW5kZXggPSB0aGlzLnVuc2VsZWN0ZWQuZmluZEluZGV4KChpdGVtKSA9PiB7XG4gICAgICAgICAgICAgIHJldHVybiBpdGVtW2tleV0gPT09IGlkO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICBpZiAoZmluZEl0ZW1JbmRleCA8IDApIHtcbiAgICAgICAgICAgICAgdGhpcy51bnNlbGVjdGVkLnB1c2gocm93KTtcbiAgICAgICAgICAgICAgdGhpcy5zZWxlY3RlZEl0ZW1zLmVtaXQodGhpcy5zZWxlY3RlZCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSByZXNldEVtcHR5VGFibGUoKSB7XG4gICAgLy8gdGhpcyBvcGVyYXRpb24gaXMgaW1wb3J0YW50XG4gICAgLy8gZHVlIHRvIG5nIGRhdGEgYmluZGluZ1xuICAgIC8vIGVtcHR5IHRhYmxlIHRlbXBsYXRlIGhhcyBubyB0cmFuc2xhdGVkIHRleHQgZHVyaW5nIG5nT25Jbml0KClcbiAgICBpZiAodGhpcy5kYXRhVGFibGUgJiYgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXSkge1xuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc0VtcHR5VGFibGUgPVxuICAgICAgdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gdGhpcy5lbXB0eVRhYmxlICYmIHRoaXMuZW1wdHlUYWJsZS5uYXRpdmVFbGVtZW50LmlubmVySFRNTDtcbiAgICB9XG4gIH1cblxuICBwcml2YXRlIHRvZ2dsZUVycm9yKGVycj86IGFueSkge1xuICAgIGlmICh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdKSB7XG4gICAgICBjb25zdCBlbGVtZW50ID0gKHRoaXMuZXJyb3JUZW1wbGF0ZSAmJiB0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudCBhcyBIVE1MRGl2RWxlbWVudCk7XG4gICAgICBsZXQgaW5uZXJNZXNzYWdlOiBhbnk7XG4gICAgICBpZiAoZWxlbWVudCkge1xuICAgICAgICBpbm5lck1lc3NhZ2UgPSBlbGVtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdzbWFsbCcpLml0ZW0oMCk7XG4gICAgICB9XG4gICAgICBpZiAoZXJyKSB7XG4gICAgICAgIHRoaXMubGFzdEVycm9yID0gZXJyO1xuICAgICAgICBpZiAodHlwZW9mIGVyci5zdGF0dXMgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgaWYgKHRoaXMuX2Vycm9ySGFuZGxlcikge1xuICAgICAgICAgICAgLy8gYSBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IGFzc2lnbm1lbnQgb2YgcmVqZWN0aW9uIHByb3BlcnR5XG4gICAgICAgICAgICAvLyBmb2xsb3dpbmcgQHVuaXZlcnNpcy9jb21tb24jRXJyb3JzSGFuZGxlci5oYW5kbGVFcnJvciBjb250cmFjdFxuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihlcnIsIHtcbiAgICAgICAgICAgICAgcmVqZWN0aW9uOiB7XG4gICAgICAgICAgICAgICAgc3RhdHVzOiBlcnIuc3RhdHVzLFxuICAgICAgICAgICAgICAgIHN0YXR1c1RleHQ6IGVyci5zdGF0dXNUZXh0XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy5fZXJyb3JIYW5kbGVyLmhhbmRsZUVycm9yKGVycik7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmIChpbm5lck1lc3NhZ2UpIHtcbiAgICAgICAgICBpbm5lck1lc3NhZ2UuaW5uZXJIVE1MID0gZXJyLmVycm9yICYmIGVyci5lcnJvci5tZXNzYWdlID8gZXJyLmVycm9yLm1lc3NhZ2UgOiBlcnIubWVzc2FnZTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLm9MYW5ndWFnZS5zRW1wdHlUYWJsZSA9XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNaZXJvUmVjb3JkcyA9IHRoaXMuZXJyb3JUZW1wbGF0ZSAmJiB0aGlzLmVycm9yVGVtcGxhdGUubmF0aXZlRWxlbWVudC5pbm5lckhUTUw7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBpZiAoaW5uZXJNZXNzYWdlKSB7XG4gICAgICAgICAgaW5uZXJNZXNzYWdlLmlubmVySFRNTCA9ICcnO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHJpdmF0ZSBjbGVhckVtcHR5VGFibGUoKSB7XG4gICAgaWYgKHRoaXMuZGF0YVRhYmxlICYmIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0pIHtcbiAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbnRleHRbMF0ub0xhbmd1YWdlLnNFbXB0eVRhYmxlID0gdGhpcy5kYXRhVGFibGUuY29udGV4dFswXS5vTGFuZ3VhZ2Uuc1plcm9SZWNvcmRzID0gJyc7XG4gICAgfVxuICB9XG5cbiAgcHVibGljIGV4cG9ydCgpIHtcbiAgICBjb25zdCBlbGVtZW50OiBIVE1MRWxlbWVudCA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoJy5kdC1idXR0b25zIC5idXR0b25zLWV4Y2VsJykgYXMgSFRNTEVsZW1lbnQ7XG4gICAgZWxlbWVudC5jbGljaygpO1xuICB9XG5cbiAgcHVibGljIGhhbmRsZUNvbHVtbnMoY29sdW1uc1RvU2hvdykge1xuICAgIGNvbnN0IHRhYmxlID0gdGhpcy5kYXRhVGFibGU7XG4gICAgdGhpcy5jb25maWcuY29sdW1ucy5zbGljZSgxKS5mb3JFYWNoKChjb2x1bW4sIGkpID0+IHtcbiAgICAgIGlmICghY29sdW1uLmhpZGRlbikge1xuICAgICAgICBpZiAoY29sdW1uc1RvU2hvdy5pbmNsdWRlcyhjb2x1bW4ubmFtZSkpIHtcbiAgICAgICAgICAvLyBub2luc3BlY3Rpb24gVHlwZVNjcmlwdFZhbGlkYXRlSlNUeXBlc1xuICAgICAgICAgIHRhYmxlLmNvbHVtbihjb2x1bW4ubmFtZSArICc6bmFtZScpLnZpc2libGUodHJ1ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgLy8gbm9pbnNwZWN0aW9uIFR5cGVTY3JpcHRWYWxpZGF0ZUpTVHlwZXNcbiAgICAgICAgICB0YWJsZS5jb2x1bW4oY29sdW1uLm5hbWUgKyAnOm5hbWUnKS52aXNpYmxlKGZhbHNlKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0pO1xuICB9XG5cbiAgcHVibGljIGdldENvbmZpZygpIHtcbiAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gIH1cblxuICBwdWJsaWMgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgIGlmIChPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoY2hhbmdlcywgJ2NvbmZpZ1NyYycpKSB7XG4gICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMgIT0gbnVsbCkge1xuICAgICAgICAvLyBsb2FkIHRhYmxlIGNvbmZpZ3VyYXRpb24gb24gY2hhbmdlXG4gICAgICAgIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTogdHJpcGxlLWVxdWFsc1xuICAgICAgICBpZiAoY2hhbmdlcy5jb25maWdTcmMuY3VycmVudFZhbHVlICYmIChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUgIT0gY2hhbmdlcy5jb25maWdTcmMucHJldmlvdXNWYWx1ZSkpIHtcbiAgICAgICAgICB0aGlzLl9odHRwLmdldChjaGFuZ2VzLmNvbmZpZ1NyYy5jdXJyZW50VmFsdWUpLnRvUHJvbWlzZSgpLnRoZW4oKGNvbmZpZzogVGFibGVDb25maWd1cmF0aW9uKSA9PiB7XG4gICAgICAgICAgICAvLyBzZXQgY29uZmlndXJhdGlvblxuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIC8vIGZldGNoIGFuZCByZWRyYXdcbiAgICAgICAgICAgIHRoaXMuZmV0Y2goKTtcbiAgICAgICAgICB9KS5jYXRjaCgoZXJyKSA9PiB7XG4gICAgICAgICAgICBjb25zb2xlLmVycm9yKCdUQUJMRVMnLCAnQW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgbG9hZGluZyB0YWJsZSBjb25maWd1cmF0aW9uLicpO1xuICAgICAgICAgICAgY29uc29sZS5lcnJvcihlcnIpO1xuICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcHVibGljIHJlc2V0KGxvYWQ/OiBib29sZWFuKTogdm9pZCB7XG4gICAgdGhpcy5xdWVyeSA9IHVuZGVmaW5lZDtcbiAgICB0aGlzLmRlc3Ryb3koKTtcbiAgICB0aGlzLmF1dG9Mb2FkID0gISFsb2FkO1xuICAgIHRoaXMubmdPbkluaXQoKTtcbiAgfVxuXG4gIHNlbGVjdENvbHVtbnMoKSB7XG4gICAgLy8gZ2V0IGNvbHVtbiBvcmRlciBlLmcuIFswLCA0LCAxLCAyLCAzXVxuICAgIGNvbnN0IGNvbHVtbk9yZGVyOiBudW1iZXJbXSA9IHRoaXMuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoKTtcbiAgICAvLyBnZXQgY29sdW1uIGRlZmluaXRpb25zXG4gICAgY29uc3QgY29sdW1uRGVmcyA9IHRoaXMuZGF0YVRhYmxlLnNldHRpbmdzKCkuaW5pdCgpLmNvbHVtbnM7XG4gICAgY29uc3QgY29sdW1ucyA9IGNvbHVtbkRlZnMubWFwKChcbiAgICAgIGNvbHVtbkRlZjogeyBrZXk6IHN0cmluZywgdGl0bGU6IHN0cmluZyB8IHVuZGVmaW5lZCwgdmlzaWJsZTogYm9vbGVhbixcbiAgICAgICAgc29ydGFibGU6IGJvb2xlYW4sIGluZGV4OiBudW1iZXIgfSwgaTogbnVtYmVyKSA9PiB7XG4gICAgICBjb25zdCBrZXkgPSBgY29sdW1uLSR7aX1gO1xuICAgICAgbGV0IHRpdGxlID0gY29sdW1uRGVmLnRpdGxlO1xuICAgICAgLy8gZ2V0IGNvbHVtbiBpbmRleFxuICAgICAgY29uc3QgaW5kZXggPSAgY29sdW1uT3JkZXIuaW5kZXhPZihpKTtcbiAgICAgIGNvbnN0IHZpc2libGUgPSB0aGlzLmRhdGFUYWJsZS5jb2x1bW4oaW5kZXgpLnZpc2libGUoKTtcbiAgICAgIC8vIHNldCB0aXRsZSBmb3Igc2VsZWN0IGNvbHVtblxuICAgICAgaWYgKGkgPT09IDAgJiYgdGhpcy5zZWxlY3RhYmxlKSB7XG4gICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuU2VsZWN0Q29sdW1uJykgKyAnPic7XG4gICAgICB9XG4gICAgICAvLyBnZXQgY29sdW1uIHRpdGxlXG4gICAgICBpZiAodGl0bGUgIT0gbnVsbCAmJiB0aXRsZS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgdGl0bGUgPSB1bmRlZmluZWQ7XG4gICAgICB9XG4gICAgICBpZiAodGl0bGUgPT0gbnVsbCkge1xuICAgICAgICAvLyB0cnkgdG8gZmluZCBjb2x1bW4gcGxhY2Vob2xkZXJcbiAgICAgICAgbGV0IHBsYWNlaG9sZGVyOiBzdHJpbmcgfCB1bmRlZmluZWQ7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGFibGUpIHtcbiAgICAgICAgICBpZiAoaSA+IDApIHtcbiAgICAgICAgICAgIHBsYWNlaG9sZGVyID0gdGhpcy5jb25maWcuY29sdW1uc1tpIC0gMV0ucGxhY2Vob2xkZXI7XG4gICAgICAgICAgfVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHBsYWNlaG9sZGVyID0gdGhpcy5jb25maWcuY29sdW1uc1tpXS5wbGFjZWhvbGRlcjtcbiAgICAgICAgfVxuICAgICAgICBpZiAocGxhY2Vob2xkZXIgIT0gbnVsbCkge1xuICAgICAgICAgIHRpdGxlID0gJzwnICsgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHBsYWNlaG9sZGVyKSArICc+JztcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKHRpdGxlID09IG51bGwpIHtcbiAgICAgICAgdGl0bGUgPSAnPCcgKyB0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5Vbmtub3duQ29sdW1uJykgKyAnPic7XG4gICAgICB9XG4gICAgICByZXR1cm4ge1xuICAgICAgICBrZXksXG4gICAgICAgIHRpdGxlLFxuICAgICAgICB2aXNpYmxlLFxuICAgICAgICBpbmRleFxuICAgICAgfTtcbiAgICB9KTtcbiAgICB0aGlzLl9jb2x1bW5TZWxlY3Rvci5zZWxlY3RDb2x1bW5zKGNvbHVtbnMpLnRoZW4oKGV2ZW50KSA9PiB7XG4gICAgICBpZiAoZXZlbnQucmVzdWx0ID09PSAnb2snKSB7XG4gICAgICAgIGNvbnN0IHNvcnRlZCA9IChldmVudC5jb2x1bW5zIGFzIGFueVtdKVxuICAgICAgICAgIC5tYXAoKGNvbCkgPT4ge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAga2V5OiBjb2wua2V5LFxuICAgICAgICAgICAgICBpbmRleDogY29sLmluZGV4XG4gICAgICAgICAgICB9O1xuICAgICAgICAgIH0pXG4gICAgICAgICAgLnNvcnQoKGEsIGIpID0+IGEuaW5kZXggLSBiLmluZGV4KTtcbiAgICAgICAgLy8gZ2V0IGNvbHVtbiBvcmRlciBlLmcuIFszLCAxLCAyLCAwLCA0XVxuICAgICAgICBjb25zdCBpbmRleGVzID0gc29ydGVkXG4gICAgICAgIC5tYXAoKGl0ZW0pID0+IHtcbiAgICAgICAgICByZXR1cm4gKGV2ZW50LmNvbHVtbnMgYXMgYW55W10pLmZpbmRJbmRleCgobmV4dCkgPT4gaXRlbS5rZXkgPT09IG5leHQua2V5KTtcbiAgICAgICAgfSk7XG4gICAgICAgIC8vIHJlc2V0IGNvbHVtbiB2aXNpYmlsdHlcbiAgICAgICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IChldmVudC5jb2x1bW5zIGFzIGFueVtdKS5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgICBjb25zdCBlbGVtZW50ID0gKGV2ZW50LmNvbHVtbnMgYXMgYW55W10pW2luZGV4XTtcbiAgICAgICAgICBjb25zdCBjb2xJbmRleCA9IGNvbHVtbk9yZGVyLmluZGV4T2YoaW5kZXgpO1xuICAgICAgICAgIC8vIHNldCB2aXNpYmlsdHkgd2l0aCByZWRyYXcgKD10cnVlKVxuICAgICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbHVtbihjb2xJbmRleCkudmlzaWJsZShlbGVtZW50LnZpc2libGUsIHRydWUpO1xuICAgICAgICB9XG4gICAgICAgIC8vIGZpbmFsbHkgYXBwbHkgY29sdW1uIG9yZGVyXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmNvbFJlb3JkZXIub3JkZXIoaW5kZXhlcywgdHJ1ZSk7XG4gICAgICAgIC8vIHNpbXBseSByZWRyYXcgdGhlIHRhYmxlXG4gICAgICAgIHRoaXMuZGF0YVRhYmxlLmRyYXcoKTtcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8qKlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyB0byBwYXNzIGFuIGVycm9ySGFuZGxlciBjYWxsYmFjaywgaWYgZGVzaXJlZFxuICAgKiBAcmV0dXJucyB2b2lkXG4gICAqL1xuICBwdWJsaWMgYXN5bmMgZXhwb3J0VmlldyhvcHRpb25zPzoge2Vycm9ySGFuZGxlcj86IChyZWFzb24/OiBhbnkpID0+IGFueX0pOiBQcm9taXNlPHZvaWQ+IHtcbiAgICB0cnkge1xuICAgICAgdGhpcy5fbG9hZGluZy5zaG93TG9hZGluZygpO1xuICAgICAgLy8gdmFsaWRhdGUgcXVlcnkgaXRlbXMgYW5kIGNvbmZpZ1xuICAgICAgaWYgKCEodGhpcy5sYXN0UXVlcnkgJiYgdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcyAmJiB0aGlzLmNvbmZpZykpIHtcbiAgICAgICAgLy8gZG8gbm90aGluZ1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBnZXQgZXhwb3J0IHNldHRpbmdzXG4gICAgICBjb25zdCBleHBvcnRTZXR0aW5ncyA9IHRoaXMuX2NvbmZpZ3VyYXRpb24uc2V0dGluZ3MgYXMgRXhwb3J0TGltaXRDb25maWd1cmF0aW9uO1xuICAgICAgLy8gYW5kIGV4cG9ydCBsaW1pdFxuICAgICAgY29uc3QgZXhwb3J0TGltaXQgPVxuICAgICAgICAoZXhwb3J0U2V0dGluZ3MgJiYgZXhwb3J0U2V0dGluZ3MudGFibGVzICYmIGV4cG9ydFNldHRpbmdzLnRhYmxlcy5leHBvcnRMaW1pdCAmJiBleHBvcnRTZXR0aW5ncy50YWJsZXMuZXhwb3J0TGltaXQgPiAwKVxuICAgICAgICA/IGV4cG9ydFNldHRpbmdzLnRhYmxlcy5leHBvcnRMaW1pdCA6IE1BWF9FWFBPUlRfSVRFTVM7XG4gICAgICAvLyBhbmQgdmFsaWRhdGUgaXRcbiAgICAgIGlmICh0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zID4gZXhwb3J0TGltaXQpIHtcbiAgICAgICAgLy8gY2FsbCBlcnJvciBoYW5kbGVyXG4gICAgICAgIC8vIHByb3ZpZGUgYSByZWNvZ25pemlibGUgZXJyb3IgdHlwZVxuICAgICAgICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLmVycm9ySGFuZGxlcikge1xuICAgICAgICAgIG9wdGlvbnMuZXJyb3JIYW5kbGVyKG5ldyBFeHBvcnRMaW1pdEV4Y2VlZGVkRXJyb3IoJ0V4cG9ydCBsaW1pdCBleGNlZWRlZCcpKTtcbiAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgLy8gb3Igc2hvdyB3YXJuaW5nIG1vZGFsIGFuZCBleGl0XG4gICAgICAgIHRoaXMuX21vZGFsU2VydmljZS5zaG93V2FybmluZ0RpYWxvZyh0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQoJ1RhYmxlcy5FeHBvcnRMaXN0JyksXG4gICAgICAgICAgdGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KCdUYWJsZXMuRXhwb3J0TGltaXRFeGNlZWRlZCcsXG4gICAgICAgICAgICB7ZGF0YUxlbmd0aDogdGhpcy5fbGFzdFF1ZXJ5VG90YWxJdGVtcywgZXhwb3J0TGltaXR9KSwgRElBTE9HX0JVVFRPTlMuT2spO1xuICAgICAgICByZXR1cm47XG4gICAgICB9XG4gICAgICAvLyBnZXQgdG90YWwgZGlzcGxheWVkIGl0ZW1zXG4gICAgICBjb25zdCB0b3RhbERpc3BsYXllZEl0ZW1zID0gQXJyYXkuZnJvbSh0aGlzLmRhdGFUYWJsZS5jb250ZXh0WzBdLmFpRGlzcGxheSkubGVuZ3RoO1xuICAgICAgLy8gaWYgdGhleSBhbHJlYWR5IHNhdGlzZnkgdGhlIGxhc3QgcXVlcnkgdG90YWxcbiAgICAgIGlmICh0b3RhbERpc3BsYXllZEl0ZW1zID09PSB0aGlzLl9sYXN0UXVlcnlUb3RhbEl0ZW1zKSB7XG4gICAgICAgIC8vIHByZXBhcmUgZXhjZWwgZGF0YSBpbW1lZGlhdGVseVxuICAgICAgICBjb25zdCB7Ym9keSwgaGVhZGVyfSA9IHRoaXMuZ2V0RXhwb3J0YWJsZURhdGEoKTtcbiAgICAgICAgLy8gYW5kIGV4cG9ydCB0aGVtIHRvIGV4Y2VsXG4gICAgICAgIHRoaXMuX2V4cG9ydFNwcmVhZHNoZWV0LmV4cG9ydChib2R5LCBgJHt0aGlzLl90cmFuc2xhdGVTZXJ2aWNlLmluc3RhbnQodGhpcy5jb25maWcudGl0bGUgfHwgJ1RhYmxlcy5FeHBvcnRSZXN1bHRzJyl9Lnhsc3hgLCB7XG4gICAgICAgICAgICBoZWFkZXIsXG4gICAgICAgICAgICBza2lwSGVhZGVyOiBmYWxzZVxuICAgICAgICB9KTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGF0IHRoaXMgcG9pbnQsIG1vcmUgZGF0YSBuZWVkIHRvIGJlIGZldGNoZWRcbiAgICAgICAgLy8gaG9sZCBwcmV2aW91cyBkYXRhIHN0YXRlXG4gICAgICAgIGNvbnN0IHByZXZpb3VzRGF0YVN0YXRlID0gdGhpcy5kYXRhVGFibGUucm93cygpLmRhdGEoKS50b0FycmF5KCk7XG4gICAgICAgIC8vIGdldCB0YXJnZXQgZGF0YSBzdGF0ZSBieSBleGVjdXRpbmcgdGhlIGxhc3QgcXVlcnlcbiAgICAgICAgLy8gbm90ZTogdGFraW5nIHRoZSBleHBvcnRMaW1pdCBhbW91bnQgb2YgaXRlbXMgd2lsbCBhbHdheXMgc2F0aXNmeSB0aGUgcmVzdWx0cyxcbiAgICAgICAgLy8gYmVjYXVzZSBpdCBoYXMgYmVlbiB2YWxpZGF0ZWRcbiAgICAgICAgY29uc3QgdGFyZ2V0RGF0YVN0YXRlID0gYXdhaXQgdGhpcy5sYXN0UXVlcnkudGFrZShleHBvcnRMaW1pdCkuc2tpcCgwKS5nZXRJdGVtcygpO1xuICAgICAgICAvLyBjaGFuZ2UgdGFibGUgZGF0YSBvbiB0aGUgZmx5LCBidXQgZG8gbm90IHJlZHJhd1xuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpLnJvd3MuYWRkKHRhcmdldERhdGFTdGF0ZSk7XG4gICAgICAgIC8vIHByZXBhcmUgZXhjZWwgZGF0YVxuICAgICAgICBjb25zdCB7Ym9keSwgaGVhZGVyfSA9IHRoaXMuZ2V0RXhwb3J0YWJsZURhdGEoKTtcbiAgICAgICAgLy8gcmVzZXQgdGFibGUgZGF0YVxuICAgICAgICB0aGlzLmRhdGFUYWJsZS5jbGVhcigpLnJvd3MuYWRkKHByZXZpb3VzRGF0YVN0YXRlKTtcbiAgICAgICAgLy8gYW5kIGV4cG9ydCB0YXJnZXQgZGF0YSB0byBleGNlbFxuICAgICAgICB0aGlzLl9leHBvcnRTcHJlYWRzaGVldC5leHBvcnQoYm9keSwgYCR7dGhpcy5fdHJhbnNsYXRlU2VydmljZS5pbnN0YW50KHRoaXMuY29uZmlnLnRpdGxlIHx8ICdUYWJsZXMuRXhwb3J0UmVzdWx0cycpfS54bHN4YCwge1xuICAgICAgICAgICAgaGVhZGVyLFxuICAgICAgICAgICAgc2tpcEhlYWRlcjogZmFsc2VcbiAgICAgICAgfSk7XG4gICAgICB9XG4gICAgICAvLyBleGl0XG4gICAgICByZXR1cm47XG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICAvLyBsb2cgZXJyb3JcbiAgICAgIGNvbnNvbGUuZXJyb3IoZXJyKTtcbiAgICAgIC8vIGNhbGwgZXJyb3IgaGFuZGxlciwgaWYgZGVmaW5lZFxuICAgICAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5lcnJvckhhbmRsZXIpIHtcbiAgICAgICAgb3B0aW9ucy5lcnJvckhhbmRsZXIoZXJyKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIHVzZSBkZWZhdWx0IGVycm9yIHNlcnZpY2VcbiAgICAgICAgdGhpcy5fZXJyb3JTZXJ2aWNlLnNob3dFcnJvcihlcnIsIHtcbiAgICAgICAgICBjb250aW51ZUxpbms6ICcuJ1xuICAgICAgICB9KTtcbiAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgdGhpcy5fbG9hZGluZy5oaWRlTG9hZGluZygpO1xuICAgIH1cbiAgfVxuXG4gIHB1YmxpYyBnZXRFeHBvcnRhYmxlRGF0YSgpOiB7Ym9keTogYW55W10sIGhlYWRlcjogYW55W119IHtcbiAgICBpZiAoISh0aGlzLmRhdGFUYWJsZSAmJiB0aGlzLmRhdGFUYWJsZS5idXR0b25zXG4gICAgICAmJiB0eXBlb2YgdGhpcy5kYXRhVGFibGUuYnV0dG9ucy5leHBvcnREYXRhID09PSAnZnVuY3Rpb24nICYmIHRoaXMuY29uZmlnKSkge1xuICAgICAgcmV0dXJuIHtib2R5OiBbXSwgaGVhZGVyOiBbXX07XG4gICAgfVxuICAgIC8vIGZldGNoIGV4cG9ydGFibGUgZXhjZWwgZGF0YVxuICAgIGxldCB7Ym9keSwgaGVhZGVyfSA9IHRoaXMuZGF0YVRhYmxlLmJ1dHRvbnMuZXhwb3J0RGF0YSgpO1xuICAgIGNvbnN0IGNsZWFudXBJbmRleGVzOiBudW1iZXJbXSA9IFtdO1xuICAgIC8vIGNsZWFuIHVwIGhlYWRlcnNcbiAgICBoZWFkZXIgPSBoZWFkZXIuZmlsdGVyKChoZWFkZXJJdGVtOiBzdHJpbmcsIGluZGV4OiBudW1iZXIpID0+IHtcbiAgICAgIC8vIGV4Y2x1ZGUgZW1wdHkgaGVhZGVyc1xuICAgICAgaWYgKGhlYWRlckl0ZW0udHJpbSgpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBjbGVhbnVwSW5kZXhlcy5wdXNoKGluZGV4KTtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgfVxuICAgICAgLy8gZXhjbHVkZSBoaWRkZW4gY29sdW1uc1xuICAgICAgLy8gbm90ZTogdXNlIHRoZSBkYXRhdGFibGUgdmlzaWJsZSgpIGZ1bmN0aW9uXG4gICAgICAvLyBpbnN0ZWFkIG9mIHRoZSBoaWRkZW4gY29uZmlnIHByb3BlcnR5LCB0byBzYXRpc2Z5IHRoZSBjb2x1bW4gc2VsZWN0b3JcbiAgICAgIGlmICghdGhpcy5kYXRhVGFibGUuY29sdW1uKGluZGV4KS52aXNpYmxlKCkpIHtcbiAgICAgICAgY2xlYW51cEluZGV4ZXMucHVzaChpbmRleCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH0pO1xuICAgIC8vIGNsZWFuIHVwIGJvZHlcbiAgICBib2R5ID0gYm9keS5tYXAoKHJvdzogYW55IFtdKSA9PiB7XG4gICAgICByZXR1cm4gcm93LmZpbHRlcigoXywgcm93SW5kZXg6IG51bWJlcikgPT4ge1xuICAgICAgICByZXR1cm4gY2xlYW51cEluZGV4ZXMuaW5kZXhPZihyb3dJbmRleCkgPT09IC0xO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgcmV0dXJuIHtib2R5LCBoZWFkZXJ9O1xuICB9XG59XG5cbi8vIGNvbnN0IGVuZFJlbmRlciA9IGZ1bmN0aW9uIChyb3dzLCBncm91cCkgeyB2YXIgY291bnQgPSByb3dzLmRhdGEoKTsgcm93cy5jb3VudCgpO1xuLy8gICByZXR1cm4gKGA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJvd0dyb3VwVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBkYXRhOiAke2dyb3VwfSB9XCI+PC9uZy1jb250YWluZXI+YCk7IH07XG4vLyA8bmctY29udGFpbmVyIFtuZ1RlbXBsYXRlT3V0bGV0XT1cInJvd0dyb3VwVGVtcGxhdGVcIiBbbmdUZW1wbGF0ZU91dGxldENvbnRleHRdPVwieyBkYXRhOiAgfVwiPjwvbmctY29udGFpbmVyPlxuLy8gcmV0dXJuICgnPHNwYW4gYWxpZ249XCJsZWZ0XCJcIj48c3Ryb25nPicrIGdyb3VwICsgJyAnICsgYCgke3RvdGFsSGVhZGVyfSBgICArIGNvdW50Lmxlbmd0aCArICcpPC9zdHJvbmc+PC9zcGFuPicpOyB9O1xuIl19