@colijnit/transaction 255.1.45 → 255.1.47

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 (63) hide show
  1. package/bundles/colijnit-transaction.umd.js +595 -240
  2. package/bundles/colijnit-transaction.umd.js.map +1 -1
  3. package/colijnit-transaction.metadata.json +1 -1
  4. package/esm2015/lib/component/avatar/avatar.component.js +8 -3
  5. package/esm2015/lib/component/checkout/checkout-overview-delivery-edit/checkout-overview-delivery-edit.component.js +10 -1
  6. package/esm2015/lib/component/checkout/checkout.module.js +6 -2
  7. package/esm2015/lib/component/delivery-planning/service/delivery-planning.service.js +99 -33
  8. package/esm2015/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-popup/delivery-planning-overview-popup.component.js +39 -25
  9. package/esm2015/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-overview-short-line/delivery-planning-overview-short-line.component.js +4 -4
  10. package/esm2015/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-overview-tile-line/delivery-planning-overview-tile-line.component.js +29 -11
  11. package/esm2015/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-tile-status/delivery-planning-tile-status.component.js +67 -16
  12. package/esm2015/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/delivery-planning-overview-tile.component.js +39 -17
  13. package/esm2015/lib/component/delivery-planning-main/component/delivery-planning-overview/delivery-planning-overview.component.js +56 -30
  14. package/esm2015/lib/component/delivery-planning-main/delivery-planning-main.component.js +59 -46
  15. package/esm2015/lib/component/transaction-card/transaction-card-planning/transaction-card-planning.component.js +18 -3
  16. package/esm2015/lib/component/transaction-card/transaction-card-purchase-confirmation/transaction-card-purchase-confirmation.component.js +101 -96
  17. package/esm2015/lib/component/transaction-cash-register-dialog/transaction-cash-register-dialog.component.js +4 -4
  18. package/esm2015/lib/component/transaction-header/transaction-header/transaction-header.component.js +13 -11
  19. package/esm2015/lib/component/transaction-header/transaction-header-delivery/transaction-header-delivery.component.js +2 -3
  20. package/esm2015/lib/component/transaction-header/transaction-header-popup/transaction-header-popup-order.component.js +7 -2
  21. package/esm2015/lib/component/transaction-internal/transaction-internal.component.js +3 -8
  22. package/esm2015/lib/component/transaction-line/transaction-planning-line/transaction-planning-line.component.js +10 -4
  23. package/esm2015/lib/component/transaction-lines-side-panel/transaction-lines-side-panel-service-order/transaction-lines-side-panel-service-order.component.js +6 -4
  24. package/esm2015/lib/component/transaction-lines-side-panel/transaction-lines-side-panel-service-order/transaction-lines-side-panel-service-order.module.js +4 -3
  25. package/esm2015/lib/component/transaction-quick-access/transaction-quick-access-planning/transaction-quick-access-planning.component.js +5 -2
  26. package/esm2015/lib/component/transaction-service-overview/components/transaction-service-message.component.js +3 -2
  27. package/esm2015/lib/component/transaction-service-overview/transaction-service-overview.component.js +29 -20
  28. package/esm2015/lib/component/transaction-service-overview/transaction-service-overview.module.js +4 -3
  29. package/esm2015/lib/enum/checkout-cfg-name.enum.js +3 -1
  30. package/esm2015/lib/enum/delivery-planning-update-actions.enum.js +8 -0
  31. package/esm2015/lib/enum/transaction-cfg-name.enum.js +12 -1
  32. package/esm2015/lib/service/transaction-connector-adapter.service.js +12 -1
  33. package/esm2015/lib/service/transaction-connector.service.js +6 -1
  34. package/esm2015/lib/service/transaction-payment.service.js +3 -3
  35. package/esm2015/lib/transaction-version.js +3 -3
  36. package/fesm2015/colijnit-transaction.js +622 -322
  37. package/fesm2015/colijnit-transaction.js.map +1 -1
  38. package/lib/component/delivery-planning/service/delivery-planning.service.d.ts +11 -7
  39. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-popup/delivery-planning-overview-popup.component.d.ts +10 -7
  40. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-overview-short-line/delivery-planning-overview-short-line.component.d.ts +1 -1
  41. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-overview-tile-line/delivery-planning-overview-tile-line.component.d.ts +9 -2
  42. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-overview-tile-line/style/_layout.scss +6 -0
  43. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-tile-status/delivery-planning-tile-status.component.d.ts +18 -7
  44. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/component/delivery-planning-tile-status/style/_layout.scss +12 -0
  45. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/delivery-planning-overview-tile.component.d.ts +20 -5
  46. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/style/_layout.scss +2 -2
  47. package/lib/component/delivery-planning-main/component/delivery-planning-overview/component/delivery-planning-overview-tile/style/_material-definition.scss +1 -1
  48. package/lib/component/delivery-planning-main/component/delivery-planning-overview/delivery-planning-overview.component.d.ts +23 -10
  49. package/lib/component/delivery-planning-main/delivery-planning-main.component.d.ts +14 -7
  50. package/lib/component/transaction-card/transaction-card/style/_layout.scss +14 -1
  51. package/lib/component/transaction-card/transaction-card-planning/transaction-card-planning.component.d.ts +2 -0
  52. package/lib/component/transaction-header/transaction-header/style/_layout.scss +4 -0
  53. package/lib/component/transaction-line/transaction-planning-line/transaction-planning-line.component.d.ts +3 -2
  54. package/lib/component/transaction-lines-side-panel/transaction-lines-side-panel-service-order/transaction-lines-side-panel-service-order.component.d.ts +2 -0
  55. package/lib/component/transaction-quick-access/transaction-quick-access-planning/transaction-quick-access-planning.component.d.ts +1 -0
  56. package/lib/component/transaction-quick-access/transaction-quick-access-send-method-base.component.d.ts +1 -1
  57. package/lib/component/transaction-service-overview/style/_layout.scss +14 -6
  58. package/lib/enum/checkout-cfg-name.enum.d.ts +2 -0
  59. package/lib/enum/delivery-planning-update-actions.enum.d.ts +6 -0
  60. package/lib/enum/transaction-cfg-name.enum.d.ts +12 -1
  61. package/lib/service/transaction-connector-adapter.service.d.ts +1 -0
  62. package/lib/service/transaction-connector.service.d.ts +1 -0
  63. package/package.json +2 -2
@@ -14,6 +14,7 @@ import { DeliveryPlanningOverviewTileComponent } from "./component/delivery-plan
14
14
  import { IconCacheService } from "../../../../service/icon-cache.service";
15
15
  import { Icon } from "../../../../enum/icon.enum";
16
16
  import { DeliveryPlanningTileModes } from "../../../../enum/delivery-planning-tile-modes.enum";
17
+ import { DeliveryPlanningUpdateActions } from "../../../../enum/delivery-planning-update-actions.enum";
17
18
  export class DeliveryPlanningOverviewComponent {
18
19
  constructor(_deliveryPlanningService, _transaction, _transactionCon, _dialog, _changeDetector, iconCacheService) {
19
20
  this._deliveryPlanningService = _deliveryPlanningService;
@@ -23,6 +24,7 @@ export class DeliveryPlanningOverviewComponent {
23
24
  this._changeDetector = _changeDetector;
24
25
  this.iconCacheService = iconCacheService;
25
26
  this.icons = Icon;
27
+ this.planningActions = DeliveryPlanningUpdateActions;
26
28
  this.tileModes = DeliveryPlanningTileModes;
27
29
  this.deliveryPlanningViewModes = DeliveryPlanningViewModes;
28
30
  this.availability = [];
@@ -34,7 +36,6 @@ export class DeliveryPlanningOverviewComponent {
34
36
  this.updatePlanningTransportEvent = new EventEmitter();
35
37
  this.resetPlanningTransportEvent = new EventEmitter();
36
38
  this.tileSize = 300; //one tile should have this width
37
- this.date = new Date();
38
39
  this.available = false;
39
40
  this.showNoteDialog = false;
40
41
  this.showSettingsDialog = false;
@@ -47,13 +48,8 @@ export class DeliveryPlanningOverviewComponent {
47
48
  this.planningPopupRef = value;
48
49
  }
49
50
  ;
50
- get planTransportWeek() {
51
- if (this._deliveryPlanningService.planTransportWeek.length) {
52
- return this._deliveryPlanningService.planTransportWeek;
53
- }
54
- else {
55
- return [];
56
- }
51
+ get planTransportWeekArr() {
52
+ return this._deliveryPlanningService.planTransportWeekArr;
57
53
  }
58
54
  get currentTileMode() {
59
55
  return this._deliveryPlanningService.currentTileMode;
@@ -61,6 +57,9 @@ export class DeliveryPlanningOverviewComponent {
61
57
  set currentTileMode(tileMode) {
62
58
  this._deliveryPlanningService.currentTileMode = tileMode;
63
59
  }
60
+ currentDate() {
61
+ return this._deliveryPlanningService.currentStartDate;
62
+ }
64
63
  //calculating upon loading
65
64
  ngAfterViewChecked() {
66
65
  this.setColNum();
@@ -104,15 +103,11 @@ export class DeliveryPlanningOverviewComponent {
104
103
  }
105
104
  }
106
105
  setColNum() {
107
- var _a, _b;
108
106
  if (this._deliveryPlanningService.viewMode === DeliveryPlanningViewModes.Sidebar) {
109
107
  this.columnNum = 1;
110
108
  }
111
109
  else {
112
- let width = (_b = (_a = this.rowContainer) === null || _a === void 0 ? void 0 : _a.nativeElement) === null || _b === void 0 ? void 0 : _b.offsetWidth;
113
- if (width) {
114
- this.columnNum = Math.trunc(width / this.tileSize);
115
- }
110
+ this.columnNum = 3;
116
111
  }
117
112
  }
118
113
  dragEnd(ev) {
@@ -136,18 +131,15 @@ export class DeliveryPlanningOverviewComponent {
136
131
  }
137
132
  handleDeleteOrder(deleteResult, planningTransportWeek) {
138
133
  return __awaiter(this, void 0, void 0, function* () {
134
+ let oldWeek = planningTransportWeek;
139
135
  let order = deleteResult[0];
140
136
  if (order) {
141
137
  yield this.getTransportOrders(deleteResult[0], deleteResult[1]);
142
138
  yield this.getOrderLinesPlanned(order);
143
139
  if (deleteResult[0].lines.length > 0) {
144
- order === null || order === void 0 ? void 0 : order.lines.forEach(line => {
145
- line.planned = false;
146
- line.selected = false;
147
- });
148
- order.lines = [];
140
+ this._deliveryPlanningService.deletingOrder = order;
149
141
  deleteResult[1].plannedOrders.splice(deleteResult[1].plannedOrders.indexOf(order), 1);
150
- this.updatePlanningTransportEvent.emit(planningTransportWeek);
142
+ this.updatePlanningTransportEvent.emit({ oldWeek: oldWeek, week: planningTransportWeek, action: DeliveryPlanningUpdateActions.DeletePlannedOrder });
151
143
  }
152
144
  else {
153
145
  this._dialog.showError("NO_LINES_TO_DELETE", true);
@@ -155,6 +147,12 @@ export class DeliveryPlanningOverviewComponent {
155
147
  }
156
148
  });
157
149
  }
150
+ handleDeleteLine(deleteResult, weekDay, transportWeekRow) {
151
+ let oldWeek = transportWeekRow;
152
+ let order = weekDay.plannedOrders.find(order => order.transId === deleteResult.order.transId);
153
+ order.lines = order.lines.filter(line => line.originalLineNr !== deleteResult.line.originalLineNr);
154
+ this.updatePlanningTransportEvent.emit({ oldWeek: oldWeek, week: transportWeekRow, action: DeliveryPlanningUpdateActions.DeletePlannedLines });
155
+ }
158
156
  getOrderLinesPlanned(order) {
159
157
  return __awaiter(this, void 0, void 0, function* () {
160
158
  let request = new OrderLinesPlannedRequest();
@@ -167,6 +165,9 @@ export class DeliveryPlanningOverviewComponent {
167
165
  filterObj.beginCurrentWeek = new Date();
168
166
  filterObj.checkOrderLines = 1;
169
167
  request.filterObject = filterObj;
168
+ if (!order.lines) {
169
+ order.lines = [];
170
+ }
170
171
  order.lines.push(...yield this._transactionCon.getOrderLinesPlanned(request));
171
172
  });
172
173
  }
@@ -182,6 +183,7 @@ export class DeliveryPlanningOverviewComponent {
182
183
  }
183
184
  planOrderLines(order, transportDay, week) {
184
185
  return __awaiter(this, void 0, void 0, function* () {
186
+ let oldWeek = week;
185
187
  if (order.lines.length) {
186
188
  order.linesLoaded = true;
187
189
  order.tasks = [];
@@ -195,7 +197,7 @@ export class DeliveryPlanningOverviewComponent {
195
197
  else {
196
198
  transportDay.plannedOrders.push(order);
197
199
  }
198
- this.updatePlanningTransportEvent.emit(week);
200
+ this.updatePlanningTransportEvent.emit({ oldWeek: oldWeek, week: week, action: DeliveryPlanningUpdateActions.PlanLines });
199
201
  }
200
202
  else {
201
203
  this._dialog.showError("NO_LINES_TO_PLAN", true);
@@ -248,6 +250,11 @@ export class DeliveryPlanningOverviewComponent {
248
250
  yield this.getSequenceOrderValue(event[0]);
249
251
  yield this.getOrderLinesPlanned(event[0]);
250
252
  yield this.planOrderLines(event[0], event[1], event[2]);
253
+ if (this._deliveryPlanningService.currentTransId) {
254
+ yield this._transaction.getTransactionById(this._deliveryPlanningService.currentTransId);
255
+ yield this._transaction.saveTransaction();
256
+ yield this._transaction.checkRefTransaction();
257
+ }
251
258
  });
252
259
  }
253
260
  handleSettingsSave(changed) {
@@ -278,7 +285,11 @@ export class DeliveryPlanningOverviewComponent {
278
285
  yield this.getSequenceOrderValue(planOrder);
279
286
  yield this.getOrderLinesPlanned(planOrder);
280
287
  yield this.planOrderLines(planOrder, transportWeekDay, week);
281
- this._deliveryPlanningService.currentTransId = undefined;
288
+ if (data.data === "false" && this._deliveryPlanningService.currentTransId) {
289
+ yield this._transaction.getTransactionById(this._deliveryPlanningService.currentTransId);
290
+ yield this._transaction.saveTransaction();
291
+ yield this._transaction.checkRefTransaction();
292
+ }
282
293
  }
283
294
  });
284
295
  }
@@ -324,6 +335,17 @@ export class DeliveryPlanningOverviewComponent {
324
335
  return false;
325
336
  }
326
337
  }
338
+ handleTimeChangeEvent(transportDay, week, obj) {
339
+ let oldWeek = week;
340
+ let transNr = obj['transactionNr'];
341
+ let order = transportDay.plannedOrders.find(planOrder => planOrder.transactionNr === transNr);
342
+ order.startTime = new Date(obj['startTime']);
343
+ order.endTime = new Date(obj['endTime']);
344
+ this.updatePlanningTransportEvent.emit({ oldWeek: oldWeek, week: week, action: DeliveryPlanningUpdateActions.PlanOrder });
345
+ }
346
+ handleEditPlannedOrder(planOrder, transportDay, week) {
347
+ this.openPlanningPopup(planOrder, transportDay, week);
348
+ }
327
349
  }
328
350
  DeliveryPlanningOverviewComponent.decorators = [
329
351
  { type: Component, args: [{
@@ -338,28 +360,32 @@ DeliveryPlanningOverviewComponent.decorators = [
338
360
  <co-icon (click)="currentTileMode = tileModes.Calendar" [class.active]="currentTileMode === tileModes.Calendar" [iconData]="iconCacheService.getIcon(icons.CalendarDayRegular)"></co-icon>
339
361
  </div>
340
362
  <div class="planning-component-wrapper">
341
- <co-date-planning [view]="currentViewMode" [selectedDate]="date"
363
+ <co-date-planning [view]="currentViewMode" [selectedDate]="currentDate()"
342
364
  (rangeChange)="handleDateRangeChange($event)"></co-date-planning>
343
365
  </div>
344
- <div class="row date-planning" #rowContainer *ngFor="let transportWeekRow of planTransportWeek">
366
+
367
+ <div class="row date-planning" #rowContainer *ngFor="let transportWeekRow of planTransportWeekArr">
345
368
  <div class="column" #columnElem
346
- *ngFor="let transPortDay of filterWeekArray(weekArray(transportWeekRow)); index as i">
369
+ *ngFor="let transPortDay of filterWeekArray(transportWeekRow); index as i">
347
370
  <co-delivery-planning-overview-tile
348
371
  [class.disabled]="!transPortDay.availableOnDate || transPortDay.maxMinutes === 0 || checkAvailable(transPortDay)"
349
372
  [disabled]="!transPortDay.availableOnDate || transPortDay.maxMinutes === 0"
350
373
  (dragover)="allowDrop($event, transPortDay)"
351
- (drop)="dropped($event, transportWeekRow, transPortDay, filterWeekArray(weekArray(transportWeekRow)))"
374
+ (drop)="dropped($event, transportWeekRow, transPortDay, filterWeekArray(transportWeekRow))"
352
375
  (dragend)="dragEnd($event)"
353
-
354
376
  [transportDay]="transPortDay"
355
- (deleteLineEvent)="handleDeleteOrder($event, transportWeekRow)"
356
- (updatePlanningTransportWeek)="updatePlanningTransportEvent.emit(transportWeekRow)"
377
+ (deleteOrderEvent)="handleDeleteOrder($event, transportWeekRow)"
378
+ (timeChangeEvent)="handleTimeChangeEvent(transPortDay, transportWeekRow,$event)"
357
379
  (openSettingsDialogEvent)="openSettingsDialog($event)"
358
380
  (calendarPlanEvent)="handleCalendarPlanEvent($event, transPortDay, transportWeekRow)"
359
- ></co-delivery-planning-overview-tile>
381
+ (deleteOrderLineEvent)="handleDeleteLine($event, transPortDay, transportWeekRow)"
382
+ (editOrderEvent)="handleEditPlannedOrder($event, transPortDay, transportWeekRow)"
360
383
 
384
+ ></co-delivery-planning-overview-tile>
361
385
  </div>
362
386
  </div>
387
+
388
+
363
389
  </div>
364
390
 
365
391
 
@@ -389,4 +415,4 @@ DeliveryPlanningOverviewComponent.propDecorators = {
389
415
  showClass: [{ type: HostBinding, args: ["class.co-delivery-planning-overview",] }],
390
416
  onResize: [{ type: HostListener, args: ['window:resize', ['$event'],] }]
391
417
  };
392
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJhbnNhY3Rpb24vc3JjL2xpYi9jb21wb25lbnQvZGVsaXZlcnktcGxhbm5pbmctbWFpbi9jb21wb25lbnQvZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXcvZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSx3REFBd0QsQ0FBQztBQUNyRyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUNyRyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxtREFBbUQsQ0FBQztBQUk5RixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzRUFBc0UsQ0FBQztBQUMvRyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxnRUFBZ0UsQ0FBQztBQUNwRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0scUVBQXFFLENBQUM7QUFJN0csT0FBTyxFQUNMLHFDQUFxQyxFQUN0QyxNQUFNLHVGQUF1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Z0JBQ0QsYUFBYSxFQUFFLGlCQUFpQixDQUFDLElBQUk7YUFDdEM7OztZQTNETyx1QkFBdUI7WUFDdkIsa0JBQWtCO1lBQ2xCLDJCQUEyQjtZQU0zQixhQUFhO1lBeEJuQixpQkFBaUI7WUFnQ1gsZ0JBQWdCOzs7b0JBbURyQixZQUFZLFNBQUMscUNBQXFDOzJCQUtsRCxTQUFTLFNBQUMsY0FBYzt5QkFHeEIsU0FBUyxTQUFDLFlBQVk7cUNBR3RCLFNBQVMsU0FBQyxlQUFlO3lCQU96QixLQUFLOzBCQUdMLEtBQUs7OEJBR0wsS0FBSztzQ0FHTCxLQUFLOzJDQUdMLE1BQU07MENBR04sTUFBTTt3QkE2Q04sV0FBVyxTQUFDLHFDQUFxQzt1QkFPakQsWUFBWSxTQUFDLGVBQWUsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQWZ0ZXJWaWV3Q2hlY2tlZCxcclxuICBDaGFuZ2VEZXRlY3RvclJlZixcclxuICBDb21wb25lbnQsXHJcbiAgRXZlbnRFbWl0dGVyLFxyXG4gIEhvc3RCaW5kaW5nLFxyXG4gIEhvc3RMaXN0ZW5lcixcclxuICBJbnB1dCxcclxuICBPdXRwdXQsXHJcbiAgUXVlcnlMaXN0LFxyXG4gIFZpZXdDaGlsZCxcclxuICBWaWV3Q2hpbGRyZW4sXHJcbiAgVmlld0VuY2Fwc3VsYXRpb25cclxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xyXG5cclxuaW1wb3J0IHtDYWxlbmRhclZpZXd9IGZyb20gJ0Bjb2xpam5pdC9zaGFyZWRjb21wb25lbnRzJztcclxuaW1wb3J0IHtEZWxpdmVyeVBsYW5uaW5nQ2FsZW5kYXJNb2Rlc30gZnJvbSBcIi4uLy4uLy4uLy4uL2VudW0vZGVsaXZlcnktcGxhbm5pbmctY2FsZW5kYXItbW9kZXMuZW51bVwiO1xyXG5pbXBvcnQge0RlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXN9IGZyb20gXCIuLi8uLi8uLi8uLi9lbnVtL2RlbGl2ZXJ5LXBsYW5uaW5nLXZpZXctbW9kZXMuZW51bVwiO1xyXG5pbXBvcnQge0RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vZGVsaXZlcnktcGxhbm5pbmcvc2VydmljZS9kZWxpdmVyeS1wbGFubmluZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25TZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZS90cmFuc2FjdGlvbi5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7VHJhbnNhY3Rpb25Db25uZWN0b3JTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZS90cmFuc2FjdGlvbi1jb25uZWN0b3Iuc2VydmljZVwiO1xyXG5pbXBvcnQge1BsYW5uaW5nVHJhbnNwb3J0V2Vla30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wbGFubmluZy10cmFuc3BvcnQtd2Vlay5ib1wiO1xyXG5pbXBvcnQge1BsYW5uaW5nVHJhbnNwb3J0V2Vla0RheX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wbGFubmluZy10cmFuc3BvcnQtd2Vlay1kYXkuYm9cIjtcclxuaW1wb3J0IHtQbGFuT3JkZXJ9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcGxhbi1vcmRlci5ib1wiO1xyXG5pbXBvcnQge0dldFRyYW5zcG9ydE9yZGVyc1JlcXVlc3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvZ2V0LXRyYW5zcG9ydC1vcmRlcnMtcmVxdWVzdC5ib1wiO1xyXG5pbXBvcnQge1BsYW5uaW5nRmlsdGVyT2JqZWN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3BsYW5uaW5nLWZpbHRlci1vYmplY3QuYm9cIjtcclxuaW1wb3J0IHtEaWFsb2dTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZS9kaWFsb2cuc2VydmljZVwiO1xyXG5pbXBvcnQge09yZGVyTGluZXNQbGFubmVkUmVxdWVzdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9vcmRlci1saW5lcy1wbGFubmVkLXJlcXVlc3QuYm9cIjtcclxuaW1wb3J0IHtcclxuICBEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdQb3B1cENvbXBvbmVudFxyXG59IGZyb20gXCIuL2NvbXBvbmVudC9kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy1wb3B1cC9kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy1wb3B1cC5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtcclxuICBEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdUaWxlQ29tcG9uZW50XHJcbn0gZnJvbSBcIi4vY29tcG9uZW50L2RlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXRpbGUvZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXctdGlsZS5jb21wb25lbnRcIjtcclxuaW1wb3J0IHtJY29uQ2FjaGVTZXJ2aWNlfSBmcm9tIFwiLi4vLi4vLi4vLi4vc2VydmljZS9pY29uLWNhY2hlLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtJY29ufSBmcm9tIFwiLi4vLi4vLi4vLi4vZW51bS9pY29uLmVudW1cIjtcclxuaW1wb3J0IHtEZWxpdmVyeVBsYW5uaW5nVGlsZU1vZGVzfSBmcm9tIFwiLi4vLi4vLi4vLi4vZW51bS9kZWxpdmVyeS1wbGFubmluZy10aWxlLW1vZGVzLmVudW1cIjtcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiBcImNvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3XCIsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxjby1kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy1wb3B1cCAjcGxhbm5pbmdQb3B1cCAqbmdJZj1cInNob3dOb3RlRGlhbG9nXCIgKGNsb3NlRXZlbnQpPVwic2hvd05vdGVEaWFsb2cgPSBmYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG9uU3VjY2VlZGVkUGxhbkFjdGlvbik9XCJoYW5kbGVQb3B1cFBsYW5FdmVudCgkZXZlbnQpXCI+PC9jby1kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy1wb3B1cD5cclxuICAgIDxjby1kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy10aWxlLXNldHRpbmdzLXBvcHVwICpuZ0lmPVwic2hvd1NldHRpbmdzRGlhbG9nXCIgW3RyYW5zcG9ydERheV09XCJzZWxlY3RlZFRyYW5zcG9ydERheVwiIChhdmFpbGFiaWxpdHlDaGVja2VkKT1cImhhbmRsZUF2YWlsYWJpbGl0eUNoZWNrZWQoJGV2ZW50KVwiIChvblNhdmVBY3Rpb24pPVwiaGFuZGxlU2V0dGluZ3NTYXZlKCRldmVudClcIiAoY2xvc2VFdmVudCk9XCJzaG93U2V0dGluZ3NEaWFsb2cgPSBmYWxzZVwiPjwvY28tZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXctdGlsZS1zZXR0aW5ncy1wb3B1cD5cclxuICAgIDxkaXYgY2xhc3M9XCJkZWxpdmVyeS1vdmVydmlldy13cmFwcGVyXCIgW2NsYXNzLnNpZGViYXJdPVwiY3VycmVudFZpZXdNb2RlID09PSAnREFZU19BUk9VTkQnXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJ0aWxlLXZpZXctbW9kZXMgcm93XCI+XHJcbiAgICAgICAgPGNvLWljb24gKGNsaWNrKT1cImN1cnJlbnRUaWxlTW9kZSA9IHRpbGVNb2Rlcy5Ob3JtYWxcIiBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRUaWxlTW9kZSA9PT0gdGlsZU1vZGVzLk5vcm1hbFwiIFtpY29uRGF0YV09XCJpY29uQ2FjaGVTZXJ2aWNlLmdldEljb24oaWNvbnMuQ2FsZW5kYXJMaW5lc1JlZ3VsYXIpXCI+PC9jby1pY29uPlxyXG4gICAgICAgIDxjby1pY29uIChjbGljayk9XCJjdXJyZW50VGlsZU1vZGUgPSB0aWxlTW9kZXMuQ2FsZW5kYXJcIiBbY2xhc3MuYWN0aXZlXT1cImN1cnJlbnRUaWxlTW9kZSA9PT0gdGlsZU1vZGVzLkNhbGVuZGFyXCIgW2ljb25EYXRhXT1cImljb25DYWNoZVNlcnZpY2UuZ2V0SWNvbihpY29ucy5DYWxlbmRhckRheVJlZ3VsYXIpXCI+PC9jby1pY29uPlxyXG4gICAgICA8L2Rpdj5cclxuICAgICAgPGRpdiBjbGFzcz1cInBsYW5uaW5nLWNvbXBvbmVudC13cmFwcGVyXCI+XHJcbiAgICAgICAgPGNvLWRhdGUtcGxhbm5pbmcgW3ZpZXddPVwiY3VycmVudFZpZXdNb2RlXCIgW3NlbGVjdGVkRGF0ZV09XCJkYXRlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAocmFuZ2VDaGFuZ2UpPVwiaGFuZGxlRGF0ZVJhbmdlQ2hhbmdlKCRldmVudClcIj48L2NvLWRhdGUtcGxhbm5pbmc+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGRhdGUtcGxhbm5pbmdcIiAjcm93Q29udGFpbmVyICpuZ0Zvcj1cImxldCB0cmFuc3BvcnRXZWVrUm93IG9mIHBsYW5UcmFuc3BvcnRXZWVrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiICNjb2x1bW5FbGVtXHJcbiAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdHJhbnNQb3J0RGF5IG9mIGZpbHRlcldlZWtBcnJheSh3ZWVrQXJyYXkodHJhbnNwb3J0V2Vla1JvdykpOyBpbmRleCBhcyBpXCI+XHJcbiAgICAgICAgICA8Y28tZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXctdGlsZVxyXG4gICAgICAgICAgICBbY2xhc3MuZGlzYWJsZWRdPVwiIXRyYW5zUG9ydERheS5hdmFpbGFibGVPbkRhdGUgfHwgdHJhbnNQb3J0RGF5Lm1heE1pbnV0ZXMgPT09IDAgfHwgY2hlY2tBdmFpbGFibGUodHJhbnNQb3J0RGF5KVwiXHJcbiAgICAgICAgICAgIFtkaXNhYmxlZF09XCIhdHJhbnNQb3J0RGF5LmF2YWlsYWJsZU9uRGF0ZSB8fCB0cmFuc1BvcnREYXkubWF4TWludXRlcyA9PT0gMFwiXHJcbiAgICAgICAgICAgIChkcmFnb3Zlcik9XCJhbGxvd0Ryb3AoJGV2ZW50LCB0cmFuc1BvcnREYXkpXCJcclxuICAgICAgICAgICAgKGRyb3ApPVwiZHJvcHBlZCgkZXZlbnQsIHRyYW5zcG9ydFdlZWtSb3csIHRyYW5zUG9ydERheSwgZmlsdGVyV2Vla0FycmF5KHdlZWtBcnJheSh0cmFuc3BvcnRXZWVrUm93KSkpXCJcclxuICAgICAgICAgICAgKGRyYWdlbmQpPVwiZHJhZ0VuZCgkZXZlbnQpXCJcclxuXHJcbiAgICAgICAgICAgIFt0cmFuc3BvcnREYXldPVwidHJhbnNQb3J0RGF5XCJcclxuICAgICAgICAgICAgKGRlbGV0ZUxpbmVFdmVudCk9XCJoYW5kbGVEZWxldGVPcmRlcigkZXZlbnQsIHRyYW5zcG9ydFdlZWtSb3cpXCJcclxuICAgICAgICAgICAgKHVwZGF0ZVBsYW5uaW5nVHJhbnNwb3J0V2Vlayk9XCJ1cGRhdGVQbGFubmluZ1RyYW5zcG9ydEV2ZW50LmVtaXQodHJhbnNwb3J0V2Vla1JvdylcIlxyXG4gICAgICAgICAgICAob3BlblNldHRpbmdzRGlhbG9nRXZlbnQpPVwib3BlblNldHRpbmdzRGlhbG9nKCRldmVudClcIlxyXG4gICAgICAgICAgICAoY2FsZW5kYXJQbGFuRXZlbnQpPVwiaGFuZGxlQ2FsZW5kYXJQbGFuRXZlbnQoJGV2ZW50LCB0cmFuc1BvcnREYXksIHRyYW5zcG9ydFdlZWtSb3cpXCJcclxuICAgICAgICAgID48L2NvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXRpbGU+XHJcblxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgYCxcclxuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdDb21wb25lbnQgaW1wbGVtZW50cyBBZnRlclZpZXdDaGVja2VkIHtcclxuICBwdWJsaWMgcmVhZG9ubHkgaWNvbnM6IHR5cGVvZiBJY29uID0gSWNvbjtcclxuICBwdWJsaWMgcmVhZG9ubHkgdGlsZU1vZGVzOiB0eXBlb2YgRGVsaXZlcnlQbGFubmluZ1RpbGVNb2RlcyA9IERlbGl2ZXJ5UGxhbm5pbmdUaWxlTW9kZXM7XHJcbiAgcHVibGljIGRlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXM6IHR5cGVvZiBEZWxpdmVyeVBsYW5uaW5nVmlld01vZGVzID0gRGVsaXZlcnlQbGFubmluZ1ZpZXdNb2RlcztcclxuXHJcbiAgcHVibGljIGF2YWlsYWJpbGl0eToge3RyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCBhdmFpbGFibGU6IGJvb2xlYW59W10gPSBbXTtcclxuXHJcbiAgQFZpZXdDaGlsZHJlbihEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdUaWxlQ29tcG9uZW50KVxyXG4gIHB1YmxpYyBzZXQgdGlsZXModGlsZXM6IFF1ZXJ5TGlzdDxEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdUaWxlQ29tcG9uZW50Pikge1xyXG4gICAgdGhpcy50aWxlc1F1ZXJ5TGlzdCA9IHRpbGVzO1xyXG4gIH07XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3Jvd0NvbnRhaW5lcicpIHJvd0NvbnRhaW5lcjtcclxuXHJcblxyXG4gIEBWaWV3Q2hpbGQoJ2NvbHVtbkVsZW0nKSBjb2x1bW5FbGVtO1xyXG4gIHB1YmxpYyBjb2x1bW5OdW0gPSAzOyAvL2luaXRpYWwgY291bnRcclxuXHJcbiAgQFZpZXdDaGlsZCgncGxhbm5pbmdQb3B1cCcpXHJcbiAgcHVibGljIHNldCBwbGFubmluZ1BvcHVwQ29tcG9uZW50KHZhbHVlOiBEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdQb3B1cENvbXBvbmVudCkge1xyXG4gICAgdGhpcy5wbGFubmluZ1BvcHVwUmVmID0gdmFsdWU7XHJcbiAgfTtcclxuXHJcblxyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBwbGFuT3JkZXJzOiBQbGFuT3JkZXJbXSA9IFtdO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXJyZW50TW9kZTogRGVsaXZlcnlQbGFubmluZ0NhbGVuZGFyTW9kZXMgPSBEZWxpdmVyeVBsYW5uaW5nQ2FsZW5kYXJNb2Rlcy5XZWVrO1xyXG5cclxuICBASW5wdXQoKVxyXG4gIHB1YmxpYyBjdXJyZW50Vmlld01vZGU6IENhbGVuZGFyVmlldyA9IENhbGVuZGFyVmlldy5XZWVrVmlldztcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VycmVudFBsYW5uaW5nVmlld01vZGU6IERlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXMgPSB0aGlzLmRlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXMuRnVsbHNjcmVlbjtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHVwZGF0ZVBsYW5uaW5nVHJhbnNwb3J0RXZlbnQ6IEV2ZW50RW1pdHRlcjxQbGFubmluZ1RyYW5zcG9ydFdlZWs+ID0gbmV3IEV2ZW50RW1pdHRlcjxQbGFubmluZ1RyYW5zcG9ydFdlZWs+KCk7XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyByZXNldFBsYW5uaW5nVHJhbnNwb3J0RXZlbnQ6IEV2ZW50RW1pdHRlcjx2b2lkPiA9IG5ldyBFdmVudEVtaXR0ZXI8dm9pZD4oKTtcclxuXHJcbiAgcHVibGljIHRpbGVTaXplID0gMzAwOyAvL29uZSB0aWxlIHNob3VsZCBoYXZlIHRoaXMgd2lkdGhcclxuICBwdWJsaWMgcGxhbm5pbmdQb3B1cFJlZjogRGVsaXZlcnlQbGFubmluZ092ZXJ2aWV3UG9wdXBDb21wb25lbnQ7XHJcblxyXG4gIHB1YmxpYyBkYXRlOiBEYXRlID0gbmV3IERhdGUoKTtcclxuICBwdWJsaWMgYXZhaWxhYmxlOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dOb3RlRGlhbG9nOiBib29sZWFuID0gZmFsc2U7XHJcbiAgcHVibGljIHNob3dTZXR0aW5nc0RpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyB0aWxlc1F1ZXJ5TGlzdDogUXVlcnlMaXN0PERlbGl2ZXJ5UGxhbm5pbmdPdmVydmlld1RpbGVDb21wb25lbnQ+O1xyXG4gIHB1YmxpYyBzZWxlY3RlZFRyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5O1xyXG5cclxuICBwdWJsaWMgZ2V0IHBsYW5UcmFuc3BvcnRXZWVrKCkge1xyXG4gICAgaWYgKHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLnBsYW5UcmFuc3BvcnRXZWVrLmxlbmd0aCkge1xyXG4gICAgICByZXR1cm4gdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UucGxhblRyYW5zcG9ydFdlZWs7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gW107XHJcbiAgICB9XHJcblxyXG4gIH1cclxuXHJcbiAgcHVibGljIGdldCBjdXJyZW50VGlsZU1vZGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UuY3VycmVudFRpbGVNb2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIHNldCBjdXJyZW50VGlsZU1vZGUodGlsZU1vZGUgOiBEZWxpdmVyeVBsYW5uaW5nVGlsZU1vZGVzKSB7XHJcbiAgICB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50VGlsZU1vZGUgPSB0aWxlTW9kZTtcclxuICB9XHJcblxyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIF9kZWxpdmVyeVBsYW5uaW5nU2VydmljZTogRGVsaXZlcnlQbGFubmluZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdHJhbnNhY3Rpb246IFRyYW5zYWN0aW9uU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF90cmFuc2FjdGlvbkNvbjogVHJhbnNhY3Rpb25Db25uZWN0b3JTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX2RpYWxvZzogRGlhbG9nU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9jaGFuZ2VEZXRlY3RvcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXHJcbiAgICAgICAgICAgICAgcHVibGljIGljb25DYWNoZVNlcnZpY2U6IEljb25DYWNoZVNlcnZpY2VcclxuICAgICAgICAgICAgICApIHtcclxuICB9XHJcblxyXG4gIC8vY2FsY3VsYXRpbmcgdXBvbiBsb2FkaW5nXHJcbiAgbmdBZnRlclZpZXdDaGVja2VkKCkge1xyXG4gICAgdGhpcy5zZXRDb2xOdW0oKTtcclxuICB9XHJcblxyXG4gIEBIb3N0QmluZGluZyhcImNsYXNzLmNvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3XCIpXHJcbiAgcHVibGljIHNob3dDbGFzcygpIHtcclxuICAgIHJldHVybiB0cnVlO1xyXG4gIH1cclxuXHJcblxyXG4gIC8vcmVjYWxjdWxhdGluZyB1cG9uIGJyb3dzZXIgd2luZG93IHJlc2l6ZVxyXG4gIEBIb3N0TGlzdGVuZXIoJ3dpbmRvdzpyZXNpemUnLCBbJyRldmVudCddKVxyXG4gIG9uUmVzaXplKGV2ZW50KSB7XHJcbiAgICB0aGlzLnNldENvbE51bSgpO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBhc3luYyBkcm9wcGVkKGV2OiBEcmFnRXZlbnQsIHdlZWs6IFBsYW5uaW5nVHJhbnNwb3J0V2VlaywgdHJhbnNwb3J0RGF5OiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXksIHRyYW5zcG9ydERheXM6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheVtdKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBkYXRhID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJ0ZXh0XCIpO1xyXG4gICAgICBsZXQgaW5kZXggPSB0cmFuc3BvcnREYXlzLmluZGV4T2YodHJhbnNwb3J0RGF5KVxyXG4gICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNRdWVyeUxpc3QuZ2V0KGluZGV4KTtcclxuICAgICAgaWYgKCF0aWxlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgdGlsZS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRhdGEgIT0gXCJsaW5lc1wiKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb24uZ2V0VHJhbnNhY3Rpb25CeUlkKHBhcnNlSW50KGRhdGEpKVxyXG4gICAgICAgIGNvbnN0IHBsYW5PcmRlciA9IGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldFBsYW5PcmRlcihwYXJzZUludChkYXRhKSlcclxuXHJcbiAgICAgICAgaWYgKHBsYW5PcmRlcikge1xyXG4gICAgICAgICAgdGhpcy5vcGVuUGxhbm5pbmdQb3B1cChwbGFuT3JkZXIsIHRyYW5zcG9ydERheSwgd2Vlayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maW5kKHRyYW5zYWN0aW9uTGluZSA9PiB0cmFuc2FjdGlvbkxpbmUuc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYW5TZWxlY3RlZExpbmVzKHRyYW5zcG9ydERheSwgd2VlaylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWxsb3dEcm9wKGV2LCB0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSkge1xyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIGlmICh0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5kcmFnZ2luZyAmJiB0cmFuc3BvcnREYXkubWF4TWludXRlcyA+IDAgJiYgdHJhbnNwb3J0RGF5LmF2YWlsYWJsZU9uRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdHJhbnNwb3J0RGF5Lm1pbnV0ZXMgKyB0cmFuc3BvcnREYXkubWludXRlcyA8IHRyYW5zcG9ydERheS5tYXhNaW51dGVzICYmIHRyYW5zcG9ydERheS5tYXhPcmRlckFtb3VudCA8IHRyYW5zcG9ydERheS5vcmRlckFtb3VudCAmJiB0cmFuc3BvcnREYXkuYXZhaWxhYmxlT25EYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzZXRDb2xOdW0oKSB7XHJcbiAgICBpZiAodGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2Uudmlld01vZGUgPT09IERlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXMuU2lkZWJhcikge1xyXG4gICAgICB0aGlzLmNvbHVtbk51bSA9IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBsZXQgd2lkdGggPSB0aGlzLnJvd0NvbnRhaW5lcj8ubmF0aXZlRWxlbWVudD8ub2Zmc2V0V2lkdGg7XHJcbiAgICAgIGlmICh3aWR0aCkge1xyXG4gICAgICAgIHRoaXMuY29sdW1uTnVtID0gTWF0aC50cnVuYyh3aWR0aCAvIHRoaXMudGlsZVNpemUpO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGRyYWdFbmQoZXYpIHtcclxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyB3ZWVrQXJyYXkoYXJyOiBQbGFubmluZ1RyYW5zcG9ydFdlZWspOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXJyKS5zb3J0KCkubWFwKGtleSA9PiBhcnJba2V5XSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyV2Vla0FycmF5KHdlZWtBcnJheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5W10pIHtcclxuICAgIHJldHVybiB3ZWVrQXJyYXkuc2xpY2UoMCwgdGhpcy5jb2x1bW5OdW0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEhvdXJzKGRhdGUsIGhvdXJzKSB7XHJcbiAgICBjb25zdCBob3Vyc1RvQWRkID0gaG91cnMgKiA2MCAqIDYwICogMTAwMDtcclxuICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIGhvdXJzVG9BZGQpO1xyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRGF0ZVJhbmdlQ2hhbmdlKG5ld0RhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmN1cnJlbnRTdGFydERhdGUgPSBuZXdEYXRlO1xyXG4gICAgdGhpcy5yZXNldFBsYW5uaW5nVHJhbnNwb3J0RXZlbnQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZURlbGV0ZU9yZGVyKGRlbGV0ZVJlc3VsdDogW1BsYW5PcmRlciwgUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5XSwgcGxhbm5pbmdUcmFuc3BvcnRXZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWspIHtcclxuICAgIGxldCBvcmRlciA9IGRlbGV0ZVJlc3VsdFswXTtcclxuICAgIGlmIChvcmRlcikge1xyXG4gICAgICBhd2FpdCB0aGlzLmdldFRyYW5zcG9ydE9yZGVycyhkZWxldGVSZXN1bHRbMF0sIGRlbGV0ZVJlc3VsdFsxXSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0T3JkZXJMaW5lc1BsYW5uZWQob3JkZXIpO1xyXG4gICAgICBpZiAoZGVsZXRlUmVzdWx0WzBdLmxpbmVzLmxlbmd0aCA+IDApIHtcclxuICAgICAgICBvcmRlcj8ubGluZXMuZm9yRWFjaChsaW5lID0+IHtcclxuICAgICAgICAgIGxpbmUucGxhbm5lZCA9IGZhbHNlO1xyXG4gICAgICAgICAgbGluZS5zZWxlY3RlZCA9IGZhbHNlO1xyXG4gICAgICAgIH0pO1xyXG4gICAgICAgIG9yZGVyLmxpbmVzID0gW11cclxuICAgICAgICBkZWxldGVSZXN1bHRbMV0ucGxhbm5lZE9yZGVycy5zcGxpY2UoZGVsZXRlUmVzdWx0WzFdLnBsYW5uZWRPcmRlcnMuaW5kZXhPZihvcmRlciksIDEpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlUGxhbm5pbmdUcmFuc3BvcnRFdmVudC5lbWl0KHBsYW5uaW5nVHJhbnNwb3J0V2Vlayk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZGlhbG9nLnNob3dFcnJvcihcIk5PX0xJTkVTX1RPX0RFTEVURVwiLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldE9yZGVyTGluZXNQbGFubmVkKG9yZGVyOiBQbGFuT3JkZXIpOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCByZXF1ZXN0OiBPcmRlckxpbmVzUGxhbm5lZFJlcXVlc3QgPSBuZXcgT3JkZXJMaW5lc1BsYW5uZWRSZXF1ZXN0KCk7XHJcbiAgICBsZXQgZmlsdGVyT2JqOiBQbGFubmluZ0ZpbHRlck9iamVjdCA9IG5ldyBQbGFubmluZ0ZpbHRlck9iamVjdCgpO1xyXG4gICAgcmVxdWVzdC5wbGFubmVkID0gdHJ1ZTtcclxuICAgIHJlcXVlc3QucGxhbm5pbmdJZCA9IHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmN1cnJlbnRQbGFubmluZy5wbGFubmluZ0lkO1xyXG4gICAgcmVxdWVzdC50cmFuc0lkID0gb3JkZXIudHJhbnNJZDtcclxuICAgIHJlcXVlc3QucGxhbm5lZExpbmVJZCA9IG9yZGVyLnBsYW5uZWRMaW5lSWQ7XHJcbiAgICBmaWx0ZXJPYmoub25seUN1cnJlbnRXZWVrID0gdHJ1ZTtcclxuICAgIGZpbHRlck9iai5iZWdpbkN1cnJlbnRXZWVrID0gbmV3IERhdGUoKTtcclxuICAgIGZpbHRlck9iai5jaGVja09yZGVyTGluZXMgPSAxO1xyXG4gICAgcmVxdWVzdC5maWx0ZXJPYmplY3QgPSBmaWx0ZXJPYmo7XHJcbiAgICBvcmRlci5saW5lcy5wdXNoKC4uLmF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldE9yZGVyTGluZXNQbGFubmVkKHJlcXVlc3QpKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNwb3J0T3JkZXJzKG9yZGVyOiBQbGFuT3JkZXIsIHRyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcmVxdWVzdDogR2V0VHJhbnNwb3J0T3JkZXJzUmVxdWVzdCA9IG5ldyBHZXRUcmFuc3BvcnRPcmRlcnNSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LnBsYW5uaW5nSWQgPSB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50UGxhbm5pbmcucGxhbm5pbmdJZDtcclxuICAgIHJlcXVlc3QuZGF0ZSA9IHRyYW5zcG9ydERheS5kYXRlO1xyXG4gICAgcmVxdWVzdC50cmFuc3BvcnRJZCA9IHRyYW5zcG9ydERheS50cmFuc3BvcnQudHJhbnNwb3J0SWQ7XHJcbiAgICB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycyA9IGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldFRyYW5zcG9ydE9yZGVycyhyZXF1ZXN0KTtcclxuICAgIHRyYW5zcG9ydERheS5vcmRlcnNMb2FkZWQgPSB0cnVlO1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwbGFuT3JkZXJMaW5lcyhvcmRlcjogUGxhbk9yZGVyLCB0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgd2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBpZiAob3JkZXIubGluZXMubGVuZ3RoKSB7XHJcbiAgICAgIG9yZGVyLmxpbmVzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgb3JkZXIudGFza3MgPSBbXTtcclxuICAgICAgb3JkZXIudGFza3NMb2FkZWQgPSB0cnVlO1xyXG4gICAgICBvcmRlci5saW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xyXG4gICAgICAgIGxpbmUuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKCF0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycyB8fCB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycyA9IFtvcmRlcl07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMucHVzaChvcmRlcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGVQbGFubmluZ1RyYW5zcG9ydEV2ZW50LmVtaXQod2Vlayk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaWFsb2cuc2hvd0Vycm9yKFwiTk9fTElORVNfVE9fUExBTlwiLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwbGFuU2VsZWN0ZWRMaW5lcyh0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgd2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcGxhbk9yZGVyID0gYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb25Db24uZ2V0UGxhbk9yZGVyKHRoaXMuX3RyYW5zYWN0aW9uLmN1cnJlbnRUcmFuc2FjdGlvbi50cmFuc2FjdGlvbkluZm8uaWQpO1xyXG4gICAgbGV0IGxpbmVzVG9QbGFuID0gcGxhbk9yZGVyLmxpbmVzO1xyXG4gICAgcGxhbk9yZGVyLmxpbmVzID0gW107XHJcblxyXG4gICAgYXdhaXQgdGhpcy5nZXRUcmFuc3BvcnRPcmRlcnMocGxhbk9yZGVyLCB0cmFuc3BvcnREYXkpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTZXF1ZW5jZU9yZGVyVmFsdWUocGxhbk9yZGVyKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0T3JkZXJMaW5lc1BsYW5uZWQocGxhbk9yZGVyKTtcclxuXHJcbiAgICBsZXQgb3JpZ2luYWxQbGFubmVkTGluZUNvdW50ID0gcGxhbk9yZGVyLmxpbmVzLmxlbmd0aDtcclxuXHJcbiAgICBpZiAoIXRyYW5zcG9ydERheS5wbGFubmVkT3JkZXJzLmZpbmQob3JkZXIgPT4gb3JkZXIudHJhbnNJZCA9PT0gcGxhbk9yZGVyLnRyYW5zSWQpKSB7XHJcbiAgICAgIHRyYW5zcG9ydERheS5wbGFubmVkT3JkZXJzLnB1c2gocGxhbk9yZGVyKTtcclxuICAgIH1cclxuXHJcblxyXG4gICAgaWYgKGxpbmVzVG9QbGFuLmxlbmd0aCA+IDApIHtcclxuICAgICAgdGhpcy5fdHJhbnNhY3Rpb24uY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uTGluZXMuZmlsdGVyKHRyYW5zTGluZXMgPT4gdHJhbnNMaW5lcy5zZWxlY3RlZCkuZm9yRWFjaChzZWxlY3RlZFRyYW5zTGluZSA9PiB7XHJcbiAgICAgICAgaWYgKGxpbmVzVG9QbGFuLmZpbmQocGxhbkxpbmUgPT4gcGxhbkxpbmUub3JpZ2luYWxMaW5lTnIgPT09IHNlbGVjdGVkVHJhbnNMaW5lLmxpbmVOcikpIHtcclxuICAgICAgICAgIGxldCBtYXRjaGVkTGluZSA9IGxpbmVzVG9QbGFuLmZpbmQocGxhbkxpbmUgPT4gcGxhbkxpbmUub3JpZ2luYWxMaW5lTnIgPT09IHNlbGVjdGVkVHJhbnNMaW5lLmxpbmVOcik7XHJcbiAgICAgICAgICBpZiAoIXBsYW5PcmRlci5saW5lcy5maW5kKHBsYW5uZWRMaW5lID0+IHBsYW5uZWRMaW5lLm9yaWdpbmFsTGluZU5yID09PSBtYXRjaGVkTGluZS5vcmlnaW5hbExpbmVOcikpIHtcclxuICAgICAgICAgICAgbWF0Y2hlZExpbmUuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICAgICAgICB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycy5maW5kKG9yZGVyID0+IG9yZGVyLnRyYW5zSWQgPT09IG1hdGNoZWRMaW5lLnRyYW5zSWQpLmxpbmVzLnB1c2gobWF0Y2hlZExpbmUpO1xyXG4gICAgICAgICAgfVxyXG4gICAgICAgIH1cclxuICAgICAgfSk7XHJcbiAgICAgIGxldCBjb3JyZWN0T3JkZXI6IFBsYW5PcmRlciA9IHRyYW5zcG9ydERheS5wbGFubmVkT3JkZXJzLmZpbmQoIG9yZGVyID0+IG9yZGVyLnRyYW5zYWN0aW9uTnIgPT09IHBsYW5PcmRlci50cmFuc2FjdGlvbk5yKTtcclxuICAgICAgdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMuc3BsaWNlKHRyYW5zcG9ydERheS5wbGFubmVkT3JkZXJzLmluZGV4T2YoY29ycmVjdE9yZGVyKSwgMSk7XHJcblxyXG4gICAgICBpZiAoY29ycmVjdE9yZGVyLmxpbmVzLmxlbmd0aCA+IG9yaWdpbmFsUGxhbm5lZExpbmVDb3VudCkge1xyXG4gICAgICAgIHRoaXMub3BlblBsYW5uaW5nUG9wdXAoY29ycmVjdE9yZGVyLCB0cmFuc3BvcnREYXksIHdlZWspO1xyXG4gICAgICB9XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaWFsb2cuc2hvd0Vycm9yKFwiTk9fTElORVNfVE9fUExBTlwiLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRTZXF1ZW5jZU9yZGVyVmFsdWUob3JkZXI6IFBsYW5PcmRlcik6IFByb21pc2U8dm9pZD4ge1xyXG4gICAgb3JkZXIucGxhbm5lZExpbmVJZCA9IGF3YWl0IHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmdldE9yZGVyU2VxdWVuY2VWYWx1ZSgpO1xyXG4gICAgb3JkZXIuY2hhaW5lZCA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBhc3luYyBoYW5kbGVQb3B1cFBsYW5FdmVudChldmVudDogW1BsYW5PcmRlciwgUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCBQbGFubmluZ1RyYW5zcG9ydFdlZWtdKSB7XHJcbiAgICB0aGlzLnNob3dOb3RlRGlhbG9nID0gZmFsc2U7XHJcbiAgICBhd2FpdCB0aGlzLmdldFRyYW5zcG9ydE9yZGVycyhldmVudFswXSwgZXZlbnRbMV0pO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRTZXF1ZW5jZU9yZGVyVmFsdWUoZXZlbnRbMF0pXHJcbiAgICBhd2FpdCB0aGlzLmdldE9yZGVyTGluZXNQbGFubmVkKGV2ZW50WzBdKVxyXG4gICAgYXdhaXQgdGhpcy5wbGFuT3JkZXJMaW5lcyhldmVudFswXSwgZXZlbnRbMV0sIGV2ZW50WzJdKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBoYW5kbGVTZXR0aW5nc1NhdmUoY2hhbmdlZDogYm9vbGVhbikge1xyXG4gICAgaWYoY2hhbmdlZCkge1xyXG4gICAgICB0aGlzLnVwZGF0ZVBsYW5uaW5nVHJhbnNwb3J0RXZlbnQuZW1pdCgpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIG9wZW5TZXR0aW5nc0RpYWxvZyh0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSkge1xyXG4gICAgdGhpcy5zZWxlY3RlZFRyYW5zcG9ydERheSA9IHRyYW5zcG9ydERheTtcclxuICAgIGlmKHRoaXMuc2VsZWN0ZWRUcmFuc3BvcnREYXkpIHtcclxuICAgICAgdGhpcy5zaG93U2V0dGluZ3NEaWFsb2cgPSB0cnVlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZUNhbGVuZGFyUGxhbkV2ZW50KGRhdGE6e2N1cnJlbnRIb3VyOiBzdHJpbmcsIGRhdGE6IHN0cmluZ30sIHRyYW5zcG9ydFdlZWtEYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgd2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrKSB7XHJcbiAgICBsZXQgcGxhbk9yZGVyOiBQbGFuT3JkZXI7XHJcbiAgICBpZihkYXRhLmRhdGEgPT09IFwiZmFsc2VcIiAmJiB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50VHJhbnNJZCkge1xyXG4gICAgICBwbGFuT3JkZXIgPSBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbkNvbi5nZXRQbGFuT3JkZXIodGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2U/LmN1cnJlbnRUcmFuc0lkKVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcGxhbk9yZGVyID0gYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb25Db24uZ2V0UGxhbk9yZGVyKHBhcnNlSW50KGRhdGEuZGF0YSkpO1xyXG4gICAgfVxyXG5cclxuICAgIGlmKHBsYW5PcmRlciAmJiBkYXRhLmN1cnJlbnRIb3VyKSB7XHJcblxyXG5cclxuICAgICAgcGxhbk9yZGVyLnN0YXJ0VGltZSA9IHRoaXMuY2FsY3VsYXRlU3RhcnRUaW1lKHRyYW5zcG9ydFdlZWtEYXksIGRhdGEuY3VycmVudEhvdXIpO1xyXG4gICAgICBwbGFuT3JkZXIuZW5kVGltZSA9IHRoaXMuY2FsY3VsYXRlRW5kVGltZShwbGFuT3JkZXIuc3RhcnRUaW1lLCBkYXRhLmN1cnJlbnRIb3VyLCBwbGFuT3JkZXIpO1xyXG5cclxuICAgICAgYXdhaXQgdGhpcy5nZXRUcmFuc3BvcnRPcmRlcnMocGxhbk9yZGVyLCB0cmFuc3BvcnRXZWVrRGF5KTtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRTZXF1ZW5jZU9yZGVyVmFsdWUocGxhbk9yZGVyKVxyXG4gICAgICBhd2FpdCB0aGlzLmdldE9yZGVyTGluZXNQbGFubmVkKHBsYW5PcmRlcilcclxuICAgICAgYXdhaXQgdGhpcy5wbGFuT3JkZXJMaW5lcyhwbGFuT3JkZXIsIHRyYW5zcG9ydFdlZWtEYXksIHdlZWspO1xyXG4gICAgICB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50VHJhbnNJZCA9IHVuZGVmaW5lZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBjYWxjdWxhdGVTdGFydFRpbWUodHJhbnNwb3J0V2Vla0RheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCBjdXJyZW50SG91cjogc3RyaW5nKTogRGF0ZSB7XHJcbiAgICBsZXQgc3RhcnREYXRlOiBEYXRlID0gbmV3IERhdGUodHJhbnNwb3J0V2Vla0RheS5kYXRlKTtcclxuICAgIGxldCBzdGFydFRpbWU6IG51bWJlciA9IHBhcnNlSW50KGN1cnJlbnRIb3VyLnNwbGl0KFwiOlwiKVswXSlcclxuICAgIHN0YXJ0RGF0ZS5zZXRIb3VycyhzdGFydFRpbWUpO1xyXG4gICAgc3RhcnREYXRlLnNldE1pbnV0ZXMocGFyc2VJbnQoY3VycmVudEhvdXIuc3BsaXQoXCI6XCIpWzFdKSA+IDAgPyBwYXJzZUludChjdXJyZW50SG91ci5zcGxpdChcIjpcIilbMV0pIDogMCk7XHJcbiAgICBzdGFydERhdGUuc2V0U2Vjb25kcygwKTtcclxuXHJcbiAgICByZXR1cm4gc3RhcnREYXRlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbGN1bGF0ZUVuZFRpbWUoc3RhcnREYXRlOiBEYXRlLCBjdXJyZW50SG91cjogc3RyaW5nLCBwbGFuT3JkZXI6IFBsYW5PcmRlcik6IERhdGUge1xyXG4gICAgbGV0IGVuZFRpbWU6IERhdGUgPSBuZXcgRGF0ZShzdGFydERhdGUpO1xyXG5cclxuICAgIGxldCBzcGxpdEhvdXIgPSBjdXJyZW50SG91ci5zcGxpdChcIjpcIik7XHJcbiAgICBjb25zdCBuZXdFbmRNaW51dGVzID0gc3BsaXRIb3VyWzFdID09PSBcIjAwXCIgPyAzMCA6IDAgO1xyXG4gICAgY29uc3QgbmV3RW5kSG91ciA9IHNwbGl0SG91clsxXSA9PT0gXCIzMFwiID8gKHBhcnNlSW50KHNwbGl0SG91clswXSkgKyAxKSA6IHBhcnNlSW50KHNwbGl0SG91clswXSk7XHJcbiAgICBlbmRUaW1lLnNldEhvdXJzKG5ld0VuZEhvdXIpO1xyXG4gICAgZW5kVGltZS5zZXRNaW51dGVzKG5ld0VuZE1pbnV0ZXMpO1xyXG4gICAgbGV0IGFzc2VtYmx5VGltZSA9IHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLnRvdGFsQXNzZW1ibHlUaW1lKHBsYW5PcmRlcikgKiA2MCAqIDEwMDA7XHJcbiAgICBlbmRUaW1lLnNldFRpbWUoZW5kVGltZS5nZXRUaW1lKCkgKyBhc3NlbWJseVRpbWUpO1xyXG5cclxuICAgIHJldHVybiBlbmRUaW1lO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBvcGVuUGxhbm5pbmdQb3B1cChwbGFuT3JkZXI6IFBsYW5PcmRlciwgdHJhbnNwb3J0RGF5OiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXksIHdlZWs6IFBsYW5uaW5nVHJhbnNwb3J0V2Vlaykge1xyXG4gICAgdGhpcy5zaG93Tm90ZURpYWxvZyA9IHRydWU7XHJcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5tYXJrRm9yQ2hlY2soKTtcclxuICAgIHRoaXMuX2NoYW5nZURldGVjdG9yLmRldGVjdENoYW5nZXMoKTtcclxuICAgIGlmICh0aGlzLnBsYW5uaW5nUG9wdXBSZWYpIHtcclxuICAgICAgdGhpcy5wbGFubmluZ1BvcHVwUmVmLnBsYW5PcmRlciA9IHBsYW5PcmRlcjtcclxuICAgICAgdGhpcy5wbGFubmluZ1BvcHVwUmVmLnRyYW5zcG9ydERheSA9IHRyYW5zcG9ydERheTtcclxuICAgICAgdGhpcy5wbGFubmluZ1BvcHVwUmVmLndlZWsgPSB3ZWVrO1xyXG4gICAgICB0aGlzLnBsYW5uaW5nUG9wdXBSZWYudHJhbnNhY3Rpb24gPSB0aGlzLl90cmFuc2FjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb247XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlQXZhaWxhYmlsaXR5Q2hlY2tlZCh2YWx1ZToge3RyYW5zcG9ydERheTpQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXksIGF2YWlsYWJsZTogYm9vbGVhbn0pIHtcclxuICAgIHRoaXMuYXZhaWxhYmlsaXR5LnB1c2godmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGNoZWNrQXZhaWxhYmxlKHRyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5KSB7XHJcbiAgICBsZXQgdHJhbnNwb3J0ID0gdGhpcy5hdmFpbGFiaWxpdHkuZmluZCggdHJhbnNwb3J0T2JqZWN0ID0+IHRyYW5zcG9ydE9iamVjdC50cmFuc3BvcnREYXkgPT09IHRyYW5zcG9ydERheSk7XHJcbiAgICBpZih0cmFuc3BvcnQgJiYgIXRyYW5zcG9ydC5hdmFpbGFibGUpIHtcclxuICAgICAgcmV0dXJuIHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
418
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXcuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvdHJhbnNhY3Rpb24vc3JjL2xpYi9jb21wb25lbnQvZGVsaXZlcnktcGxhbm5pbmctbWFpbi9jb21wb25lbnQvZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXcvZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXcuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBRUwsaUJBQWlCLEVBQ2pCLFNBQVMsRUFDVCxZQUFZLEVBQ1osV0FBVyxFQUNYLFlBQVksRUFDWixLQUFLLEVBQ0wsTUFBTSxFQUVOLFNBQVMsRUFDVCxZQUFZLEVBQ1osaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBQyxZQUFZLEVBQUMsTUFBTSw0QkFBNEIsQ0FBQztBQUN4RCxPQUFPLEVBQUMsNkJBQTZCLEVBQUMsTUFBTSx3REFBd0QsQ0FBQztBQUNyRyxPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxvREFBb0QsQ0FBQztBQUM3RixPQUFPLEVBQUMsdUJBQXVCLEVBQUMsTUFBTSw4REFBOEQsQ0FBQztBQUNyRyxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSx5Q0FBeUMsQ0FBQztBQUMzRSxPQUFPLEVBQUMsMkJBQTJCLEVBQUMsTUFBTSxtREFBbUQsQ0FBQztBQUk5RixPQUFPLEVBQUMseUJBQXlCLEVBQUMsTUFBTSxzRUFBc0UsQ0FBQztBQUMvRyxPQUFPLEVBQUMsb0JBQW9CLEVBQUMsTUFBTSxnRUFBZ0UsQ0FBQztBQUNwRyxPQUFPLEVBQUMsYUFBYSxFQUFDLE1BQU0sb0NBQW9DLENBQUM7QUFDakUsT0FBTyxFQUFDLHdCQUF3QixFQUFDLE1BQU0scUVBQXFFLENBQUM7QUFJN0csT0FBTyxFQUNMLHFDQUFxQyxFQUN0QyxNQUFNLHVGQUF1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R0wsTUFBTTswQ0FHTixNQUFNO3dCQTRDTixXQUFXLFNBQUMscUNBQXFDO3VCQU9qRCxZQUFZLFNBQUMsZUFBZSxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcclxuICBBZnRlclZpZXdDaGVja2VkLFxyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdEJpbmRpbmcsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIElucHV0LFxyXG4gIE91dHB1dCxcclxuICBRdWVyeUxpc3QsXHJcbiAgVmlld0NoaWxkLFxyXG4gIFZpZXdDaGlsZHJlbixcclxuICBWaWV3RW5jYXBzdWxhdGlvblxyXG59IGZyb20gXCJAYW5ndWxhci9jb3JlXCI7XHJcblxyXG5pbXBvcnQge0NhbGVuZGFyVmlld30gZnJvbSAnQGNvbGlqbml0L3NoYXJlZGNvbXBvbmVudHMnO1xyXG5pbXBvcnQge0RlbGl2ZXJ5UGxhbm5pbmdDYWxlbmRhck1vZGVzfSBmcm9tIFwiLi4vLi4vLi4vLi4vZW51bS9kZWxpdmVyeS1wbGFubmluZy1jYWxlbmRhci1tb2Rlcy5lbnVtXCI7XHJcbmltcG9ydCB7RGVsaXZlcnlQbGFubmluZ1ZpZXdNb2Rlc30gZnJvbSBcIi4uLy4uLy4uLy4uL2VudW0vZGVsaXZlcnktcGxhbm5pbmctdmlldy1tb2Rlcy5lbnVtXCI7XHJcbmltcG9ydCB7RGVsaXZlcnlQbGFubmluZ1NlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi9kZWxpdmVyeS1wbGFubmluZy9zZXJ2aWNlL2RlbGl2ZXJ5LXBsYW5uaW5nLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvblNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlL3RyYW5zYWN0aW9uLnNlcnZpY2VcIjtcclxuaW1wb3J0IHtUcmFuc2FjdGlvbkNvbm5lY3RvclNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlL3RyYW5zYWN0aW9uLWNvbm5lY3Rvci5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7UGxhbm5pbmdUcmFuc3BvcnRXZWVrfSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3BsYW5uaW5nLXRyYW5zcG9ydC13ZWVrLmJvXCI7XHJcbmltcG9ydCB7UGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL3BsYW5uaW5nLXRyYW5zcG9ydC13ZWVrLWRheS5ib1wiO1xyXG5pbXBvcnQge1BsYW5PcmRlcn0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wbGFuLW9yZGVyLmJvXCI7XHJcbmltcG9ydCB7R2V0VHJhbnNwb3J0T3JkZXJzUmVxdWVzdH0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9nZXQtdHJhbnNwb3J0LW9yZGVycy1yZXF1ZXN0LmJvXCI7XHJcbmltcG9ydCB7UGxhbm5pbmdGaWx0ZXJPYmplY3R9IGZyb20gXCJAY29saWpuaXQvdHJhbnNhY3Rpb25hcGkvYnVpbGQvbW9kZWwvcGxhbm5pbmctZmlsdGVyLW9iamVjdC5ib1wiO1xyXG5pbXBvcnQge0RpYWxvZ1NlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlL2RpYWxvZy5zZXJ2aWNlXCI7XHJcbmltcG9ydCB7T3JkZXJMaW5lc1BsYW5uZWRSZXF1ZXN0fSBmcm9tIFwiQGNvbGlqbml0L3RyYW5zYWN0aW9uYXBpL2J1aWxkL21vZGVsL29yZGVyLWxpbmVzLXBsYW5uZWQtcmVxdWVzdC5ib1wiO1xyXG5pbXBvcnQge1xyXG4gIERlbGl2ZXJ5UGxhbm5pbmdPdmVydmlld1BvcHVwQ29tcG9uZW50XHJcbn0gZnJvbSBcIi4vY29tcG9uZW50L2RlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXBvcHVwL2RlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXBvcHVwLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge1xyXG4gIERlbGl2ZXJ5UGxhbm5pbmdPdmVydmlld1RpbGVDb21wb25lbnRcclxufSBmcm9tIFwiLi9jb21wb25lbnQvZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXctdGlsZS9kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy10aWxlLmNvbXBvbmVudFwiO1xyXG5pbXBvcnQge0ljb25DYWNoZVNlcnZpY2V9IGZyb20gXCIuLi8uLi8uLi8uLi9zZXJ2aWNlL2ljb24tY2FjaGUuc2VydmljZVwiO1xyXG5pbXBvcnQge0ljb259IGZyb20gXCIuLi8uLi8uLi8uLi9lbnVtL2ljb24uZW51bVwiO1xyXG5pbXBvcnQge0RlbGl2ZXJ5UGxhbm5pbmdUaWxlTW9kZXN9IGZyb20gXCIuLi8uLi8uLi8uLi9lbnVtL2RlbGl2ZXJ5LXBsYW5uaW5nLXRpbGUtbW9kZXMuZW51bVwiO1xyXG5pbXBvcnQge0RlbGl2ZXJ5UGxhbm5pbmdVcGRhdGVBY3Rpb25zfSBmcm9tIFwiLi4vLi4vLi4vLi4vZW51bS9kZWxpdmVyeS1wbGFubmluZy11cGRhdGUtYWN0aW9ucy5lbnVtXCI7XHJcbmltcG9ydCB7UGxhbk9yZGVyTGluZX0gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wbGFuLW9yZGVyLWxpbmUuYm9cIjtcclxuaW1wb3J0IHtQbGFubmluZ30gZnJvbSBcIkBjb2xpam5pdC90cmFuc2FjdGlvbmFwaS9idWlsZC9tb2RlbC9wbGFubmluZy5ib1wiO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6IFwiY28tZGVsaXZlcnktcGxhbm5pbmctb3ZlcnZpZXdcIixcclxuICB0ZW1wbGF0ZTogYFxyXG4gICAgPGNvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXBvcHVwICNwbGFubmluZ1BvcHVwICpuZ0lmPVwic2hvd05vdGVEaWFsb2dcIiAoY2xvc2VFdmVudCk9XCJzaG93Tm90ZURpYWxvZyA9IGZhbHNlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob25TdWNjZWVkZWRQbGFuQWN0aW9uKT1cImhhbmRsZVBvcHVwUGxhbkV2ZW50KCRldmVudClcIj48L2NvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXBvcHVwPlxyXG4gICAgPGNvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXRpbGUtc2V0dGluZ3MtcG9wdXAgKm5nSWY9XCJzaG93U2V0dGluZ3NEaWFsb2dcIiBbdHJhbnNwb3J0RGF5XT1cInNlbGVjdGVkVHJhbnNwb3J0RGF5XCIgKGF2YWlsYWJpbGl0eUNoZWNrZWQpPVwiaGFuZGxlQXZhaWxhYmlsaXR5Q2hlY2tlZCgkZXZlbnQpXCIgKG9uU2F2ZUFjdGlvbik9XCJoYW5kbGVTZXR0aW5nc1NhdmUoJGV2ZW50KVwiIChjbG9zZUV2ZW50KT1cInNob3dTZXR0aW5nc0RpYWxvZyA9IGZhbHNlXCI+PC9jby1kZWxpdmVyeS1wbGFubmluZy1vdmVydmlldy10aWxlLXNldHRpbmdzLXBvcHVwPlxyXG4gICAgPGRpdiBjbGFzcz1cImRlbGl2ZXJ5LW92ZXJ2aWV3LXdyYXBwZXJcIiBbY2xhc3Muc2lkZWJhcl09XCJjdXJyZW50Vmlld01vZGUgPT09ICdEQVlTX0FST1VORCdcIj5cclxuICAgICAgPGRpdiBjbGFzcz1cInRpbGUtdmlldy1tb2RlcyByb3dcIj5cclxuICAgICAgICA8Y28taWNvbiAoY2xpY2spPVwiY3VycmVudFRpbGVNb2RlID0gdGlsZU1vZGVzLk5vcm1hbFwiIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFRpbGVNb2RlID09PSB0aWxlTW9kZXMuTm9ybWFsXCIgW2ljb25EYXRhXT1cImljb25DYWNoZVNlcnZpY2UuZ2V0SWNvbihpY29ucy5DYWxlbmRhckxpbmVzUmVndWxhcilcIj48L2NvLWljb24+XHJcbiAgICAgICAgPGNvLWljb24gKGNsaWNrKT1cImN1cnJlbnRUaWxlTW9kZSA9IHRpbGVNb2Rlcy5DYWxlbmRhclwiIFtjbGFzcy5hY3RpdmVdPVwiY3VycmVudFRpbGVNb2RlID09PSB0aWxlTW9kZXMuQ2FsZW5kYXJcIiBbaWNvbkRhdGFdPVwiaWNvbkNhY2hlU2VydmljZS5nZXRJY29uKGljb25zLkNhbGVuZGFyRGF5UmVndWxhcilcIj48L2NvLWljb24+XHJcbiAgICAgIDwvZGl2PlxyXG4gICAgICA8ZGl2IGNsYXNzPVwicGxhbm5pbmctY29tcG9uZW50LXdyYXBwZXJcIj5cclxuICAgICAgICA8Y28tZGF0ZS1wbGFubmluZyBbdmlld109XCJjdXJyZW50Vmlld01vZGVcIiBbc2VsZWN0ZWREYXRlXT1cImN1cnJlbnREYXRlKClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgIChyYW5nZUNoYW5nZSk9XCJoYW5kbGVEYXRlUmFuZ2VDaGFuZ2UoJGV2ZW50KVwiPjwvY28tZGF0ZS1wbGFubmluZz5cclxuICAgICAgPC9kaXY+XHJcblxyXG4gICAgICA8ZGl2IGNsYXNzPVwicm93IGRhdGUtcGxhbm5pbmdcIiAjcm93Q29udGFpbmVyICpuZ0Zvcj1cImxldCB0cmFuc3BvcnRXZWVrUm93IG9mIHBsYW5UcmFuc3BvcnRXZWVrQXJyXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImNvbHVtblwiICNjb2x1bW5FbGVtXHJcbiAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgdHJhbnNQb3J0RGF5IG9mIGZpbHRlcldlZWtBcnJheSh0cmFuc3BvcnRXZWVrUm93KTsgaW5kZXggYXMgaVwiPlxyXG4gICAgICAgICAgPGNvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXRpbGVcclxuICAgICAgICAgICAgW2NsYXNzLmRpc2FibGVkXT1cIiF0cmFuc1BvcnREYXkuYXZhaWxhYmxlT25EYXRlIHx8IHRyYW5zUG9ydERheS5tYXhNaW51dGVzID09PSAwIHx8IGNoZWNrQXZhaWxhYmxlKHRyYW5zUG9ydERheSlcIlxyXG4gICAgICAgICAgICBbZGlzYWJsZWRdPVwiIXRyYW5zUG9ydERheS5hdmFpbGFibGVPbkRhdGUgfHwgdHJhbnNQb3J0RGF5Lm1heE1pbnV0ZXMgPT09IDBcIlxyXG4gICAgICAgICAgICAoZHJhZ292ZXIpPVwiYWxsb3dEcm9wKCRldmVudCwgdHJhbnNQb3J0RGF5KVwiXHJcbiAgICAgICAgICAgIChkcm9wKT1cImRyb3BwZWQoJGV2ZW50LCB0cmFuc3BvcnRXZWVrUm93LCB0cmFuc1BvcnREYXksIGZpbHRlcldlZWtBcnJheSh0cmFuc3BvcnRXZWVrUm93KSlcIlxyXG4gICAgICAgICAgICAoZHJhZ2VuZCk9XCJkcmFnRW5kKCRldmVudClcIlxyXG4gICAgICAgICAgICBbdHJhbnNwb3J0RGF5XT1cInRyYW5zUG9ydERheVwiXHJcbiAgICAgICAgICAgIChkZWxldGVPcmRlckV2ZW50KT1cImhhbmRsZURlbGV0ZU9yZGVyKCRldmVudCwgdHJhbnNwb3J0V2Vla1JvdylcIlxyXG4gICAgICAgICAgICAodGltZUNoYW5nZUV2ZW50KT1cImhhbmRsZVRpbWVDaGFuZ2VFdmVudCh0cmFuc1BvcnREYXksIHRyYW5zcG9ydFdlZWtSb3csJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChvcGVuU2V0dGluZ3NEaWFsb2dFdmVudCk9XCJvcGVuU2V0dGluZ3NEaWFsb2coJGV2ZW50KVwiXHJcbiAgICAgICAgICAgIChjYWxlbmRhclBsYW5FdmVudCk9XCJoYW5kbGVDYWxlbmRhclBsYW5FdmVudCgkZXZlbnQsIHRyYW5zUG9ydERheSwgdHJhbnNwb3J0V2Vla1JvdylcIlxyXG4gICAgICAgICAgICAoZGVsZXRlT3JkZXJMaW5lRXZlbnQpPVwiaGFuZGxlRGVsZXRlTGluZSgkZXZlbnQsIHRyYW5zUG9ydERheSwgdHJhbnNwb3J0V2Vla1JvdylcIlxyXG4gICAgICAgICAgICAoZWRpdE9yZGVyRXZlbnQpPVwiaGFuZGxlRWRpdFBsYW5uZWRPcmRlcigkZXZlbnQsIHRyYW5zUG9ydERheSwgdHJhbnNwb3J0V2Vla1JvdylcIlxyXG5cclxuICAgICAgICAgID48L2NvLWRlbGl2ZXJ5LXBsYW5uaW5nLW92ZXJ2aWV3LXRpbGU+XHJcbiAgICAgICAgPC9kaXY+XHJcbiAgICAgIDwvZGl2PlxyXG5cclxuXHJcbiAgICA8L2Rpdj5cclxuXHJcblxyXG4gIGAsXHJcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGVsaXZlcnlQbGFubmluZ092ZXJ2aWV3Q29tcG9uZW50IGltcGxlbWVudHMgQWZ0ZXJWaWV3Q2hlY2tlZCB7XHJcbiAgcHVibGljIHJlYWRvbmx5IGljb25zOiB0eXBlb2YgSWNvbiA9IEljb247XHJcbiAgcHVibGljIHJlYWRvbmx5IHBsYW5uaW5nQWN0aW9uczogdHlwZW9mIERlbGl2ZXJ5UGxhbm5pbmdVcGRhdGVBY3Rpb25zID0gRGVsaXZlcnlQbGFubmluZ1VwZGF0ZUFjdGlvbnM7XHJcbiAgcHVibGljIHJlYWRvbmx5IHRpbGVNb2RlczogdHlwZW9mIERlbGl2ZXJ5UGxhbm5pbmdUaWxlTW9kZXMgPSBEZWxpdmVyeVBsYW5uaW5nVGlsZU1vZGVzO1xyXG4gIHB1YmxpYyBkZWxpdmVyeVBsYW5uaW5nVmlld01vZGVzOiB0eXBlb2YgRGVsaXZlcnlQbGFubmluZ1ZpZXdNb2RlcyA9IERlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXM7XHJcblxyXG4gIHB1YmxpYyBhdmFpbGFiaWxpdHk6IHt0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgYXZhaWxhYmxlOiBib29sZWFufVtdID0gW107XHJcblxyXG4gIEBWaWV3Q2hpbGRyZW4oRGVsaXZlcnlQbGFubmluZ092ZXJ2aWV3VGlsZUNvbXBvbmVudClcclxuICBwdWJsaWMgc2V0IHRpbGVzKHRpbGVzOiBRdWVyeUxpc3Q8RGVsaXZlcnlQbGFubmluZ092ZXJ2aWV3VGlsZUNvbXBvbmVudD4pIHtcclxuICAgIHRoaXMudGlsZXNRdWVyeUxpc3QgPSB0aWxlcztcclxuICB9O1xyXG5cclxuICBAVmlld0NoaWxkKCdyb3dDb250YWluZXInKSByb3dDb250YWluZXI7XHJcblxyXG5cclxuICBAVmlld0NoaWxkKCdjb2x1bW5FbGVtJykgY29sdW1uRWxlbTtcclxuICBwdWJsaWMgY29sdW1uTnVtID0gMzsgLy9pbml0aWFsIGNvdW50XHJcblxyXG4gIEBWaWV3Q2hpbGQoJ3BsYW5uaW5nUG9wdXAnKVxyXG4gIHB1YmxpYyBzZXQgcGxhbm5pbmdQb3B1cENvbXBvbmVudCh2YWx1ZTogRGVsaXZlcnlQbGFubmluZ092ZXJ2aWV3UG9wdXBDb21wb25lbnQpIHtcclxuICAgIHRoaXMucGxhbm5pbmdQb3B1cFJlZiA9IHZhbHVlO1xyXG4gIH07XHJcblxyXG5cclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgcGxhbk9yZGVyczogUGxhbk9yZGVyW10gPSBbXTtcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VycmVudE1vZGU6IERlbGl2ZXJ5UGxhbm5pbmdDYWxlbmRhck1vZGVzID0gRGVsaXZlcnlQbGFubmluZ0NhbGVuZGFyTW9kZXMuV2VlaztcclxuXHJcbiAgQElucHV0KClcclxuICBwdWJsaWMgY3VycmVudFZpZXdNb2RlOiBDYWxlbmRhclZpZXcgPSBDYWxlbmRhclZpZXcuV2Vla1ZpZXc7XHJcblxyXG4gIEBJbnB1dCgpXHJcbiAgcHVibGljIGN1cnJlbnRQbGFubmluZ1ZpZXdNb2RlOiBEZWxpdmVyeVBsYW5uaW5nVmlld01vZGVzID0gdGhpcy5kZWxpdmVyeVBsYW5uaW5nVmlld01vZGVzLkZ1bGxzY3JlZW47XHJcblxyXG4gIEBPdXRwdXQoKVxyXG4gIHB1YmxpYyB1cGRhdGVQbGFubmluZ1RyYW5zcG9ydEV2ZW50OiBFdmVudEVtaXR0ZXI8e29sZFdlZWs6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheVtdLCB3ZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSwgYWN0aW9uOiBEZWxpdmVyeVBsYW5uaW5nVXBkYXRlQWN0aW9uc30+ID0gbmV3IEV2ZW50RW1pdHRlcjx7b2xkV2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5W10sIHdlZWs6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheVtdLCBhY3Rpb246IERlbGl2ZXJ5UGxhbm5pbmdVcGRhdGVBY3Rpb25zfT4oKTtcclxuXHJcbiAgQE91dHB1dCgpXHJcbiAgcHVibGljIHJlc2V0UGxhbm5pbmdUcmFuc3BvcnRFdmVudDogRXZlbnRFbWl0dGVyPHZvaWQ+ID0gbmV3IEV2ZW50RW1pdHRlcjx2b2lkPigpO1xyXG5cclxuICBwdWJsaWMgdGlsZVNpemUgPSAzMDA7IC8vb25lIHRpbGUgc2hvdWxkIGhhdmUgdGhpcyB3aWR0aFxyXG4gIHB1YmxpYyBwbGFubmluZ1BvcHVwUmVmOiBEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdQb3B1cENvbXBvbmVudDtcclxuXHJcbiAgcHVibGljIGF2YWlsYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93Tm90ZURpYWxvZzogYm9vbGVhbiA9IGZhbHNlO1xyXG4gIHB1YmxpYyBzaG93U2V0dGluZ3NEaWFsb2c6IGJvb2xlYW4gPSBmYWxzZTtcclxuICBwdWJsaWMgdGlsZXNRdWVyeUxpc3Q6IFF1ZXJ5TGlzdDxEZWxpdmVyeVBsYW5uaW5nT3ZlcnZpZXdUaWxlQ29tcG9uZW50PjtcclxuICBwdWJsaWMgc2VsZWN0ZWRUcmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheTtcclxuXHJcblxyXG4gIHB1YmxpYyBnZXQgcGxhblRyYW5zcG9ydFdlZWtBcnIoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UucGxhblRyYW5zcG9ydFdlZWtBcnI7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZ2V0IGN1cnJlbnRUaWxlTW9kZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50VGlsZU1vZGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgc2V0IGN1cnJlbnRUaWxlTW9kZSh0aWxlTW9kZSA6IERlbGl2ZXJ5UGxhbm5pbmdUaWxlTW9kZXMpIHtcclxuICAgIHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmN1cnJlbnRUaWxlTW9kZSA9IHRpbGVNb2RlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGN1cnJlbnREYXRlKCk6IERhdGUge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmN1cnJlbnRTdGFydERhdGU7XHJcbiAgfVxyXG5cclxuXHJcbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGVsaXZlcnlQbGFubmluZ1NlcnZpY2U6IERlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLFxyXG4gICAgICAgICAgICAgIHByaXZhdGUgX3RyYW5zYWN0aW9uOiBUcmFuc2FjdGlvblNlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfdHJhbnNhY3Rpb25Db246IFRyYW5zYWN0aW9uQ29ubmVjdG9yU2VydmljZSxcclxuICAgICAgICAgICAgICBwcml2YXRlIF9kaWFsb2c6IERpYWxvZ1NlcnZpY2UsXHJcbiAgICAgICAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3I6IENoYW5nZURldGVjdG9yUmVmLFxyXG4gICAgICAgICAgICAgIHB1YmxpYyBpY29uQ2FjaGVTZXJ2aWNlOiBJY29uQ2FjaGVTZXJ2aWNlXHJcbiAgICAgICAgICAgICAgKSB7XHJcbiAgfVxyXG5cclxuICAvL2NhbGN1bGF0aW5nIHVwb24gbG9hZGluZ1xyXG4gIG5nQWZ0ZXJWaWV3Q2hlY2tlZCgpIHtcclxuICAgIHRoaXMuc2V0Q29sTnVtKCk7XHJcbiAgfVxyXG5cclxuICBASG9zdEJpbmRpbmcoXCJjbGFzcy5jby1kZWxpdmVyeS1wbGFubmluZy1vdmVydmlld1wiKVxyXG4gIHB1YmxpYyBzaG93Q2xhc3MoKSB7XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG5cclxuICAvL3JlY2FsY3VsYXRpbmcgdXBvbiBicm93c2VyIHdpbmRvdyByZXNpemVcclxuICBASG9zdExpc3RlbmVyKCd3aW5kb3c6cmVzaXplJywgWyckZXZlbnQnXSlcclxuICBvblJlc2l6ZShldmVudCkge1xyXG4gICAgdGhpcy5zZXRDb2xOdW0oKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgYXN5bmMgZHJvcHBlZChldjogRHJhZ0V2ZW50LCB3ZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSwgdHJhbnNwb3J0RGF5OiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXksIHRyYW5zcG9ydERheXM6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheVtdKSB7XHJcbiAgICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICAgIGV2LnN0b3BQcm9wYWdhdGlvbigpO1xyXG4gICAgICB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gICAgICBjb25zdCBkYXRhID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoXCJ0ZXh0XCIpO1xyXG4gICAgICBsZXQgaW5kZXggPSB0cmFuc3BvcnREYXlzLmluZGV4T2YodHJhbnNwb3J0RGF5KVxyXG4gICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNRdWVyeUxpc3QuZ2V0KGluZGV4KTtcclxuICAgICAgaWYgKCF0aWxlLmV4cGFuZGVkKSB7XHJcbiAgICAgICAgdGlsZS5leHBhbmRlZCA9IHRydWU7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKGRhdGEgIT0gXCJsaW5lc1wiKSB7XHJcbiAgICAgICAgYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb24uZ2V0VHJhbnNhY3Rpb25CeUlkKHBhcnNlSW50KGRhdGEpKVxyXG4gICAgICAgIGNvbnN0IHBsYW5PcmRlciA9IGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldFBsYW5PcmRlcihwYXJzZUludChkYXRhKSlcclxuXHJcbiAgICAgICAgaWYgKHBsYW5PcmRlcikge1xyXG4gICAgICAgICAgdGhpcy5vcGVuUGxhbm5pbmdQb3B1cChwbGFuT3JkZXIsIHRyYW5zcG9ydERheSwgd2Vlayk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2Uge1xyXG4gICAgICAgIGlmICh0aGlzLl90cmFuc2FjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maW5kKHRyYW5zYWN0aW9uTGluZSA9PiB0cmFuc2FjdGlvbkxpbmUuc2VsZWN0ZWQpKSB7XHJcbiAgICAgICAgICBhd2FpdCB0aGlzLnBsYW5TZWxlY3RlZExpbmVzKHRyYW5zcG9ydERheSwgd2VlaylcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuXHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYWxsb3dEcm9wKGV2LCB0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSkge1xyXG4gICAgZXYucHJldmVudERlZmF1bHQoKTtcclxuICAgIGlmICh0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5kcmFnZ2luZyAmJiB0cmFuc3BvcnREYXkubWF4TWludXRlcyA+IDAgJiYgdHJhbnNwb3J0RGF5LmF2YWlsYWJsZU9uRGF0ZSkge1xyXG4gICAgICByZXR1cm4gdHJhbnNwb3J0RGF5Lm1pbnV0ZXMgKyB0cmFuc3BvcnREYXkubWludXRlcyA8IHRyYW5zcG9ydERheS5tYXhNaW51dGVzICYmIHRyYW5zcG9ydERheS5tYXhPcmRlckFtb3VudCA8IHRyYW5zcG9ydERheS5vcmRlckFtb3VudCAmJiB0cmFuc3BvcnREYXkuYXZhaWxhYmxlT25EYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyBzZXRDb2xOdW0oKSB7XHJcbiAgICBpZiAodGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2Uudmlld01vZGUgPT09IERlbGl2ZXJ5UGxhbm5pbmdWaWV3TW9kZXMuU2lkZWJhcikge1xyXG4gICAgICB0aGlzLmNvbHVtbk51bSA9IDE7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNvbHVtbk51bSA9IDM7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGRyYWdFbmQoZXYpIHtcclxuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XHJcbiAgICB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5kcmFnZ2luZyA9IGZhbHNlO1xyXG4gIH1cclxuXHJcblxyXG4gIHB1YmxpYyB3ZWVrQXJyYXkoYXJyOiBQbGFubmluZ1RyYW5zcG9ydFdlZWspOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSB7XHJcbiAgICByZXR1cm4gT2JqZWN0LmtleXMoYXJyKS5zb3J0KCkubWFwKGtleSA9PiBhcnJba2V5XSk7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgZmlsdGVyV2Vla0FycmF5KHdlZWtBcnJheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5W10pIHtcclxuICAgIHJldHVybiB3ZWVrQXJyYXkuc2xpY2UoMCwgdGhpcy5jb2x1bW5OdW0pO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFkZEhvdXJzKGRhdGUsIGhvdXJzKSB7XHJcbiAgICBjb25zdCBob3Vyc1RvQWRkID0gaG91cnMgKiA2MCAqIDYwICogMTAwMDtcclxuICAgIGRhdGUuc2V0VGltZShkYXRlLmdldFRpbWUoKSArIGhvdXJzVG9BZGQpO1xyXG4gICAgcmV0dXJuIGRhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgaGFuZGxlRGF0ZVJhbmdlQ2hhbmdlKG5ld0RhdGU6IERhdGUpIHtcclxuICAgIHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmN1cnJlbnRTdGFydERhdGUgPSBuZXdEYXRlO1xyXG4gICAgdGhpcy5yZXNldFBsYW5uaW5nVHJhbnNwb3J0RXZlbnQuZW1pdCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZURlbGV0ZU9yZGVyKGRlbGV0ZVJlc3VsdDogW1BsYW5PcmRlciwgUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5XSwgcGxhbm5pbmdUcmFuc3BvcnRXZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSkge1xyXG4gICAgbGV0IG9sZFdlZWs6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheVtdID0gcGxhbm5pbmdUcmFuc3BvcnRXZWVrO1xyXG4gICAgbGV0IG9yZGVyID0gZGVsZXRlUmVzdWx0WzBdO1xyXG4gICAgaWYgKG9yZGVyKSB7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VHJhbnNwb3J0T3JkZXJzKGRlbGV0ZVJlc3VsdFswXSwgZGVsZXRlUmVzdWx0WzFdKTtcclxuICAgICAgYXdhaXQgdGhpcy5nZXRPcmRlckxpbmVzUGxhbm5lZChvcmRlcik7XHJcbiAgICAgIGlmIChkZWxldGVSZXN1bHRbMF0ubGluZXMubGVuZ3RoID4gMCkge1xyXG4gICAgICAgIHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlLmRlbGV0aW5nT3JkZXIgPSBvcmRlcjtcclxuICAgICAgICBkZWxldGVSZXN1bHRbMV0ucGxhbm5lZE9yZGVycy5zcGxpY2UoZGVsZXRlUmVzdWx0WzFdLnBsYW5uZWRPcmRlcnMuaW5kZXhPZihvcmRlciksIDEpO1xyXG4gICAgICAgIHRoaXMudXBkYXRlUGxhbm5pbmdUcmFuc3BvcnRFdmVudC5lbWl0KHtvbGRXZWVrOiBvbGRXZWVrLCB3ZWVrOiBwbGFubmluZ1RyYW5zcG9ydFdlZWssIGFjdGlvbjogRGVsaXZlcnlQbGFubmluZ1VwZGF0ZUFjdGlvbnMuRGVsZXRlUGxhbm5lZE9yZGVyfSk7XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdGhpcy5fZGlhbG9nLnNob3dFcnJvcihcIk5PX0xJTkVTX1RPX0RFTEVURVwiLCB0cnVlKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZURlbGV0ZUxpbmUoZGVsZXRlUmVzdWx0OntvcmRlcjogUGxhbk9yZGVyLCBsaW5lOiBQbGFuT3JkZXJMaW5lfSwgd2Vla0RheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCB0cmFuc3BvcnRXZWVrUm93OiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSkge1xyXG4gICAgbGV0IG9sZFdlZWsgPSB0cmFuc3BvcnRXZWVrUm93O1xyXG4gICAgbGV0IG9yZGVyID0gd2Vla0RheS5wbGFubmVkT3JkZXJzLmZpbmQoIG9yZGVyID0+IG9yZGVyLnRyYW5zSWQgPT09IGRlbGV0ZVJlc3VsdC5vcmRlci50cmFuc0lkKTtcclxuICAgIG9yZGVyLmxpbmVzID0gb3JkZXIubGluZXMuZmlsdGVyKCBsaW5lID0+IGxpbmUub3JpZ2luYWxMaW5lTnIgIT09IGRlbGV0ZVJlc3VsdC5saW5lLm9yaWdpbmFsTGluZU5yKTtcclxuICAgIHRoaXMudXBkYXRlUGxhbm5pbmdUcmFuc3BvcnRFdmVudC5lbWl0KHtvbGRXZWVrOiBvbGRXZWVrLCB3ZWVrOiB0cmFuc3BvcnRXZWVrUm93LCBhY3Rpb246IERlbGl2ZXJ5UGxhbm5pbmdVcGRhdGVBY3Rpb25zLkRlbGV0ZVBsYW5uZWRMaW5lc30pO1xyXG59XHJcblxyXG4gIHB1YmxpYyBhc3luYyBnZXRPcmRlckxpbmVzUGxhbm5lZChvcmRlcjogUGxhbk9yZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcmVxdWVzdDogT3JkZXJMaW5lc1BsYW5uZWRSZXF1ZXN0ID0gbmV3IE9yZGVyTGluZXNQbGFubmVkUmVxdWVzdCgpO1xyXG4gICAgbGV0IGZpbHRlck9iajogUGxhbm5pbmdGaWx0ZXJPYmplY3QgPSBuZXcgUGxhbm5pbmdGaWx0ZXJPYmplY3QoKTtcclxuICAgIHJlcXVlc3QucGxhbm5lZCA9IHRydWU7XHJcbiAgICByZXF1ZXN0LnBsYW5uaW5nSWQgPSB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50UGxhbm5pbmcucGxhbm5pbmdJZDtcclxuICAgIHJlcXVlc3QudHJhbnNJZCA9IG9yZGVyLnRyYW5zSWQ7XHJcbiAgICByZXF1ZXN0LnBsYW5uZWRMaW5lSWQgPSBvcmRlci5wbGFubmVkTGluZUlkO1xyXG4gICAgZmlsdGVyT2JqLm9ubHlDdXJyZW50V2VlayA9IHRydWU7XHJcbiAgICBmaWx0ZXJPYmouYmVnaW5DdXJyZW50V2VlayA9IG5ldyBEYXRlKCk7XHJcbiAgICBmaWx0ZXJPYmouY2hlY2tPcmRlckxpbmVzID0gMTtcclxuICAgIHJlcXVlc3QuZmlsdGVyT2JqZWN0ID0gZmlsdGVyT2JqO1xyXG4gICAgaWYoIW9yZGVyLmxpbmVzKSB7XHJcbiAgICAgIG9yZGVyLmxpbmVzID0gW107XHJcbiAgICB9XHJcbiAgICBvcmRlci5saW5lcy5wdXNoKC4uLmF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldE9yZGVyTGluZXNQbGFubmVkKHJlcXVlc3QpKTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgYXN5bmMgZ2V0VHJhbnNwb3J0T3JkZXJzKG9yZGVyOiBQbGFuT3JkZXIsIHRyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5KTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBsZXQgcmVxdWVzdDogR2V0VHJhbnNwb3J0T3JkZXJzUmVxdWVzdCA9IG5ldyBHZXRUcmFuc3BvcnRPcmRlcnNSZXF1ZXN0KCk7XHJcbiAgICByZXF1ZXN0LnBsYW5uaW5nSWQgPSB0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50UGxhbm5pbmcucGxhbm5pbmdJZDtcclxuICAgIHJlcXVlc3QuZGF0ZSA9IHRyYW5zcG9ydERheS5kYXRlO1xyXG4gICAgcmVxdWVzdC50cmFuc3BvcnRJZCA9IHRyYW5zcG9ydERheS50cmFuc3BvcnQudHJhbnNwb3J0SWQ7XHJcbiAgICB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycyA9IGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldFRyYW5zcG9ydE9yZGVycyhyZXF1ZXN0KTtcclxuICAgIHRyYW5zcG9ydERheS5vcmRlcnNMb2FkZWQgPSB0cnVlO1xyXG5cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwbGFuT3JkZXJMaW5lcyhvcmRlcjogUGxhbk9yZGVyLCB0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgd2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5W10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBvbGRXZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSA9IHdlZWs7XHJcbiAgICBpZiAob3JkZXIubGluZXMubGVuZ3RoKSB7XHJcbiAgICAgIG9yZGVyLmxpbmVzTG9hZGVkID0gdHJ1ZTtcclxuICAgICAgb3JkZXIudGFza3MgPSBbXTtcclxuICAgICAgb3JkZXIudGFza3NMb2FkZWQgPSB0cnVlO1xyXG4gICAgICBvcmRlci5saW5lcy5mb3JFYWNoKGxpbmUgPT4ge1xyXG4gICAgICAgIGxpbmUuc2VsZWN0ZWQgPSB0cnVlO1xyXG4gICAgICB9KTtcclxuICAgICAgaWYgKCF0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycyB8fCB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycy5sZW5ndGggPT09IDApIHtcclxuICAgICAgICB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycyA9IFtvcmRlcl07XHJcbiAgICAgIH0gZWxzZSB7XHJcbiAgICAgICAgdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMucHVzaChvcmRlcik7XHJcbiAgICAgIH1cclxuICAgICAgdGhpcy51cGRhdGVQbGFubmluZ1RyYW5zcG9ydEV2ZW50LmVtaXQoe29sZFdlZWs6IG9sZFdlZWssIHdlZWs6IHdlZWssIGFjdGlvbjogRGVsaXZlcnlQbGFubmluZ1VwZGF0ZUFjdGlvbnMuUGxhbkxpbmVzfSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kaWFsb2cuc2hvd0Vycm9yKFwiTk9fTElORVNfVE9fUExBTlwiLCB0cnVlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHB1YmxpYyBhc3luYyBwbGFuU2VsZWN0ZWRMaW5lcyh0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgd2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5W10pOiBQcm9taXNlPHZvaWQ+IHtcclxuICAgIGxldCBwbGFuT3JkZXIgPSBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbkNvbi5nZXRQbGFuT3JkZXIodGhpcy5fdHJhbnNhY3Rpb24uY3VycmVudFRyYW5zYWN0aW9uLnRyYW5zYWN0aW9uSW5mby5pZCk7XHJcbiAgICBsZXQgbGluZXNUb1BsYW4gPSBwbGFuT3JkZXIubGluZXM7XHJcbiAgICBwbGFuT3JkZXIubGluZXMgPSBbXTtcclxuXHJcbiAgICBhd2FpdCB0aGlzLmdldFRyYW5zcG9ydE9yZGVycyhwbGFuT3JkZXIsIHRyYW5zcG9ydERheSk7XHJcbiAgICBhd2FpdCB0aGlzLmdldFNlcXVlbmNlT3JkZXJWYWx1ZShwbGFuT3JkZXIpO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRPcmRlckxpbmVzUGxhbm5lZChwbGFuT3JkZXIpO1xyXG5cclxuICAgIGxldCBvcmlnaW5hbFBsYW5uZWRMaW5lQ291bnQgPSBwbGFuT3JkZXIubGluZXMubGVuZ3RoO1xyXG5cclxuICAgIGlmICghdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMuZmluZChvcmRlciA9PiBvcmRlci50cmFuc0lkID09PSBwbGFuT3JkZXIudHJhbnNJZCkpIHtcclxuICAgICAgdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMucHVzaChwbGFuT3JkZXIpO1xyXG4gICAgfVxyXG5cclxuXHJcbiAgICBpZiAobGluZXNUb1BsYW4ubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLl90cmFuc2FjdGlvbi5jdXJyZW50VHJhbnNhY3Rpb24udHJhbnNhY3Rpb25MaW5lcy5maWx0ZXIodHJhbnNMaW5lcyA9PiB0cmFuc0xpbmVzLnNlbGVjdGVkKS5mb3JFYWNoKHNlbGVjdGVkVHJhbnNMaW5lID0+IHtcclxuICAgICAgICBpZiAobGluZXNUb1BsYW4uZmluZChwbGFuTGluZSA9PiBwbGFuTGluZS5vcmlnaW5hbExpbmVOciA9PT0gc2VsZWN0ZWRUcmFuc0xpbmUubGluZU5yKSkge1xyXG4gICAgICAgICAgbGV0IG1hdGNoZWRMaW5lID0gbGluZXNUb1BsYW4uZmluZChwbGFuTGluZSA9PiBwbGFuTGluZS5vcmlnaW5hbExpbmVOciA9PT0gc2VsZWN0ZWRUcmFuc0xpbmUubGluZU5yKTtcclxuICAgICAgICAgIGlmICghcGxhbk9yZGVyLmxpbmVzLmZpbmQocGxhbm5lZExpbmUgPT4gcGxhbm5lZExpbmUub3JpZ2luYWxMaW5lTnIgPT09IG1hdGNoZWRMaW5lLm9yaWdpbmFsTGluZU5yKSkge1xyXG4gICAgICAgICAgICBtYXRjaGVkTGluZS5zZWxlY3RlZCA9IHRydWU7XHJcbiAgICAgICAgICAgIHRyYW5zcG9ydERheS5wbGFubmVkT3JkZXJzLmZpbmQob3JkZXIgPT4gb3JkZXIudHJhbnNJZCA9PT0gbWF0Y2hlZExpbmUudHJhbnNJZCkubGluZXMucHVzaChtYXRjaGVkTGluZSk7XHJcbiAgICAgICAgICB9XHJcbiAgICAgICAgfVxyXG4gICAgICB9KTtcclxuICAgICAgbGV0IGNvcnJlY3RPcmRlcjogUGxhbk9yZGVyID0gdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMuZmluZCggb3JkZXIgPT4gb3JkZXIudHJhbnNhY3Rpb25OciA9PT0gcGxhbk9yZGVyLnRyYW5zYWN0aW9uTnIpO1xyXG4gICAgICB0cmFuc3BvcnREYXkucGxhbm5lZE9yZGVycy5zcGxpY2UodHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMuaW5kZXhPZihjb3JyZWN0T3JkZXIpLCAxKTtcclxuXHJcbiAgICAgIGlmIChjb3JyZWN0T3JkZXIubGluZXMubGVuZ3RoID4gb3JpZ2luYWxQbGFubmVkTGluZUNvdW50KSB7XHJcbiAgICAgICAgdGhpcy5vcGVuUGxhbm5pbmdQb3B1cChjb3JyZWN0T3JkZXIsIHRyYW5zcG9ydERheSwgd2Vlayk7XHJcbiAgICAgIH1cclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMuX2RpYWxvZy5zaG93RXJyb3IoXCJOT19MSU5FU19UT19QTEFOXCIsIHRydWUpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGFzeW5jIGdldFNlcXVlbmNlT3JkZXJWYWx1ZShvcmRlcjogUGxhbk9yZGVyKTogUHJvbWlzZTx2b2lkPiB7XHJcbiAgICBvcmRlci5wbGFubmVkTGluZUlkID0gYXdhaXQgdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UuZ2V0T3JkZXJTZXF1ZW5jZVZhbHVlKCk7XHJcbiAgICBvcmRlci5jaGFpbmVkID0gZmFsc2U7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIGFzeW5jIGhhbmRsZVBvcHVwUGxhbkV2ZW50KGV2ZW50OiBbUGxhbk9yZGVyLCBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXksIFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheVtdXSkge1xyXG4gICAgdGhpcy5zaG93Tm90ZURpYWxvZyA9IGZhbHNlO1xyXG4gICAgYXdhaXQgdGhpcy5nZXRUcmFuc3BvcnRPcmRlcnMoZXZlbnRbMF0sIGV2ZW50WzFdKTtcclxuICAgIGF3YWl0IHRoaXMuZ2V0U2VxdWVuY2VPcmRlclZhbHVlKGV2ZW50WzBdKVxyXG4gICAgYXdhaXQgdGhpcy5nZXRPcmRlckxpbmVzUGxhbm5lZChldmVudFswXSlcclxuICAgIGF3YWl0IHRoaXMucGxhbk9yZGVyTGluZXMoZXZlbnRbMF0sIGV2ZW50WzFdLCBldmVudFsyXSk7XHJcbiAgICBpZih0aGlzLl9kZWxpdmVyeVBsYW5uaW5nU2VydmljZS5jdXJyZW50VHJhbnNJZCkge1xyXG4gICAgICBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkJ5SWQodGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UuY3VycmVudFRyYW5zSWQpO1xyXG4gICAgICBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbi5zYXZlVHJhbnNhY3Rpb24oKTtcclxuICAgICAgYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb24uY2hlY2tSZWZUcmFuc2FjdGlvbigpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVNldHRpbmdzU2F2ZShjaGFuZ2VkOiBib29sZWFuKSB7XHJcbiAgICBpZihjaGFuZ2VkKSB7XHJcbiAgICAgIHRoaXMudXBkYXRlUGxhbm5pbmdUcmFuc3BvcnRFdmVudC5lbWl0KCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgb3BlblNldHRpbmdzRGlhbG9nKHRyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5KSB7XHJcbiAgICB0aGlzLnNlbGVjdGVkVHJhbnNwb3J0RGF5ID0gdHJhbnNwb3J0RGF5O1xyXG4gICAgaWYodGhpcy5zZWxlY3RlZFRyYW5zcG9ydERheSkge1xyXG4gICAgICB0aGlzLnNob3dTZXR0aW5nc0RpYWxvZyA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgYXN5bmMgaGFuZGxlQ2FsZW5kYXJQbGFuRXZlbnQoZGF0YTp7Y3VycmVudEhvdXI6IHN0cmluZywgZGF0YTogc3RyaW5nfSwgdHJhbnNwb3J0V2Vla0RheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCB3ZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSkge1xyXG4gICAgbGV0IHBsYW5PcmRlcjogUGxhbk9yZGVyO1xyXG4gICAgaWYoZGF0YS5kYXRhID09PSBcImZhbHNlXCIgJiYgdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UuY3VycmVudFRyYW5zSWQpIHtcclxuICAgICAgcGxhbk9yZGVyID0gYXdhaXQgdGhpcy5fdHJhbnNhY3Rpb25Db24uZ2V0UGxhbk9yZGVyKHRoaXMuX2RlbGl2ZXJ5UGxhbm5pbmdTZXJ2aWNlPy5jdXJyZW50VHJhbnNJZClcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHBsYW5PcmRlciA9IGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uQ29uLmdldFBsYW5PcmRlcihwYXJzZUludChkYXRhLmRhdGEpKTtcclxuICAgIH1cclxuXHJcbiAgICBpZihwbGFuT3JkZXIgJiYgZGF0YS5jdXJyZW50SG91cikge1xyXG5cclxuXHJcbiAgICAgIHBsYW5PcmRlci5zdGFydFRpbWUgPSB0aGlzLmNhbGN1bGF0ZVN0YXJ0VGltZSh0cmFuc3BvcnRXZWVrRGF5LCBkYXRhLmN1cnJlbnRIb3VyKTtcclxuICAgICAgcGxhbk9yZGVyLmVuZFRpbWUgPSB0aGlzLmNhbGN1bGF0ZUVuZFRpbWUocGxhbk9yZGVyLnN0YXJ0VGltZSwgZGF0YS5jdXJyZW50SG91ciwgcGxhbk9yZGVyKTtcclxuXHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0VHJhbnNwb3J0T3JkZXJzKHBsYW5PcmRlciwgdHJhbnNwb3J0V2Vla0RheSk7XHJcbiAgICAgIGF3YWl0IHRoaXMuZ2V0U2VxdWVuY2VPcmRlclZhbHVlKHBsYW5PcmRlcilcclxuICAgICAgYXdhaXQgdGhpcy5nZXRPcmRlckxpbmVzUGxhbm5lZChwbGFuT3JkZXIpXHJcbiAgICAgIGF3YWl0IHRoaXMucGxhbk9yZGVyTGluZXMocGxhbk9yZGVyLCB0cmFuc3BvcnRXZWVrRGF5LCB3ZWVrKTtcclxuICAgICAgaWYoZGF0YS5kYXRhID09PSBcImZhbHNlXCIgJiYgdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UuY3VycmVudFRyYW5zSWQpIHtcclxuICAgICAgICBhd2FpdCB0aGlzLl90cmFuc2FjdGlvbi5nZXRUcmFuc2FjdGlvbkJ5SWQodGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UuY3VycmVudFRyYW5zSWQpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uLnNhdmVUcmFuc2FjdGlvbigpO1xyXG4gICAgICAgIGF3YWl0IHRoaXMuX3RyYW5zYWN0aW9uLmNoZWNrUmVmVHJhbnNhY3Rpb24oKTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGNhbGN1bGF0ZVN0YXJ0VGltZSh0cmFuc3BvcnRXZWVrRGF5OiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXksIGN1cnJlbnRIb3VyOiBzdHJpbmcpOiBEYXRlIHtcclxuICAgIGxldCBzdGFydERhdGU6IERhdGUgPSBuZXcgRGF0ZSh0cmFuc3BvcnRXZWVrRGF5LmRhdGUpO1xyXG4gICAgbGV0IHN0YXJ0VGltZTogbnVtYmVyID0gcGFyc2VJbnQoY3VycmVudEhvdXIuc3BsaXQoXCI6XCIpWzBdKVxyXG4gICAgc3RhcnREYXRlLnNldEhvdXJzKHN0YXJ0VGltZSk7XHJcbiAgICBzdGFydERhdGUuc2V0TWludXRlcyhwYXJzZUludChjdXJyZW50SG91ci5zcGxpdChcIjpcIilbMV0pID4gMCA/IHBhcnNlSW50KGN1cnJlbnRIb3VyLnNwbGl0KFwiOlwiKVsxXSkgOiAwKTtcclxuICAgIHN0YXJ0RGF0ZS5zZXRTZWNvbmRzKDApO1xyXG5cclxuICAgIHJldHVybiBzdGFydERhdGU7XHJcbiAgfVxyXG5cclxuICBwdWJsaWMgY2FsY3VsYXRlRW5kVGltZShzdGFydERhdGU6IERhdGUsIGN1cnJlbnRIb3VyOiBzdHJpbmcsIHBsYW5PcmRlcjogUGxhbk9yZGVyKTogRGF0ZSB7XHJcbiAgICBsZXQgZW5kVGltZTogRGF0ZSA9IG5ldyBEYXRlKHN0YXJ0RGF0ZSk7XHJcblxyXG4gICAgbGV0IHNwbGl0SG91ciA9IGN1cnJlbnRIb3VyLnNwbGl0KFwiOlwiKTtcclxuICAgIGNvbnN0IG5ld0VuZE1pbnV0ZXMgPSBzcGxpdEhvdXJbMV0gPT09IFwiMDBcIiA/IDMwIDogMCA7XHJcbiAgICBjb25zdCBuZXdFbmRIb3VyID0gc3BsaXRIb3VyWzFdID09PSBcIjMwXCIgPyAocGFyc2VJbnQoc3BsaXRIb3VyWzBdKSArIDEpIDogcGFyc2VJbnQoc3BsaXRIb3VyWzBdKTtcclxuICAgIGVuZFRpbWUuc2V0SG91cnMobmV3RW5kSG91cik7XHJcbiAgICBlbmRUaW1lLnNldE1pbnV0ZXMobmV3RW5kTWludXRlcyk7XHJcbiAgICBsZXQgYXNzZW1ibHlUaW1lID0gdGhpcy5fZGVsaXZlcnlQbGFubmluZ1NlcnZpY2UudG90YWxBc3NlbWJseVRpbWUocGxhbk9yZGVyKSAqIDYwICogMTAwMDtcclxuICAgIGVuZFRpbWUuc2V0VGltZShlbmRUaW1lLmdldFRpbWUoKSArIGFzc2VtYmx5VGltZSk7XHJcblxyXG4gICAgcmV0dXJuIGVuZFRpbWU7XHJcbiAgfVxyXG5cclxuXHJcbiAgcHVibGljIG9wZW5QbGFubmluZ1BvcHVwKHBsYW5PcmRlcjogUGxhbk9yZGVyLCB0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSwgd2VlazogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5W10pIHtcclxuICAgIHRoaXMuc2hvd05vdGVEaWFsb2cgPSB0cnVlO1xyXG4gICAgdGhpcy5fY2hhbmdlRGV0ZWN0b3IubWFya0ZvckNoZWNrKCk7XHJcbiAgICB0aGlzLl9jaGFuZ2VEZXRlY3Rvci5kZXRlY3RDaGFuZ2VzKCk7XHJcbiAgICBpZiAodGhpcy5wbGFubmluZ1BvcHVwUmVmKSB7XHJcbiAgICAgIHRoaXMucGxhbm5pbmdQb3B1cFJlZi5wbGFuT3JkZXIgPSBwbGFuT3JkZXI7XHJcbiAgICAgIHRoaXMucGxhbm5pbmdQb3B1cFJlZi50cmFuc3BvcnREYXkgPSB0cmFuc3BvcnREYXk7XHJcbiAgICAgIHRoaXMucGxhbm5pbmdQb3B1cFJlZi53ZWVrID0gd2VlaztcclxuICAgICAgdGhpcy5wbGFubmluZ1BvcHVwUmVmLnRyYW5zYWN0aW9uID0gdGhpcy5fdHJhbnNhY3Rpb24uY3VycmVudFRyYW5zYWN0aW9uO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZUF2YWlsYWJpbGl0eUNoZWNrZWQodmFsdWU6IHt0cmFuc3BvcnREYXk6UGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCBhdmFpbGFibGU6IGJvb2xlYW59KSB7XHJcbiAgICB0aGlzLmF2YWlsYWJpbGl0eS5wdXNoKHZhbHVlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjaGVja0F2YWlsYWJsZSh0cmFuc3BvcnREYXk6IFBsYW5uaW5nVHJhbnNwb3J0V2Vla0RheSkge1xyXG4gICAgbGV0IHRyYW5zcG9ydCA9IHRoaXMuYXZhaWxhYmlsaXR5LmZpbmQoIHRyYW5zcG9ydE9iamVjdCA9PiB0cmFuc3BvcnRPYmplY3QudHJhbnNwb3J0RGF5ID09PSB0cmFuc3BvcnREYXkpO1xyXG4gICAgaWYodHJhbnNwb3J0ICYmICF0cmFuc3BvcnQuYXZhaWxhYmxlKSB7XHJcbiAgICAgIHJldHVybiB0cnVlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIGhhbmRsZVRpbWVDaGFuZ2VFdmVudCh0cmFuc3BvcnREYXk6UGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCB3ZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSwgb2JqOiBPYmplY3QpIHtcclxuICAgIGxldCBvbGRXZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSA9IHdlZWs7XHJcbiAgICBsZXQgdHJhbnNOciA9IG9ialsndHJhbnNhY3Rpb25OciddO1xyXG4gICAgbGV0IG9yZGVyID0gdHJhbnNwb3J0RGF5LnBsYW5uZWRPcmRlcnMuZmluZCggcGxhbk9yZGVyID0+IHBsYW5PcmRlci50cmFuc2FjdGlvbk5yID09PSB0cmFuc05yKTtcclxuICAgIG9yZGVyLnN0YXJ0VGltZSA9IG5ldyBEYXRlKG9ialsnc3RhcnRUaW1lJ10pO1xyXG4gICAgb3JkZXIuZW5kVGltZSA9IG5ldyBEYXRlKG9ialsnZW5kVGltZSddKTtcclxuXHJcbiAgICB0aGlzLnVwZGF0ZVBsYW5uaW5nVHJhbnNwb3J0RXZlbnQuZW1pdCh7b2xkV2Vlazogb2xkV2Vlaywgd2Vlazogd2VlaywgYWN0aW9uOiBEZWxpdmVyeVBsYW5uaW5nVXBkYXRlQWN0aW9ucy5QbGFuT3JkZXJ9KTtcclxuICB9XHJcblxyXG5cclxuICBwdWJsaWMgaGFuZGxlRWRpdFBsYW5uZWRPcmRlciggcGxhbk9yZGVyOiBQbGFuT3JkZXIsIHRyYW5zcG9ydERheTogUGxhbm5pbmdUcmFuc3BvcnRXZWVrRGF5LCB3ZWVrOiBQbGFubmluZ1RyYW5zcG9ydFdlZWtEYXlbXSkge1xyXG4gICAgdGhpcy5vcGVuUGxhbm5pbmdQb3B1cChwbGFuT3JkZXIsIHRyYW5zcG9ydERheSwgd2Vlayk7XHJcbiAgfVxyXG59XHJcbiJdfQ==