@mintplayer/ng-bootstrap 13.1.24 → 13.1.25

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.
@@ -1,17 +1,21 @@
1
1
  import { Component, EventEmitter, HostListener, Input, Output, QueryList, ViewChildren } from '@angular/core';
2
- import { BehaviorSubject, combineLatest, map, Subject, take, takeUntil } from 'rxjs';
2
+ import { BehaviorSubject, combineLatest, filter, map, Subject, take, takeUntil } from 'rxjs';
3
3
  import { BsCalendarMonthService } from '../../../../services/calendar-month/calendar-month.service';
4
4
  import { EDragOperation } from '../../enums/drag-operation';
5
+ import { BsTimelineService } from '../../services/timeline/timeline.service';
5
6
  import * as i0 from "@angular/core";
6
7
  import * as i1 from "../../../../services/calendar-month/calendar-month.service";
7
- import * as i2 from "@angular/common";
8
- import * as i3 from "../../pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe";
9
- import * as i4 from "../../pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe";
10
- import * as i5 from "../../pipes/day-of-week/day-of-week.pipe";
8
+ import * as i2 from "../../services/timeline/timeline.service";
9
+ import * as i3 from "@angular/common";
10
+ import * as i4 from "../../pipes/bs-seconds-today-offset/bs-seconds-today-offset.pipe";
11
+ import * as i5 from "../../pipes/bs-seconds-timespan.pipe/bs-seconds-timespan.pipe";
12
+ import * as i6 from "../../pipes/day-of-week/day-of-week.pipe";
11
13
  export class BsSchedulerComponent {
12
- constructor(calendarMonthService) {
14
+ constructor(calendarMonthService, timelineService) {
13
15
  this.calendarMonthService = calendarMonthService;
14
- this.eventPartsForThisWeek$ = new BehaviorSubject([]);
16
+ this.timelineService = timelineService;
17
+ this.events$ = new BehaviorSubject([]);
18
+ this.previewEvent$ = new BehaviorSubject(null);
15
19
  this.timeSlotDuration$ = new BehaviorSubject(1800);
16
20
  this.mouseState$ = new BehaviorSubject(false);
17
21
  this.hoveredTimeSlot$ = new BehaviorSubject(null);
@@ -27,45 +31,69 @@ export class BsSchedulerComponent {
27
31
  weekMonday.setHours(0);
28
32
  weekMonday.setMinutes(0);
29
33
  weekMonday.setSeconds(0);
34
+ weekMonday.setMilliseconds(0);
30
35
  return Array.from(Array(7).keys()).map((x) => this.addDays(weekMonday, x));
31
36
  }));
32
- this.events$ = new BehaviorSubject([]);
33
- this.eventParts$ = this.events$.pipe(map((events) => {
34
- return events.map((ev) => {
35
- let startTime = ev.start;
36
- const result = [];
37
- while (!this.dateEquals(startTime, ev.end)) {
38
- const end = new Date(startTime.getFullYear(), startTime.getMonth(), startTime.getDate() + 1, 0, 0, 0);
39
- result.push({ start: startTime, end: end, event: ev });
40
- startTime = end;
41
- }
42
- if (startTime != ev.end) {
43
- result.push({ start: startTime, end: ev.end, event: ev });
44
- }
45
- return { event: ev, parts: result };
46
- });
37
+ this.daysOfWeekWithTimestamps$ = this.daysOfWeek$
38
+ .pipe(map((daysOfWeek) => {
39
+ return { start: daysOfWeek[0].getTime(), end: daysOfWeek[daysOfWeek.length - 1].getTime() + 24 * 60 * 60 * 1000 };
47
40
  }));
48
- combineLatest([
49
- this.daysOfWeek$
50
- .pipe(map((daysOfWeek) => {
51
- return { start: daysOfWeek[0].getTime(), end: daysOfWeek[daysOfWeek.length - 1].getTime() + 24 * 60 * 60 * 1000 };
52
- })),
41
+ this.eventParts$ = this.events$.pipe(map((events) => events.map((ev) => this.timelineService.splitInParts(ev))));
42
+ this.eventPartsForThisWeek$ = combineLatest([
43
+ this.daysOfWeekWithTimestamps$,
53
44
  this.eventParts$
54
45
  .pipe(map(eventParts => eventParts.map(evp => evp.parts)))
55
46
  .pipe(map(jaggedParts => {
56
47
  return jaggedParts.reduce((flat, toFlatten) => flat.concat(toFlatten), []);
57
- })),
58
- this.eventParts$
48
+ }))
59
49
  ])
60
- .pipe(map(([startAndEnd, eventParts, originalEventParts]) => {
50
+ .pipe(map(([startAndEnd, eventParts]) => {
61
51
  return eventParts.filter(eventPart => {
62
- return !((eventPart.end.getTime() < startAndEnd.start) || (eventPart.start.getTime() > startAndEnd.end));
52
+ return !((eventPart.end.getTime() <= startAndEnd.start) || (eventPart.start.getTime() >= startAndEnd.end));
63
53
  });
64
- }))
65
- .pipe(takeUntil(this.destroyed$))
66
- .subscribe((eventPartsForThisWeek) => {
67
- this.eventPartsForThisWeek$.next(eventPartsForThisWeek);
68
- });
54
+ }));
55
+ this.previewEventParts$ = this.previewEvent$.pipe(map((event) => {
56
+ if (event) {
57
+ return this.timelineService.splitInParts(event);
58
+ }
59
+ else {
60
+ return null;
61
+ }
62
+ }));
63
+ this.previewEventPartsForThisWeek$ = combineLatest([this.daysOfWeekWithTimestamps$, this.previewEventParts$])
64
+ .pipe(map(([startAndEnd, previewEventParts]) => {
65
+ if (previewEventParts) {
66
+ return previewEventParts.parts.filter(eventPart => {
67
+ return !((eventPart.end.getTime() <= startAndEnd.start) || (eventPart.start.getTime() >= startAndEnd.end));
68
+ });
69
+ }
70
+ else {
71
+ return [];
72
+ }
73
+ }));
74
+ this.timelinedEventPartsForThisWeek$ = this.eventPartsForThisWeek$
75
+ .pipe(map(eventParts => {
76
+ // We'll only use the events for this week
77
+ const events = eventParts.map(ep => ep.event)
78
+ .filter((e, i, list) => list.indexOf(e) === i)
79
+ .filter((e) => !!e)
80
+ .map((e) => e);
81
+ const timeline = this.timelineService.getTimeline(events);
82
+ const result = timeline.map(track => {
83
+ return track.events.map(ev => {
84
+ return { event: ev, index: track.index };
85
+ });
86
+ })
87
+ .reduce((flat, toFlatten) => flat.concat(toFlatten), [])
88
+ .map((evi) => eventParts.filter(p => p.event === evi.event).map(p => {
89
+ return { part: p, index: evi.index };
90
+ }))
91
+ .reduce((flat, toFlatten) => flat.concat(toFlatten), []);
92
+ return {
93
+ total: timeline.length,
94
+ parts: result
95
+ };
96
+ }));
69
97
  this.timeSlots$ = combineLatest([this.daysOfWeek$, this.timeSlotDuration$])
70
98
  .pipe(map(([daysOfWeek, duration]) => {
71
99
  const timeSlotsPerDay = Math.floor((60 * 60 * 24) / duration);
@@ -79,10 +107,12 @@ export class BsSchedulerComponent {
79
107
  start.setHours(timeSlotStart.getHours());
80
108
  start.setMinutes(timeSlotStart.getMinutes());
81
109
  start.setSeconds(timeSlotStart.getSeconds());
110
+ start.setMilliseconds(timeSlotStart.getMilliseconds());
82
111
  const end = new Date(day);
83
112
  end.setHours(timeSlotEnd.getHours());
84
113
  end.setMinutes(timeSlotEnd.getMinutes());
85
114
  end.setSeconds(timeSlotEnd.getSeconds());
115
+ end.setMilliseconds(timeSlotEnd.getMilliseconds());
86
116
  return { start, end };
87
117
  });
88
118
  });
@@ -100,11 +130,6 @@ export class BsSchedulerComponent {
100
130
  this.unitHeight$.next(value);
101
131
  }
102
132
  //#endregion
103
- dateEquals(date1, date2) {
104
- return (date1.getFullYear() === date2.getFullYear() &&
105
- date1.getMonth() === date2.getMonth() &&
106
- date1.getDate() === date2.getDate());
107
- }
108
133
  addDays(date, days) {
109
134
  const result = new Date(date);
110
135
  result.setDate(result.getDate() + days);
@@ -129,20 +154,24 @@ export class BsSchedulerComponent {
129
154
  event: {
130
155
  start: slot.start,
131
156
  end: slot.end,
132
- color: '#F00',
157
+ color: '#5AC8FA',
133
158
  description: 'Test event',
134
159
  }
135
160
  };
136
- this.events$.next([...this.events$.value, this.operation.event]);
161
+ this.previewEvent$.next({ start: slot.start, end: slot.end });
162
+ // this.events$.next([...this.events$.value, this.operation.event]);
137
163
  }
138
164
  onStartDragEvent(eventPart, ev) {
139
165
  ev.preventDefault();
140
166
  this.hoveredTimeSlot$.pipe(take(1)).subscribe((hoveredTimeSlot) => {
141
- this.dragStartTimeslot = hoveredTimeSlot;
142
- this.operation = {
143
- operation: EDragOperation.moveEvent,
144
- event: eventPart.event
145
- };
167
+ if (eventPart.event) {
168
+ this.dragStartTimeslot = hoveredTimeSlot;
169
+ this.operation = {
170
+ operation: EDragOperation.moveEvent,
171
+ event: eventPart.event,
172
+ };
173
+ this.previewEvent$.next({ start: eventPart.event.start, end: eventPart.event.end });
174
+ }
146
175
  });
147
176
  }
148
177
  //#region hoveredTimeslot$
@@ -187,15 +216,37 @@ export class BsSchedulerComponent {
187
216
  }
188
217
  else if (this.dragStartTimeslot.start.getTime() < hovered.start.getTime()) {
189
218
  // Drag down
190
- this.operation.event.start = this.dragStartTimeslot.start;
191
- this.operation.event.end = hovered.end;
192
- this.events$.next(this.events$.value);
219
+ // this.operation.event.start = this.dragStartTimeslot.start;
220
+ // this.operation.event.end = hovered.end;
221
+ // this.events$.next(this.events$.value);
222
+ this.previewEvent$
223
+ .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
224
+ .pipe(map((ev) => {
225
+ if (ev && this.dragStartTimeslot) {
226
+ ev.start = this.dragStartTimeslot.start;
227
+ ev.end = hovered.end;
228
+ }
229
+ return ev;
230
+ }))
231
+ .pipe(take(1))
232
+ .subscribe((ev) => this.previewEvent$.next(ev));
193
233
  }
194
234
  else if (this.dragStartTimeslot.start.getTime() > hovered.start.getTime()) {
195
235
  // Drag up
196
- this.operation.event.start = hovered.start;
197
- this.operation.event.end = this.dragStartTimeslot.end;
198
- this.events$.next(this.events$.value);
236
+ // this.operation.event.start = hovered.start;
237
+ // this.operation.event.end = this.dragStartTimeslot.end;
238
+ // this.events$.next(this.events$.value);
239
+ this.previewEvent$
240
+ .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
241
+ .pipe(map((ev) => {
242
+ if (ev && this.dragStartTimeslot) {
243
+ ev.start = hovered.start;
244
+ ev.end = this.dragStartTimeslot.end;
245
+ }
246
+ return ev;
247
+ }))
248
+ .pipe(take(1))
249
+ .subscribe((ev) => this.previewEvent$.next(ev));
199
250
  }
200
251
  }
201
252
  }
@@ -203,10 +254,22 @@ export class BsSchedulerComponent {
203
254
  case EDragOperation.moveEvent:
204
255
  {
205
256
  if (hovered && this.dragStartTimeslot) {
206
- this.operation.event.start.setTime(this.operation.event.start.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime());
207
- this.operation.event.end.setTime(this.operation.event.end.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime());
208
- this.dragStartTimeslot = hovered;
209
- this.events$.next(this.events$.value);
257
+ // this.operation.event.start.setTime(this.operation.event.start.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime());
258
+ // this.operation.event.end.setTime(this.operation.event.end.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime());
259
+ // this.dragStartTimeslot = hovered;
260
+ // // this.events$.next(this.events$.value);
261
+ this.previewEvent$
262
+ .pipe(filter((ev) => !!ev && !!this.dragStartTimeslot))
263
+ .pipe(map((ev) => {
264
+ if (ev && this.dragStartTimeslot) {
265
+ ev.start.setTime(ev.start.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime());
266
+ ev.end.setTime(ev.end.getTime() + hovered.start.getTime() - this.dragStartTimeslot.start.getTime());
267
+ this.dragStartTimeslot = hovered;
268
+ }
269
+ return ev;
270
+ }))
271
+ .pipe(take(1))
272
+ .subscribe((ev) => this.previewEvent$.next(ev));
210
273
  }
211
274
  }
212
275
  break;
@@ -220,16 +283,38 @@ export class BsSchedulerComponent {
220
283
  switch (this.operation.operation) {
221
284
  case EDragOperation.createEvent:
222
285
  {
223
- if (this.operation.event) {
224
- this.operation = null;
225
- this.dragStartTimeslot = null;
226
- }
286
+ combineLatest([this.previewEvent$])
287
+ .pipe(take(1))
288
+ .subscribe(([previewEvent]) => {
289
+ if (previewEvent) {
290
+ this.operation = null;
291
+ this.dragStartTimeslot = null;
292
+ this.events$.next([...this.events$.value, {
293
+ start: previewEvent.start,
294
+ end: previewEvent.end,
295
+ color: '#F00',
296
+ description: 'New event'
297
+ }]);
298
+ this.previewEvent$.next(null);
299
+ }
300
+ });
227
301
  }
228
302
  break;
229
303
  case EDragOperation.moveEvent:
230
304
  {
231
- this.operation = null;
232
- this.dragStartTimeslot = null;
305
+ this.previewEvent$
306
+ .pipe(filter((ev) => !!ev))
307
+ .pipe(take(1))
308
+ .subscribe((previewEvent) => {
309
+ if (this.operation && this.operation.event && previewEvent) {
310
+ this.operation.event.start = previewEvent.start;
311
+ this.operation.event.end = previewEvent.end;
312
+ this.operation = null;
313
+ this.dragStartTimeslot = null;
314
+ this.events$.next(this.events$.value);
315
+ this.previewEvent$.next(null);
316
+ }
317
+ });
233
318
  }
234
319
  break;
235
320
  }
@@ -239,12 +324,12 @@ export class BsSchedulerComponent {
239
324
  this.destroyed$.next(true);
240
325
  }
241
326
  }
242
- BsSchedulerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BsSchedulerComponent, deps: [{ token: i1.BsCalendarMonthService }], target: i0.ɵɵFactoryTarget.Component });
243
- BsSchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: BsSchedulerComponent, selector: "bs-scheduler", inputs: { unitHeight: "unitHeight" }, outputs: { unitHeightChange: "unitHeightChange" }, host: { listeners: { "document:mousemove": "onMousemove($event)", "document:mouseup": "onMouseUp($event)" } }, viewQueries: [{ propertyName: "timeSlotElements", predicate: ["slot"], descendants: true }], ngImport: i0, template: "{{ unitHeight$ | async }}\n<div class=\"table d-flex w-100 overflow-y-auto\" [style.max-height.px]=\"400\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeek()\">&lt;</button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeek()\">&gt;</button>\n </div>\n <div class=\"flex-grow-1\" *ngFor=\"let day of (daysOfWeek$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n {{ day | date: 'dd-MM-yyyy' }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\">\n <div class=\"position-relative\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of (timeSlots$ | async); let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"unitHeight$ | async\">\n <div class=\"calendar-cell calendar-left align-top py-0\">{{ timeslots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n \n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n\n <div *ngFor=\"let eventPart of (eventPartsForThisWeek$ | async)\" class=\"position-absolute event\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\" [style.background-color]=\"eventPart.event.color\" (mousedown)=\"onStartDragEvent(eventPart, $event)\">\n {{ eventPart.event.description }}\n <br>\n {{ eventPart.start | date: 'HH:mm:ss' }}\n <br>\n {{ eventPart.end | date: 'HH:mm:ss' }}\n </div>\n </div>\n \n <!-- <ng-container *ngFor=\"let eventWithParts of (eventParts$ | async)\">\n <div *ngFor=\"let eventPart of eventWithParts.parts\" class=\"position-absolute event\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * 40\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * 40\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\">\n {{ eventPart.start | date: 'HH:mm:ss' }} - {{ eventPart.end | date: 'HH:mm:ss' }}\n </div>\n </div>\n </ng-container> -->\n \n </ng-container>\n </div>\n </div>\n</div>", styles: [":host{display:block}.table{flex-flow:column}.table .calendar-head{flex:0 0 auto}.table .calendar-head>div{padding-right:18px}.table .calendar-body{flex:1 1 auto;display:block;overflow-y:visible;overflow-x:hidden}.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.table .calendar-body .calendar-cell.hover{border-top-width:3px}.table .calendar-left{width:90px}.event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none}.event .event-inner{position:absolute;left:4px;right:5px;top:4px;bottom:5px;cursor:move}\n"], directives: [{ type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i2.AsyncPipe, "date": i2.DatePipe, "bsSecondsTodayOffset": i3.BsSecondsTodayOffsetPipe, "bsSecondsTimespan": i4.BsSecondsTimespanPipe, "dayOfWeek": i5.DayOfWeekPipe } });
327
+ BsSchedulerComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BsSchedulerComponent, deps: [{ token: i1.BsCalendarMonthService }, { token: i2.BsTimelineService }], target: i0.ɵɵFactoryTarget.Component });
328
+ BsSchedulerComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.1", type: BsSchedulerComponent, selector: "bs-scheduler", inputs: { unitHeight: "unitHeight" }, outputs: { unitHeightChange: "unitHeightChange" }, host: { listeners: { "document:mousemove": "onMousemove($event)", "document:mouseup": "onMouseUp($event)" } }, viewQueries: [{ propertyName: "timeSlotElements", predicate: ["slot"], descendants: true }], ngImport: i0, template: "<div class=\"table d-flex w-100 overflow-y-auto\" [style.max-height.px]=\"null\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeek()\">&lt;</button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeek()\">&gt;</button>\n </div>\n <div class=\"flex-grow-1\" *ngFor=\"let day of (daysOfWeek$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n {{ day | date: 'dd-MM-yyyy' }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\">\n <div class=\"position-relative\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of (timeSlots$ | async); let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"unitHeight$ | async\">\n <div class=\"calendar-cell calendar-left align-top py-0\">{{ timeslots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n \n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\">\n <div class=\"event-border\"></div>\n <ng-container *ngIf=\"eventPart.part.event\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\" [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"></div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>", styles: [":host{display:block}.table{flex-flow:column}.table .calendar-head{flex:0 0 auto}.table .calendar-head>div{padding-right:18px}.table .calendar-body{flex:1 1 auto;display:block;overflow-y:visible;overflow-x:hidden}.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.table .calendar-body .calendar-cell.hover{border-top-width:3px}.table .calendar-left{width:90px}.event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.event.preview{background:#666;opacity:.6}.event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.event .event-inner{position:relative;left:0px;right:5px;top:0px;bottom:5px;cursor:move;pointer-events:all}.event .event-inner .event-bg{opacity:.5;width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px);transition:opacity .15s ease-in-out}.event .event-inner .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.event .event-inner:hover .event-bg{opacity:.7}\n"], directives: [{ type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }], pipes: { "async": i3.AsyncPipe, "date": i3.DatePipe, "bsSecondsTodayOffset": i4.BsSecondsTodayOffsetPipe, "bsSecondsTimespan": i5.BsSecondsTimespanPipe, "dayOfWeek": i6.DayOfWeekPipe } });
244
329
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImport: i0, type: BsSchedulerComponent, decorators: [{
245
330
  type: Component,
246
- args: [{ selector: 'bs-scheduler', template: "{{ unitHeight$ | async }}\n<div class=\"table d-flex w-100 overflow-y-auto\" [style.max-height.px]=\"400\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeek()\">&lt;</button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeek()\">&gt;</button>\n </div>\n <div class=\"flex-grow-1\" *ngFor=\"let day of (daysOfWeek$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n {{ day | date: 'dd-MM-yyyy' }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\">\n <div class=\"position-relative\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of (timeSlots$ | async); let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"unitHeight$ | async\">\n <div class=\"calendar-cell calendar-left align-top py-0\">{{ timeslots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n \n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n\n <div *ngFor=\"let eventPart of (eventPartsForThisWeek$ | async)\" class=\"position-absolute event\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\" [style.background-color]=\"eventPart.event.color\" (mousedown)=\"onStartDragEvent(eventPart, $event)\">\n {{ eventPart.event.description }}\n <br>\n {{ eventPart.start | date: 'HH:mm:ss' }}\n <br>\n {{ eventPart.end | date: 'HH:mm:ss' }}\n </div>\n </div>\n \n <!-- <ng-container *ngFor=\"let eventWithParts of (eventParts$ | async)\">\n <div *ngFor=\"let eventPart of eventWithParts.parts\" class=\"position-absolute event\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * 40\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * 40\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\">\n {{ eventPart.start | date: 'HH:mm:ss' }} - {{ eventPart.end | date: 'HH:mm:ss' }}\n </div>\n </div>\n </ng-container> -->\n \n </ng-container>\n </div>\n </div>\n</div>", styles: [":host{display:block}.table{flex-flow:column}.table .calendar-head{flex:0 0 auto}.table .calendar-head>div{padding-right:18px}.table .calendar-body{flex:1 1 auto;display:block;overflow-y:visible;overflow-x:hidden}.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.table .calendar-body .calendar-cell.hover{border-top-width:3px}.table .calendar-left{width:90px}.event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:relative;-webkit-user-select:none;user-select:none}.event .event-inner{position:absolute;left:4px;right:5px;top:4px;bottom:5px;cursor:move}\n"] }]
247
- }], ctorParameters: function () { return [{ type: i1.BsCalendarMonthService }]; }, propDecorators: { timeSlotElements: [{
331
+ args: [{ selector: 'bs-scheduler', template: "<div class=\"table d-flex w-100 overflow-y-auto\" [style.max-height.px]=\"null\">\n <div class=\"calendar-head\">\n <div class=\"w-100 d-flex flex-row\">\n <div class=\"d-flex calendar-left justify-content-between\">\n <button class=\"btn btn-default flex-start\" (click)=\"onPreviousWeek()\">&lt;</button>\n <button class=\"btn btn-default flex-end\" (click)=\"onNextWeek()\">&gt;</button>\n </div>\n <div class=\"flex-grow-1\" *ngFor=\"let day of (daysOfWeek$ | async)\">\n <span class=\"d-block col-form-label text-center\">\n {{ day | date: 'dd-MM-yyyy' }}\n </span>\n </div>\n </div>\n </div>\n <div class=\"calendar-body\">\n <div class=\"position-relative\">\n <!-- Timeslots -->\n <div *ngFor=\"let timeslots of (timeSlots$ | async); let i = index\" class=\"d-flex flex-row p-0 timeslot\" [style.height.px]=\"unitHeight$ | async\">\n <div class=\"calendar-cell calendar-left align-top py-0\">{{ timeslots[0].start | date: 'HH:mm:ss' }}</div>\n <div class=\"calendar-cell flex-grow-1\" *ngFor=\"let slot of timeslots; let j = index\" #slot (mousedown)=\"onCreateEvent($event, slot)\" [attr.data-row]=\"i\" [attr.data-column]=\"j\"></div>\n </div>\n \n <!-- Events -->\n <ng-container *ngIf=\"(timeSlotDuration$ | async) as timeSlotDuration\">\n <ng-container *ngIf=\"(timelinedEventPartsForThisWeek$ | async) as partData\">\n <div *ngFor=\"let eventPart of partData.parts\" class=\"event p-0\"\n [style.top.px]=\"(eventPart.part | bsSecondsTodayOffset) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart.part | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner\"\n [style.width]=\"'calc(100% / ' + partData.total + ')'\"\n [style.height.px]=\"(eventPart.part | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.margin-left]=\"'calc(100% / ' + partData.total + ' * ' + eventPart.index + ')'\"\n (mousedown)=\"onStartDragEvent(eventPart.part, $event)\">\n <div class=\"event-border\"></div>\n <ng-container *ngIf=\"eventPart.part.event\">\n <div class=\"event-bg\" [style.background-color]=\"eventPart.part.event.color\"></div>\n <div class=\"event-label\">{{ eventPart.part.event.description }}</div>\n </ng-container>\n </div>\n </div>\n </ng-container>\n <ng-container *ngIf=\"(previewEventPartsForThisWeek$ | async) as previewPartData\">\n <div *ngFor=\"let eventPart of previewPartData\" class=\"event preview p-0\"\n [style.top.px]=\"(eventPart | bsSecondsTodayOffset) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"\n [style.left]=\"'calc(90px + ((100% - 90px) / 7 * ' + ((eventPart | dayOfWeek) - 1) + '))'\">\n <div class=\"event-inner w-100\" [style.height.px]=\"(eventPart | bsSecondsTimespan) / timeSlotDuration * (unitHeight$ | async)!\"></div>\n </div>\n </ng-container>\n </ng-container>\n </div>\n </div>\n</div>", styles: [":host{display:block}.table{flex-flow:column}.table .calendar-head{flex:0 0 auto}.table .calendar-head>div{padding-right:18px}.table .calendar-body{flex:1 1 auto;display:block;overflow-y:visible;overflow-x:hidden}.table .calendar-body .calendar-cell{border-right:1px solid #DEE2E6;border-bottom:1px solid #DEE2E6;cursor:default}.table .calendar-body .calendar-cell.hover{border-top-width:3px}.table .calendar-left{width:90px}.event{z-index:5;width:calc((100% - 90px) / 7);height:100px;overflow:hidden;position:absolute;-webkit-user-select:none;user-select:none;pointer-events:none}.event.preview{background:#666;opacity:.6}.event .event-border{background:black;top:0;left:0;bottom:3px;width:3px;position:absolute;z-index:10;opacity:.3}.event .event-inner{position:relative;left:0px;right:5px;top:0px;bottom:5px;cursor:move;pointer-events:all}.event .event-inner .event-bg{opacity:.5;width:calc(100% - 2px);margin:1px auto 1px 0;height:calc(100% - 3px);transition:opacity .15s ease-in-out}.event .event-inner .event-label{position:absolute;top:0;font-size:12px;font-weight:600;padding:4px}.event .event-inner:hover .event-bg{opacity:.7}\n"] }]
332
+ }], ctorParameters: function () { return [{ type: i1.BsCalendarMonthService }, { type: i2.BsTimelineService }]; }, propDecorators: { timeSlotElements: [{
248
333
  type: ViewChildren,
249
334
  args: ['slot']
250
335
  }], unitHeightChange: [{
@@ -258,4 +343,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.1", ngImpor
258
343
  type: HostListener,
259
344
  args: ['document:mouseup', ['$event']]
260
345
  }] } });
261
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlci9jb21wb25lbnRzL3NjaGVkdWxlci9zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGVyL2NvbXBvbmVudHMvc2NoZWR1bGVyL3NjaGVkdWxlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBYyxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUNqRyxPQUFPLEVBQUUsc0JBQXNCLEVBQUUsTUFBTSw0REFBNEQsQ0FBQztBQUNwRyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7Ozs7Ozs7QUFZNUQsTUFBTSxPQUFPLG9CQUFvQjtJQUMvQixZQUFvQixvQkFBNEM7UUFBNUMseUJBQW9CLEdBQXBCLG9CQUFvQixDQUF3QjtRQTJGaEUsMkJBQXNCLEdBQUcsSUFBSSxlQUFlLENBQXVCLEVBQUUsQ0FBQyxDQUFDO1FBR3ZFLHNCQUFpQixHQUFHLElBQUksZUFBZSxDQUFTLElBQUksQ0FBQyxDQUFDO1FBRXRELGdCQUFXLEdBQUcsSUFBSSxlQUFlLENBQVUsS0FBSyxDQUFDLENBQUM7UUFDbEQscUJBQWdCLEdBQUcsSUFBSSxlQUFlLENBQWtCLElB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LElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRTtZQUNsQixRQUFRLElBQUksQ0FBQyxTQUFTLENBQUMsU0FBUyxFQUFFO2dCQUNoQyxLQUFLLGNBQWMsQ0FBQyxXQUFXO29CQUFFO3dCQUMvQixJQUFJLElBQUksQ0FBQyxTQUFTLENBQUMsS0FBSyxFQUFFOzRCQUN4QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzs0QkFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQzt5QkFDL0I7cUJBQ0Y7b0JBQUMsTUFBTTtnQkFDUixLQUFLLGNBQWMsQ0FBQyxTQUFTO29CQUFFO3dCQUM3QixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQzt3QkFDdEIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLElBQUksQ0FBQztxQkFDL0I7b0JBQUMsTUFBTTthQUNUO1NBQ0Y7SUFDSCxDQUFDO0lBRUQsV0FBVztRQUNULElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQzdCLENBQUM7O2lIQXZRVSxvQkFBb0I7cUdBQXBCLG9CQUFvQix5VkNmakMseXdHQXFETTsyRkR0Q08sb0JBQW9CO2tCQUxoQyxTQUFTOytCQUNFLGNBQWM7NkdBeUdGLGdCQUFnQjtzQkFBckMsWUFBWTt1QkFBQyxNQUFNO2dCQUlILGdCQUFnQjtzQkFBaEMsTUFBTTtnQkFJYSxVQUFVO3NCQUE3QixLQUFLO2dCQThGTixXQUFXO3NCQURWLFlBQVk7dUJBQUMsb0JBQW9CLEVBQUUsQ0FBQyxRQUFRLENBQUM7Z0JBMEM5QyxTQUFTO3NCQURSLFlBQVk7dUJBQUMsa0JBQWtCLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIEV2ZW50RW1pdHRlciwgSG9zdExpc3RlbmVyLCBJbnB1dCwgT25EZXN0cm95LCBPdXRwdXQsIFF1ZXJ5TGlzdCwgVmlld0NoaWxkcmVuIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCZWhhdmlvclN1YmplY3QsIGNvbWJpbmVMYXRlc3QsIG1hcCwgT2JzZXJ2YWJsZSwgU3ViamVjdCwgdGFrZSwgdGFrZVVudGlsIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBCc0NhbGVuZGFyTW9udGhTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vLi4vLi4vc2VydmljZXMvY2FsZW5kYXItbW9udGgvY2FsZW5kYXItbW9udGguc2VydmljZSc7XG5pbXBvcnQgeyBFRHJhZ09wZXJhdGlvbiB9IGZyb20gJy4uLy4uL2VudW1zL2RyYWctb3BlcmF0aW9uJztcbmltcG9ydCB7IERyYWdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL2RyYWctb3BlcmF0aW9uJztcbmltcG9ydCB7IFNjaGVkdWxlckV2ZW50IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQnO1xuaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnRQYXJ0IH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQtcGFydCc7XG5pbXBvcnQgeyBTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvc2NoZWR1bGVyLWV2ZW50LXdpdGgtcGFydHMnO1xuaW1wb3J0IHsgVGltZVNsb3QgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3RpbWUtc2xvdCc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLXNjaGVkdWxlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY2hlZHVsZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2hlZHVsZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGVuZGFyTW9udGhTZXJ2aWNlOiBCc0NhbGVuZGFyTW9udGhTZXJ2aWNlKSB7XG4gICAgY29uc3QgbW9uZGF5ID0gdGhpcy5jYWxlbmRhck1vbnRoU2VydmljZS5nZXRNb25kYXlCZWZvcmUobmV3IERhdGUoKSk7XG4gICAgdGhpcy5jdXJyZW50V2VlayQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PERhdGU+KG1vbmRheSk7XG5cbiAgICB0aGlzLmRheXNPZldlZWskID0gdGhpcy5jdXJyZW50V2VlayQucGlwZShcbiAgICAgIG1hcCgod2Vla01vbmRheSkgPT4ge1xuICAgICAgICB3ZWVrTW9uZGF5LnNldEhvdXJzKDApO1xuICAgICAgICB3ZWVrTW9uZGF5LnNldE1pbnV0ZXMoMCk7XG4gICAgICAgIHdlZWtNb25kYXkuc2V0U2Vjb25kcygwKTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkoNykua2V5cygpKS5tYXAoKHgpID0+IHRoaXMuYWRkRGF5cyh3ZWVrTW9uZGF5LCB4KSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmV2ZW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlckV2ZW50W10+KFtdKTtcbiAgICB0aGlzLmV2ZW50UGFydHMkID0gdGhpcy5ldmVudHMkLnBpcGUoXG4gICAgICBtYXAoKGV2ZW50cykgPT4ge1xuICAgICAgICByZXR1cm4gZXZlbnRzLm1hcCgoZXYpID0+IHtcbiAgICAgICAgICBsZXQgc3RhcnRUaW1lID0gZXYuc3RhcnQ7XG4gICAgICAgICAgY29uc3QgcmVzdWx0OiBTY2hlZHVsZXJFdmVudFBhcnRbXSA9IFtdO1xuICAgICAgICAgIHdoaWxlICghdGhpcy5kYXRlRXF1YWxzKHN0YXJ0VGltZSwgZXYuZW5kKSkge1xuICAgICAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoc3RhcnRUaW1lLmdldEZ1bGxZZWFyKCksIHN0YXJ0VGltZS5nZXRNb250aCgpLCBzdGFydFRpbWUuZ2V0RGF0ZSgpICsgMSwgMCwgMCwgMCk7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7IHN0YXJ0OiBzdGFydFRpbWUsIGVuZDogZW5kLCBldmVudDogZXYgfSk7XG4gICAgICAgICAgICBzdGFydFRpbWUgPSBlbmQ7XG4gICAgICAgICAgfVxuICAgICAgICAgIGlmIChzdGFydFRpbWUgIT0gZXYuZW5kKSB7XG4gICAgICAgICAgICByZXN1bHQucHVzaCh7IHN0YXJ0OiBzdGFydFRpbWUsIGVuZDogZXYuZW5kLCBldmVudDogZXYgfSk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIDxTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cz57IGV2ZW50OiBldiwgcGFydHM6IHJlc3VsdCB9O1xuICAgICAgICB9KTtcbiAgICAgIH0pXG4gICAgKTtcblxuICAgIGNvbWJpbmVMYXRlc3QoW1xuICAgICAgICB0aGlzLmRheXNPZldlZWskXG4gICAgICAgICAgLnBpcGUobWFwKChkYXlzT2ZXZWVrKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4geyBzdGFydDogZGF5c09mV2Vla1swXS5nZXRUaW1lKCksIGVuZDogZGF5c09mV2Vla1tkYXlzT2ZXZWVrLmxlbmd0aCAtIDFdLmdldFRpbWUoKSArIDI0ICogNjAgKiA2MCAqIDEwMDAgfTtcbiAgICAgICAgICB9KSksXG4gICAgICAgIHRoaXMuZXZlbnRQYXJ0cyRcbiAgICAgICAgICAucGlwZShtYXAoZXZlbnRQYXJ0cyA9PiBldmVudFBhcnRzLm1hcChldnAgPT4gZXZwLnBhcnRzKSkpXG4gICAgICAgICAgLnBpcGUobWFwKGphZ2dlZFBhcnRzID0+IHtcbiAgICAgICAgICAgIHJldHVybiBqYWdnZWRQYXJ0cy5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pO1xuICAgICAgICAgIH0pKSxcbiAgICAgICAgdGhpcy5ldmVudFBhcnRzJFxuICAgICAgXSlcbiAgICAgIC5waXBlKG1hcCgoW3N0YXJ0QW5kRW5kLCBldmVudFBhcnRzLCBvcmlnaW5hbEV2ZW50UGFydHNdKSA9PiB7XG4gICAgICAgIHJldHVybiBldmVudFBhcnRzLmZpbHRlcihldmVudFBhcnQgPT4ge1xuICAgICAgICAgIHJldHVybiAhKChldmVudFBhcnQuZW5kLmdldFRpbWUoKSA8IHN0YXJ0QW5kRW5kLnN0YXJ0KSB8fCAoZXZlbnRQYXJ0LnN0YXJ0LmdldFRpbWUoKSA+IHN0YXJ0QW5kRW5kLmVuZCkpO1xuICAgICAgICB9KTtcbiAgICAgIH0pKVxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKChldmVudFBhcnRzRm9yVGhpc1dlZWspID0+IHtcbiAgICAgICAgdGhpcy5ldmVudFBhcnRzRm9yVGhpc1dlZWskLm5leHQoZXZlbnRQYXJ0c0ZvclRoaXNXZWVrKTtcbiAgICAgIH0pO1xuXG4gICAgdGhpcy50aW1lU2xvdHMkID0gY29tYmluZUxhdGVzdChbdGhpcy5kYXlzT2ZXZWVrJCwgdGhpcy50aW1lU2xvdER1cmF0aW9uJF0pXG4gICAgICAucGlwZShtYXAoKFtkYXlzT2ZXZWVrLCBkdXJhdGlvbl0pID0+IHtcbiAgICAgICAgY29uc3QgdGltZVNsb3RzUGVyRGF5ID0gTWF0aC5mbG9vcigoNjAgKiA2MCAqIDI0KSAvIGR1cmF0aW9uKTtcblxuICAgICAgICByZXR1cm4gQXJyYXkuZnJvbShBcnJheSh0aW1lU2xvdHNQZXJEYXkpLmtleXMoKSkubWFwKChpbmRleCkgPT4ge1xuICAgICAgICAgIGNvbnN0IHRpbWVTbG90U3RhcnQgPSBuZXcgRGF0ZShkYXlzT2ZXZWVrWzBdKTtcbiAgICAgICAgICB0aW1lU2xvdFN0YXJ0LnNldFNlY29uZHModGltZVNsb3RTdGFydC5nZXRTZWNvbmRzKCkgKyBpbmRleCAqIGR1cmF0aW9uKTtcbiAgICAgICAgICBjb25zdCB0aW1lU2xvdEVuZCA9IG5ldyBEYXRlKHRpbWVTbG90U3RhcnQpO1xuICAgICAgICAgIHRpbWVTbG90RW5kLnNldFNlY29uZHModGltZVNsb3RFbmQuZ2V0U2Vjb25kcygpICsgZHVyYXRpb24pO1xuXG4gICAgICAgICAgcmV0dXJuIGRheXNPZldlZWsubWFwKChkYXkpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHN0YXJ0ID0gbmV3IERhdGUoZGF5KTtcbiAgICAgICAgICAgIHN0YXJ0LnNldEhvdXJzKHRpbWVTbG90U3RhcnQuZ2V0SG91cnMoKSk7XG4gICAgICAgICAgICBzdGFydC5zZXRNaW51dGVzKHRpbWVTbG90U3RhcnQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIHN0YXJ0LnNldFNlY29uZHModGltZVNsb3RTdGFydC5nZXRTZWNvbmRzKCkpO1xuXG4gICAgICAgICAgICBjb25zdCBlbmQgPSBuZXcgRGF0ZShkYXkpO1xuICAgICAgICAgICAgZW5kLnNldEhvdXJzKHRpbWVTbG90RW5kLmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgZW5kLnNldE1pbnV0ZXModGltZVNsb3RFbmQuZ2V0TWludXRlcygpKTtcbiAgICAgICAgICAgIGVuZC5zZXRTZWNvbmRzKHRpbWVTbG90RW5kLmdldFNlY29uZHMoKSk7XG5cbiAgICAgICAgICAgIHJldHVybiA8VGltZVNsb3Q+eyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9KSk7XG4gICAgXG4gICAgdGhpcy51bml0SGVpZ2h0JFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCh1bml0SGVpZ2h0KSA9PiB7XG4gICAgICAgIHRoaXMudW5pdEhlaWdodENoYW5nZS5lbWl0KHVuaXRIZWlnaHQpO1xuICAgICAgfSlcbiAgfVxuXG4gIGV2ZW50cyQ6IEJlaGF2aW9yU3ViamVjdDxTY2hlZHVsZXJFdmVudFtdPjtcbiAgZXZlbnRQYXJ0cyQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRXaXRoUGFydHNbXT47XG4gIGV2ZW50UGFydHNGb3JUaGlzV2VlayQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlckV2ZW50UGFydFtdPihbXSk7XG4gIGN1cnJlbnRXZWVrJDogQmVoYXZpb3JTdWJqZWN0PERhdGU+O1xuICBkYXlzT2ZXZWVrJDogT2JzZXJ2YWJsZTxEYXRlW10+O1xuICB0aW1lU2xvdER1cmF0aW9uJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8bnVtYmVyPigxODAwKTtcbiAgdGltZVNsb3RzJDogT2JzZXJ2YWJsZTxUaW1lU2xvdFtdW10+O1xuICBtb3VzZVN0YXRlJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8Ym9vbGVhbj4oZmFsc2UpO1xuICBob3ZlcmVkVGltZVNsb3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxUaW1lU2xvdCB8IG51bGw+KG51bGwpO1xuICBkZXN0cm95ZWQkID0gbmV3IFN1YmplY3QoKTtcblxuICBAVmlld0NoaWxkcmVuKCdzbG90JykgdGltZVNsb3RFbGVtZW50cyE6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPEhUTUxEaXZFbGVtZW50Pj47XG5cbiAgLy8jcmVnaW9uIFVuaXRIZWlnaHRcbiAgdW5pdEhlaWdodCQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oNDApO1xuICBAT3V0cHV0KCkgcHVibGljIHVuaXRIZWlnaHRDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcbiAgcHVibGljIGdldCB1bml0SGVpZ2h0KCkge1xuICAgIHJldHVybiB0aGlzLnVuaXRIZWlnaHQkLnZhbHVlO1xuICB9XG4gIEBJbnB1dCgpIHB1YmxpYyBzZXQgdW5pdEhlaWdodCh2YWx1ZTogbnVtYmVyKSB7XG4gICAgdGhpcy51bml0SGVpZ2h0JC5uZXh0KHZhbHVlKTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBwcml2YXRlIGRhdGVFcXVhbHMoZGF0ZTE6IERhdGUsIGRhdGUyOiBEYXRlKSB7XG4gICAgcmV0dXJuIChcbiAgICAgIGRhdGUxLmdldEZ1bGxZZWFyKCkgPT09IGRhdGUyLmdldEZ1bGxZZWFyKCkgJiZcbiAgICAgIGRhdGUxLmdldE1vbnRoKCkgPT09IGRhdGUyLmdldE1vbnRoKCkgJiZcbiAgICAgIGRhdGUxLmdldERhdGUoKSA9PT0gZGF0ZTIuZ2V0RGF0ZSgpXG4gICAgKTtcbiAgfVxuXG4gIHByaXZhdGUgYWRkRGF5cyhkYXRlOiBEYXRlLCBkYXlzOiBudW1iZXIpIHtcbiAgICBjb25zdCByZXN1bHQgPSBuZXcgRGF0ZShkYXRlKTtcbiAgICByZXN1bHQuc2V0RGF0ZShyZXN1bHQuZ2V0RGF0ZSgpICsgZGF5cyk7XG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxuXG4gIG9uUHJldmlvdXNXZWVrKCkge1xuICAgIHRoaXMuY3VycmVudFdlZWskXG4gICAgICAucGlwZShtYXAoKHcpID0+IHRoaXMuYWRkRGF5cyh3LCAtNykpLCB0YWtlKDEpKVxuICAgICAgLnN1YnNjcmliZSgodykgPT4gdGhpcy5jdXJyZW50V2VlayQubmV4dCh3KSk7XG4gIH1cblxuICBvbk5leHRXZWVrKCkge1xuICAgIHRoaXMuY3VycmVudFdlZWskXG4gICAgICAucGlwZShtYXAoKHcpID0+IHRoaXMuYWRkRGF5cyh3LCA3KSksIHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh3KSA9PiB0aGlzLmN1cnJlbnRXZWVrJC5uZXh0KHcpKTtcbiAgfVxuXG4gIG9wZXJhdGlvbjogRHJhZ09wZXJhdGlvbiB8IG51bGwgPSBudWxsO1xuICBkcmFnU3RhcnRUaW1lc2xvdDogVGltZVNsb3QgfCBudWxsID0gbnVsbDtcbiAgb25DcmVhdGVFdmVudChldjogTW91c2VFdmVudCwgc2xvdDogVGltZVNsb3QpIHtcbiAgICBldi5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIHRoaXMubW91c2VTdGF0ZSQubmV4dCh0cnVlKTtcbiAgICB0aGlzLmRyYWdTdGFydFRpbWVzbG90ID0gc2xvdDtcbiAgICB0aGlzLm9wZXJhdGlvbiA9IHtcbiAgICAgIG9wZXJhdGlvbjogRURyYWdPcGVyYXRpb24uY3JlYXRlRXZlbnQsXG4gICAgICBldmVudDoge1xuICAgICAgICBzdGFydDogc2xvdC5zdGFydCxcbiAgICAgICAgZW5kOiBzbG90LmVuZCxcbiAgICAgICAgY29sb3I6ICcjRjAwJyxcbiAgICAgICAgZGVzY3JpcHRpb246ICdUZXN0IGV2ZW50JyxcbiAgICAgIH1cbiAgICB9O1xuICAgIHRoaXMuZXZlbnRzJC5uZXh0KFsuLi50aGlzLmV2ZW50cyQudmFsdWUsIHRoaXMub3BlcmF0aW9uLmV2ZW50XSk7XG4gIH1cblxuICBvblN0YXJ0RHJhZ0V2ZW50KGV2ZW50UGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBldjogTW91c2VFdmVudCkge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5ob3ZlcmVkVGltZVNsb3QkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChob3ZlcmVkVGltZVNsb3QpID0+IHtcbiAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBob3ZlcmVkVGltZVNsb3Q7XG4gICAgICB0aGlzLm9wZXJhdGlvbiA9IHtcbiAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQsXG4gICAgICAgIGV2ZW50OiBldmVudFBhcnQuZXZlbnRcbiAgICAgIH1cbiAgICB9KTtcbiAgfVxuXG4gIC8vI3JlZ2lvbiBob3ZlcmVkVGltZXNsb3QkXG4gIHByaXZhdGUgZ2V0SG92ZXJlZFRpbWVzbG90KGV2OiBNb3VzZUV2ZW50LCB0aW1lU2xvdHM6IFRpbWVTbG90W11bXSkge1xuICAgIGNvbnN0IGhvdmVyZWRTbG90cyA9IHRoaXMudGltZVNsb3RFbGVtZW50cy5maWx0ZXIoKGVsKSA9PiB7XG4gICAgICBjb25zdCByY3QgPSBlbC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICAgICAgaWYgKHJjdC5sZWZ0IDw9IGV2LnggJiYgZXYueCA8PSByY3QucmlnaHQgJiYgcmN0LnRvcCA8PSBldi55ICYmIGV2LnkgPD0gcmN0LmJvdHRvbSkge1xuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9KTtcblxuICAgIGlmICghaG92ZXJlZFNsb3RzIHx8IGhvdmVyZWRTbG90cy5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIGNvbnN0IHNsb3RFbGVtZW50ID0gaG92ZXJlZFNsb3RzWzBdLm5hdGl2ZUVsZW1lbnQ7XG5cbiAgICBjb25zdCBzdHJSb3cgPSBzbG90RWxlbWVudC5nZXRBdHRyaWJ1dGUoJ2RhdGEtcm93Jyk7XG4gICAgaWYgKCFzdHJSb3cpIHtcbiAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgICBjb25zdCByb3cgPSBwYXJzZUludChzdHJSb3cpO1xuXG4gICAgY29uc3Qgc3RyQ29sdW1uID0gc2xvdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLWNvbHVtbicpO1xuICAgIGlmICghc3RyQ29sdW1uKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3QgY29sdW1uID0gcGFyc2VJbnQoc3RyQ29sdW1uKTtcblxuICAgIGNvbnN0IHNsb3QgPSB0aW1lU2xvdHNbcm93XVtjb2x1bW5dO1xuICAgIHJldHVybiBzbG90O1xuICB9XG5cbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6bW91c2Vtb3ZlJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZW1vdmUoZXY6IE1vdXNlRXZlbnQpIHtcbiAgICB0aGlzLnRpbWVTbG90cyQucGlwZSh0YWtlKDEpKS5zdWJzY3JpYmUoKHRpbWVTbG90cykgPT4ge1xuICAgICAgY29uc3QgaG92ZXJlZCA9IHRoaXMuZ2V0SG92ZXJlZFRpbWVzbG90KGV2LCB0aW1lU2xvdHMpO1xuICAgICAgdGhpcy5ob3ZlcmVkVGltZVNsb3QkLm5leHQoaG92ZXJlZCk7XG5cbiAgICAgIGlmICh0aGlzLm9wZXJhdGlvbikge1xuICAgICAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uLm9wZXJhdGlvbikge1xuICAgICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24uY3JlYXRlRXZlbnQ6IHtcbiAgICAgICAgICAgIGlmICh0aGlzLm9wZXJhdGlvbi5ldmVudCAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90ICYmIGhvdmVyZWQgJiYgKHRoaXMub3BlcmF0aW9uLmV2ZW50LmVuZC5nZXRUaW1lKCkgIT0gaG92ZXJlZC5lbmQuZ2V0VGltZSgpKSkge1xuICAgICAgICAgICAgICBpZiAodGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkgPT09IGhvdmVyZWQuc3RhcnQuZ2V0VGltZSgpKSB7XG4gICAgICAgICAgICAgICAgLy8gMSBzbG90XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkgPCBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIC8vIERyYWcgZG93blxuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uLmV2ZW50LnN0YXJ0ID0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQgPSBob3ZlcmVkLmVuZDtcbiAgICAgICAgICAgICAgICB0aGlzLmV2ZW50cyQubmV4dCh0aGlzLmV2ZW50cyQudmFsdWUpO1xuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpID4gaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnIHVwXG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24uZXZlbnQuc3RhcnQgPSBob3ZlcmVkLnN0YXJ0O1xuICAgICAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uLmV2ZW50LmVuZCA9IHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QuZW5kO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzJC5uZXh0KHRoaXMuZXZlbnRzJC52YWx1ZSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgXG4gICAgICAgICAgICB9XG4gICAgICAgICAgfSBicmVhaztcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLm1vdmVFdmVudDoge1xuICAgICAgICAgICAgaWYgKGhvdmVyZWQgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCkge1xuICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydC5zZXRUaW1lKHRoaXMub3BlcmF0aW9uLmV2ZW50LnN0YXJ0LmdldFRpbWUoKSArIGhvdmVyZWQuc3RhcnQuZ2V0VGltZSgpIC0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkpO1xuICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQuc2V0VGltZSh0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQuZ2V0VGltZSgpICsgaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkgLSB0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSk7XG4gICAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBob3ZlcmVkO1xuICAgICAgICAgICAgICB0aGlzLmV2ZW50cyQubmV4dCh0aGlzLmV2ZW50cyQudmFsdWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgIH0gYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgIH0pO1xuICB9XG4gIC8vI2VuZHJlZ2lvblxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNldXAnLCBbJyRldmVudCddKVxuICBvbk1vdXNlVXAoZXY6IE1vdXNlRXZlbnQpIHtcbiAgICBpZiAodGhpcy5vcGVyYXRpb24pIHtcbiAgICAgIHN3aXRjaCAodGhpcy5vcGVyYXRpb24ub3BlcmF0aW9uKSB7XG4gICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24uY3JlYXRlRXZlbnQ6IHtcbiAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24uZXZlbnQpIHtcbiAgICAgICAgICAgIHRoaXMub3BlcmF0aW9uID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBudWxsO1xuICAgICAgICAgIH1cbiAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQ6IHtcbiAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IG51bGw7XG4gICAgICAgIH0gYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsInt7IHVuaXRIZWlnaHQkIHwgYXN5bmMgfX1cbjxkaXYgY2xhc3M9XCJ0YWJsZSBkLWZsZXggdy0xMDAgb3ZlcmZsb3cteS1hdXRvXCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwiNDAwXCI+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWhlYWRcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInctMTAwIGQtZmxleCBmbGV4LXJvd1wiPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cImQtZmxleCBjYWxlbmRhci1sZWZ0IGp1c3RpZnktY29udGVudC1iZXR3ZWVuXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBmbGV4LXN0YXJ0XCIgKGNsaWNrKT1cIm9uUHJldmlvdXNXZWVrKClcIj4mbHQ7PC9idXR0b24+XG4gICAgICAgICAgICAgICAgPGJ1dHRvbiBjbGFzcz1cImJ0biBidG4tZGVmYXVsdCBmbGV4LWVuZFwiIChjbGljayk9XCJvbk5leHRXZWVrKClcIj4mZ3Q7PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJmbGV4LWdyb3ctMVwiICpuZ0Zvcj1cImxldCBkYXkgb2YgKGRheXNPZldlZWskIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gY2xhc3M9XCJkLWJsb2NrIGNvbC1mb3JtLWxhYmVsIHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIHt7IGRheSB8IGRhdGU6ICdkZC1NTS15eXl5JyB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItYm9keVwiPlxuICAgICAgICA8ZGl2IGNsYXNzPVwicG9zaXRpb24tcmVsYXRpdmVcIj5cbiAgICAgICAgICAgIDwhLS0gVGltZXNsb3RzIC0tPlxuICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgdGltZXNsb3RzIG9mICh0aW1lU2xvdHMkIHwgYXN5bmMpOyBsZXQgaSA9IGluZGV4XCIgY2xhc3M9XCJkLWZsZXggZmxleC1yb3cgcC0wIHRpbWVzbG90XCIgW3N0eWxlLmhlaWdodC5weF09XCJ1bml0SGVpZ2h0JCB8IGFzeW5jXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwgY2FsZW5kYXItbGVmdCBhbGlnbi10b3AgcHktMFwiPnt7IHRpbWVzbG90c1swXS5zdGFydCB8IGRhdGU6ICdISDptbTpzcycgfX08L2Rpdj5cbiAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiY2FsZW5kYXItY2VsbCBmbGV4LWdyb3ctMVwiICpuZ0Zvcj1cImxldCBzbG90IG9mIHRpbWVzbG90czsgbGV0IGogPSBpbmRleFwiICNzbG90IChtb3VzZWRvd24pPVwib25DcmVhdGVFdmVudCgkZXZlbnQsIHNsb3QpXCIgW2F0dHIuZGF0YS1yb3ddPVwiaVwiIFthdHRyLmRhdGEtY29sdW1uXT1cImpcIj48L2Rpdj5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgXG4gICAgICAgICAgICA8IS0tIEV2ZW50cyAtLT5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIodGltZVNsb3REdXJhdGlvbiQgfCBhc3luYykgYXMgdGltZVNsb3REdXJhdGlvblwiPlxuXG4gICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIChldmVudFBhcnRzRm9yVGhpc1dlZWskIHwgYXN5bmMpXCIgY2xhc3M9XCJwb3NpdGlvbi1hYnNvbHV0ZSBldmVudFwiXG4gICAgICAgICAgICAgICAgICAgIFtzdHlsZS50b3AucHhdPVwiKGV2ZW50UGFydCB8IGJzU2Vjb25kc1RvZGF5T2Zmc2V0KSAvIHRpbWVTbG90RHVyYXRpb24gKiAodW5pdEhlaWdodCQgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVGltZXNwYW4pIC8gdGltZVNsb3REdXJhdGlvbiAqICh1bml0SGVpZ2h0JCB8IGFzeW5jKSFcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCInY2FsYyg5MHB4ICsgKCgxMDAlIC0gOTBweCkgLyA3ICogJyArICgoZXZlbnRQYXJ0IHwgZGF5T2ZXZWVrKSAtIDEpICsgJykpJ1wiPlxuICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtaW5uZXJcIiBbc3R5bGUuYmFja2dyb3VuZC1jb2xvcl09XCJldmVudFBhcnQuZXZlbnQuY29sb3JcIiAobW91c2Vkb3duKT1cIm9uU3RhcnREcmFnRXZlbnQoZXZlbnRQYXJ0LCAkZXZlbnQpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBldmVudFBhcnQuZXZlbnQuZGVzY3JpcHRpb24gfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV2ZW50UGFydC5zdGFydCB8IGRhdGU6ICdISDptbTpzcycgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIDxicj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGV2ZW50UGFydC5lbmQgfCBkYXRlOiAnSEg6bW06c3MnIH19XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgICAgIDwhLS0gPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgZXZlbnRXaXRoUGFydHMgb2YgKGV2ZW50UGFydHMkIHwgYXN5bmMpXCI+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IGV2ZW50UGFydCBvZiBldmVudFdpdGhQYXJ0cy5wYXJ0c1wiIGNsYXNzPVwicG9zaXRpb24tYWJzb2x1dGUgZXZlbnRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVG9kYXlPZmZzZXQpIC8gdGltZVNsb3REdXJhdGlvbiAqIDQwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5oZWlnaHQucHhdPVwiKGV2ZW50UGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiA0MFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUubGVmdF09XCInY2FsYyg5MHB4ICsgKCgxMDAlIC0gOTBweCkgLyA3ICogJyArICgoZXZlbnRQYXJ0IHwgZGF5T2ZXZWVrKSAtIDEpICsgJykpJ1wiPlxuICAgICAgICAgICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImV2ZW50LWlubmVyXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZXZlbnRQYXJ0LnN0YXJ0IHwgZGF0ZTogJ0hIOm1tOnNzJyB9fSAtIHt7IGV2ZW50UGFydC5lbmQgfCBkYXRlOiAnSEg6bW06c3MnIH19XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+IC0tPlxuICAgICAgICAgICAgICAgIFxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
346
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlci9jb21wb25lbnRzL3NjaGVkdWxlci9zY2hlZHVsZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vLi4vbGlicy9taW50cGxheWVyLW5nLWJvb3RzdHJhcC9zcmMvbGliL2NvbXBvbmVudHMvc2NoZWR1bGVyL2NvbXBvbmVudHMvc2NoZWR1bGVyL3NjaGVkdWxlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFjLFlBQVksRUFBRSxZQUFZLEVBQUUsS0FBSyxFQUFhLE1BQU0sRUFBRSxTQUFTLEVBQUUsWUFBWSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JJLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQWMsT0FBTyxFQUFFLElBQUksRUFBRSxTQUFTLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDekcsT0FBTyxFQUFFLHNCQUFzQixFQUFFLE1BQU0sNERBQTRELENBQUM7QUFDcEcsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBTzVELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBDQUEwQyxDQUFDOzs7Ozs7OztBQU83RSxNQUFNLE9BQU8sb0JBQW9CO0lBQy9CLFlBQW9CLG9CQUE0QyxFQUFVLGVBQWtDO1FBQXhGLHlCQUFvQixHQUFwQixvQkFBb0IsQ0FBd0I7UUFBVSxvQkFBZSxHQUFmLGVBQWUsQ0FBbUI7UUF3SDVHLFlBQU8sR0FBRyxJQUFJLGVBQWUsQ0FBbUIsRUFBRSxDQUFDLENBQUM7UUFLcEQsa0JBQWEsR0FBRyxJQUFJLGVBQWUsQ0FBc0IsSUFBSSxD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Qy9CO3dCQUNILENBQUMsQ0FBQyxDQUFDO3FCQUNOO29CQUFDLE1BQU07YUFDVDtTQUNGO0lBQ0gsQ0FBQztJQUVELFdBQVc7UUFDVCxJQUFJLENBQUMsVUFBVSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUM3QixDQUFDOztpSEFsV1Usb0JBQW9CO3FHQUFwQixvQkFBb0IseVZDakJqQyx1ekhBcURNOzJGRHBDTyxvQkFBb0I7a0JBTGhDLFNBQVM7K0JBQ0UsY0FBYzs2SUErSUYsZ0JBQWdCO3NCQUFyQyxZQUFZO3VCQUFDLE1BQU07Z0JBSUgsZ0JBQWdCO3NCQUFoQyxNQUFNO2dCQUlhLFVBQVU7c0JBQTdCLEtBQUs7Z0JBMkZOLFdBQVc7c0JBRFYsWUFBWTt1QkFBQyxvQkFBb0IsRUFBRSxDQUFDLFFBQVEsQ0FBQztnQkE0RTlDLFNBQVM7c0JBRFIsWUFBWTt1QkFBQyxrQkFBa0IsRUFBRSxDQUFDLFFBQVEsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IENvbXBvbmVudCwgRWxlbWVudFJlZiwgRXZlbnRFbWl0dGVyLCBIb3N0TGlzdGVuZXIsIElucHV0LCBPbkRlc3Ryb3ksIE91dHB1dCwgUXVlcnlMaXN0LCBWaWV3Q2hpbGRyZW4gfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJlaGF2aW9yU3ViamVjdCwgY29tYmluZUxhdGVzdCwgZmlsdGVyLCBtYXAsIE9ic2VydmFibGUsIFN1YmplY3QsIHRha2UsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgQnNDYWxlbmRhck1vbnRoU2VydmljZSB9IGZyb20gJy4uLy4uLy4uLy4uL3NlcnZpY2VzL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLnNlcnZpY2UnO1xuaW1wb3J0IHsgRURyYWdPcGVyYXRpb24gfSBmcm9tICcuLi8uLi9lbnVtcy9kcmFnLW9wZXJhdGlvbic7XG5pbXBvcnQgeyBEcmFnT3BlcmF0aW9uIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9kcmFnLW9wZXJhdGlvbic7XG5pbXBvcnQgeyBQcmV2aWV3RXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3ByZXZpZXctZXZlbnQnO1xuaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NjaGVkdWxlci1ldmVudCc7XG5pbXBvcnQgeyBTY2hlZHVsZXJFdmVudFBhcnQgfSBmcm9tICcuLi8uLi9pbnRlcmZhY2VzL3NjaGVkdWxlci1ldmVudC1wYXJ0JztcbmltcG9ydCB7IFNjaGVkdWxlckV2ZW50V2l0aFBhcnRzIH0gZnJvbSAnLi4vLi4vaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQtd2l0aC1wYXJ0cyc7XG5pbXBvcnQgeyBUaW1lU2xvdCB9IGZyb20gJy4uLy4uL2ludGVyZmFjZXMvdGltZS1zbG90JztcbmltcG9ydCB7IEJzVGltZWxpbmVTZXJ2aWNlIH0gZnJvbSAnLi4vLi4vc2VydmljZXMvdGltZWxpbmUvdGltZWxpbmUuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2JzLXNjaGVkdWxlcicsXG4gIHRlbXBsYXRlVXJsOiAnLi9zY2hlZHVsZXIuY29tcG9uZW50Lmh0bWwnLFxuICBzdHlsZVVybHM6IFsnLi9zY2hlZHVsZXIuY29tcG9uZW50LnNjc3MnXSxcbn0pXG5leHBvcnQgY2xhc3MgQnNTY2hlZHVsZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkRlc3Ryb3kge1xuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGNhbGVuZGFyTW9udGhTZXJ2aWNlOiBCc0NhbGVuZGFyTW9udGhTZXJ2aWNlLCBwcml2YXRlIHRpbWVsaW5lU2VydmljZTogQnNUaW1lbGluZVNlcnZpY2UpIHtcbiAgICBjb25zdCBtb25kYXkgPSB0aGlzLmNhbGVuZGFyTW9udGhTZXJ2aWNlLmdldE1vbmRheUJlZm9yZShuZXcgRGF0ZSgpKTtcbiAgICB0aGlzLmN1cnJlbnRXZWVrJCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8RGF0ZT4obW9uZGF5KTtcblxuICAgIHRoaXMuZGF5c09mV2VlayQgPSB0aGlzLmN1cnJlbnRXZWVrJC5waXBlKFxuICAgICAgbWFwKCh3ZWVrTW9uZGF5KSA9PiB7XG4gICAgICAgIHdlZWtNb25kYXkuc2V0SG91cnMoMCk7XG4gICAgICAgIHdlZWtNb25kYXkuc2V0TWludXRlcygwKTtcbiAgICAgICAgd2Vla01vbmRheS5zZXRTZWNvbmRzKDApO1xuICAgICAgICB3ZWVrTW9uZGF5LnNldE1pbGxpc2Vjb25kcygwKTtcbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkoNykua2V5cygpKS5tYXAoKHgpID0+IHRoaXMuYWRkRGF5cyh3ZWVrTW9uZGF5LCB4KSk7XG4gICAgICB9KVxuICAgICk7XG5cbiAgICB0aGlzLmRheXNPZldlZWtXaXRoVGltZXN0YW1wcyQgPSB0aGlzLmRheXNPZldlZWskXG4gICAgICAucGlwZShtYXAoKGRheXNPZldlZWspID0+IHtcbiAgICAgICAgcmV0dXJuIHsgc3RhcnQ6IGRheXNPZldlZWtbMF0uZ2V0VGltZSgpLCBlbmQ6IGRheXNPZldlZWtbZGF5c09mV2Vlay5sZW5ndGggLSAxXS5nZXRUaW1lKCkgKyAyNCAqIDYwICogNjAgKiAxMDAwIH07XG4gICAgICB9KSk7XG5cbiAgICB0aGlzLmV2ZW50UGFydHMkID0gdGhpcy5ldmVudHMkLnBpcGUoXG4gICAgICBtYXAoKGV2ZW50cykgPT4gIGV2ZW50cy5tYXAoKGV2KSA9PiB0aGlzLnRpbWVsaW5lU2VydmljZS5zcGxpdEluUGFydHMoZXYpKSlcbiAgICApO1xuXG4gICAgdGhpcy5ldmVudFBhcnRzRm9yVGhpc1dlZWskID0gY29tYmluZUxhdGVzdChbXG4gICAgICB0aGlzLmRheXNPZldlZWtXaXRoVGltZXN0YW1wcyQsXG4gICAgICB0aGlzLmV2ZW50UGFydHMkXG4gICAgICAgIC5waXBlKG1hcChldmVudFBhcnRzID0+IGV2ZW50UGFydHMubWFwKGV2cCA9PiBldnAucGFydHMpKSlcbiAgICAgICAgLnBpcGUobWFwKGphZ2dlZFBhcnRzID0+IHtcbiAgICAgICAgICByZXR1cm4gamFnZ2VkUGFydHMucmVkdWNlKChmbGF0LCB0b0ZsYXR0ZW4pID0+IGZsYXQuY29uY2F0KHRvRmxhdHRlbiksIFtdKTtcbiAgICAgICAgfSkpXG4gICAgICBdKVxuICAgICAgLnBpcGUobWFwKChbc3RhcnRBbmRFbmQsIGV2ZW50UGFydHNdKSA9PiB7XG4gICAgICAgIHJldHVybiBldmVudFBhcnRzLmZpbHRlcihldmVudFBhcnQgPT4ge1xuICAgICAgICAgIHJldHVybiAhKChldmVudFBhcnQuZW5kLmdldFRpbWUoKSA8PSBzdGFydEFuZEVuZC5zdGFydCkgfHwgKGV2ZW50UGFydC5zdGFydC5nZXRUaW1lKCkgPj0gc3RhcnRBbmRFbmQuZW5kKSk7XG4gICAgICAgIH0pO1xuICAgICAgfSkpO1xuXG4gICAgdGhpcy5wcmV2aWV3RXZlbnRQYXJ0cyQgPSB0aGlzLnByZXZpZXdFdmVudCQucGlwZShcbiAgICAgIG1hcCgoZXZlbnQpID0+IHtcbiAgICAgICAgaWYgKGV2ZW50KSB7XG4gICAgICAgICAgcmV0dXJuIHRoaXMudGltZWxpbmVTZXJ2aWNlLnNwbGl0SW5QYXJ0cyhldmVudClcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuICAgICAgfSlcbiAgICApO1xuICAgIHRoaXMucHJldmlld0V2ZW50UGFydHNGb3JUaGlzV2VlayQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLmRheXNPZldlZWtXaXRoVGltZXN0YW1wcyQsIHRoaXMucHJldmlld0V2ZW50UGFydHMkXSlcbiAgICAgIC5waXBlKG1hcCgoW3N0YXJ0QW5kRW5kLCBwcmV2aWV3RXZlbnRQYXJ0c10pID0+IHtcbiAgICAgICAgaWYgKHByZXZpZXdFdmVudFBhcnRzKSB7XG4gICAgICAgICAgcmV0dXJuIHByZXZpZXdFdmVudFBhcnRzLnBhcnRzLmZpbHRlcihldmVudFBhcnQgPT4ge1xuICAgICAgICAgICAgcmV0dXJuICEoKGV2ZW50UGFydC5lbmQuZ2V0VGltZSgpIDw9IHN0YXJ0QW5kRW5kLnN0YXJ0KSB8fCAoZXZlbnRQYXJ0LnN0YXJ0LmdldFRpbWUoKSA+PSBzdGFydEFuZEVuZC5lbmQpKTtcbiAgICAgICAgICB9KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gW107XG4gICAgICAgIH1cbiAgICAgIH0pKTtcblxuICAgIHRoaXMudGltZWxpbmVkRXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCA9IHRoaXMuZXZlbnRQYXJ0c0ZvclRoaXNXZWVrJFxuICAgICAgLnBpcGUobWFwKGV2ZW50UGFydHMgPT4ge1xuICAgICAgICAvLyBXZSdsbCBvbmx5IHVzZSB0aGUgZXZlbnRzIGZvciB0aGlzIHdlZWtcbiAgICAgICAgY29uc3QgZXZlbnRzID0gZXZlbnRQYXJ0cy5tYXAoZXAgPT4gZXAuZXZlbnQpXG4gICAgICAgICAgLmZpbHRlcigoZSwgaSwgbGlzdCkgPT4gbGlzdC5pbmRleE9mKGUpID09PSBpKVxuICAgICAgICAgIC5maWx0ZXIoKGUpID0+ICEhZSlcbiAgICAgICAgICAubWFwKChlKSA9PiA8U2NoZWR1bGVyRXZlbnQ+ZSk7XG4gICAgICAgIGNvbnN0IHRpbWVsaW5lID0gdGhpcy50aW1lbGluZVNlcnZpY2UuZ2V0VGltZWxpbmUoZXZlbnRzKTtcblxuICAgICAgICBjb25zdCByZXN1bHQgPSB0aW1lbGluZS5tYXAodHJhY2sgPT4ge1xuICAgICAgICAgIHJldHVybiB0cmFjay5ldmVudHMubWFwKGV2ID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IGV2ZW50OiBldiwgaW5kZXg6IHRyYWNrLmluZGV4IH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pXG4gICAgICAgIC5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pXG4gICAgICAgIC5tYXAoKGV2aSkgPT4gZXZlbnRQYXJ0cy5maWx0ZXIocCA9PiBwLmV2ZW50ID09PSBldmkuZXZlbnQpLm1hcChwID0+IHtcbiAgICAgICAgICAgIHJldHVybiB7IHBhcnQ6IHAsIGluZGV4OiBldmkuaW5kZXggfTtcbiAgICAgICAgICB9KVxuICAgICAgICApXG4gICAgICAgIC5yZWR1Y2UoKGZsYXQsIHRvRmxhdHRlbikgPT4gZmxhdC5jb25jYXQodG9GbGF0dGVuKSwgW10pO1xuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgdG90YWw6IHRpbWVsaW5lLmxlbmd0aCxcbiAgICAgICAgICBwYXJ0czogcmVzdWx0XG4gICAgICAgIH07XG4gICAgICB9KSlcblxuICAgIHRoaXMudGltZVNsb3RzJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF5c09mV2VlayQsIHRoaXMudGltZVNsb3REdXJhdGlvbiRdKVxuICAgICAgLnBpcGUobWFwKChbZGF5c09mV2VlaywgZHVyYXRpb25dKSA9PiB7XG4gICAgICAgIGNvbnN0IHRpbWVTbG90c1BlckRheSA9IE1hdGguZmxvb3IoKDYwICogNjAgKiAyNCkgLyBkdXJhdGlvbik7XG5cbiAgICAgICAgcmV0dXJuIEFycmF5LmZyb20oQXJyYXkodGltZVNsb3RzUGVyRGF5KS5rZXlzKCkpLm1hcCgoaW5kZXgpID0+IHtcbiAgICAgICAgICBjb25zdCB0aW1lU2xvdFN0YXJ0ID0gbmV3IERhdGUoZGF5c09mV2Vla1swXSk7XG4gICAgICAgICAgdGltZVNsb3RTdGFydC5zZXRTZWNvbmRzKHRpbWVTbG90U3RhcnQuZ2V0U2Vjb25kcygpICsgaW5kZXggKiBkdXJhdGlvbik7XG4gICAgICAgICAgY29uc3QgdGltZVNsb3RFbmQgPSBuZXcgRGF0ZSh0aW1lU2xvdFN0YXJ0KTtcbiAgICAgICAgICB0aW1lU2xvdEVuZC5zZXRTZWNvbmRzKHRpbWVTbG90RW5kLmdldFNlY29uZHMoKSArIGR1cmF0aW9uKTtcblxuICAgICAgICAgIHJldHVybiBkYXlzT2ZXZWVrLm1hcCgoZGF5KSA9PiB7XG4gICAgICAgICAgICBjb25zdCBzdGFydCA9IG5ldyBEYXRlKGRheSk7XG4gICAgICAgICAgICBzdGFydC5zZXRIb3Vycyh0aW1lU2xvdFN0YXJ0LmdldEhvdXJzKCkpO1xuICAgICAgICAgICAgc3RhcnQuc2V0TWludXRlcyh0aW1lU2xvdFN0YXJ0LmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICBzdGFydC5zZXRTZWNvbmRzKHRpbWVTbG90U3RhcnQuZ2V0U2Vjb25kcygpKTtcbiAgICAgICAgICAgIHN0YXJ0LnNldE1pbGxpc2Vjb25kcyh0aW1lU2xvdFN0YXJ0LmdldE1pbGxpc2Vjb25kcygpKTtcblxuICAgICAgICAgICAgY29uc3QgZW5kID0gbmV3IERhdGUoZGF5KTtcbiAgICAgICAgICAgIGVuZC5zZXRIb3Vycyh0aW1lU2xvdEVuZC5nZXRIb3VycygpKTtcbiAgICAgICAgICAgIGVuZC5zZXRNaW51dGVzKHRpbWVTbG90RW5kLmdldE1pbnV0ZXMoKSk7XG4gICAgICAgICAgICBlbmQuc2V0U2Vjb25kcyh0aW1lU2xvdEVuZC5nZXRTZWNvbmRzKCkpO1xuICAgICAgICAgICAgZW5kLnNldE1pbGxpc2Vjb25kcyh0aW1lU2xvdEVuZC5nZXRNaWxsaXNlY29uZHMoKSk7XG5cbiAgICAgICAgICAgIHJldHVybiA8VGltZVNsb3Q+eyBzdGFydCwgZW5kIH07XG4gICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuXG4gICAgICB9KSk7XG4gICAgXG4gICAgdGhpcy51bml0SGVpZ2h0JFxuICAgICAgLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveWVkJCkpXG4gICAgICAuc3Vic2NyaWJlKCh1bml0SGVpZ2h0KSA9PiB7XG4gICAgICAgIHRoaXMudW5pdEhlaWdodENoYW5nZS5lbWl0KHVuaXRIZWlnaHQpO1xuICAgICAgfSlcbiAgfVxuXG4gIGV2ZW50cyQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PFNjaGVkdWxlckV2ZW50W10+KFtdKTtcbiAgZXZlbnRQYXJ0cyQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRXaXRoUGFydHNbXT47XG4gIGV2ZW50UGFydHNGb3JUaGlzV2VlayQ6IE9ic2VydmFibGU8U2NoZWR1bGVyRXZlbnRQYXJ0W10+O1xuICB0aW1lbGluZWRFdmVudFBhcnRzRm9yVGhpc1dlZWskOiBPYnNlcnZhYmxlPHsgdG90YWw6IG51bWJlciwgcGFydHM6IHsgcGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBpbmRleDogbnVtYmVyfVtdIH0+O1xuICBcbiAgcHJldmlld0V2ZW50JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8UHJldmlld0V2ZW50IHwgbnVsbD4obnVsbCk7XG4gIHByZXZpZXdFdmVudFBhcnRzJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFdpdGhQYXJ0cyB8IG51bGw+O1xuICBwcmV2aWV3RXZlbnRQYXJ0c0ZvclRoaXNXZWVrJDogT2JzZXJ2YWJsZTxTY2hlZHVsZXJFdmVudFBhcnRbXT47XG4gIFxuICBjdXJyZW50V2VlayQ6IEJlaGF2aW9yU3ViamVjdDxEYXRlPjtcbiAgZGF5c09mV2VlayQ6IE9ic2VydmFibGU8RGF0ZVtdPjtcbiAgZGF5c09mV2Vla1dpdGhUaW1lc3RhbXBzJDogT2JzZXJ2YWJsZTx7c3RhcnQ6IG51bWJlciwgZW5kOiBudW1iZXJ9PjtcbiAgdGltZVNsb3REdXJhdGlvbiQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PG51bWJlcj4oMTgwMCk7XG4gIHRpbWVTbG90cyQ6IE9ic2VydmFibGU8VGltZVNsb3RbXVtdPjtcbiAgbW91c2VTdGF0ZSQgPSBuZXcgQmVoYXZpb3JTdWJqZWN0PGJvb2xlYW4+KGZhbHNlKTtcbiAgaG92ZXJlZFRpbWVTbG90JCA9IG5ldyBCZWhhdmlvclN1YmplY3Q8VGltZVNsb3QgfCBudWxsPihudWxsKTtcbiAgZGVzdHJveWVkJCA9IG5ldyBTdWJqZWN0KCk7XG5cbiAgQFZpZXdDaGlsZHJlbignc2xvdCcpIHRpbWVTbG90RWxlbWVudHMhOiBRdWVyeUxpc3Q8RWxlbWVudFJlZjxIVE1MRGl2RWxlbWVudD4+O1xuXG4gIC8vI3JlZ2lvbiBVbml0SGVpZ2h0XG4gIHVuaXRIZWlnaHQkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxudW1iZXI+KDQwKTtcbiAgQE91dHB1dCgpIHB1YmxpYyB1bml0SGVpZ2h0Q2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxudW1iZXI+KCk7XG4gIHB1YmxpYyBnZXQgdW5pdEhlaWdodCgpIHtcbiAgICByZXR1cm4gdGhpcy51bml0SGVpZ2h0JC52YWx1ZTtcbiAgfVxuICBASW5wdXQoKSBwdWJsaWMgc2V0IHVuaXRIZWlnaHQodmFsdWU6IG51bWJlcikge1xuICAgIHRoaXMudW5pdEhlaWdodCQubmV4dCh2YWx1ZSk7XG4gIH1cbiAgLy8jZW5kcmVnaW9uXG5cbiAgcHJpdmF0ZSBhZGREYXlzKGRhdGU6IERhdGUsIGRheXM6IG51bWJlcikge1xuICAgIGNvbnN0IHJlc3VsdCA9IG5ldyBEYXRlKGRhdGUpO1xuICAgIHJlc3VsdC5zZXREYXRlKHJlc3VsdC5nZXREYXRlKCkgKyBkYXlzKTtcbiAgICByZXR1cm4gcmVzdWx0O1xuICB9XG5cbiAgb25QcmV2aW91c1dlZWsoKSB7XG4gICAgdGhpcy5jdXJyZW50V2VlayRcbiAgICAgIC5waXBlKG1hcCgodykgPT4gdGhpcy5hZGREYXlzKHcsIC03KSksIHRha2UoMSkpXG4gICAgICAuc3Vic2NyaWJlKCh3KSA9PiB0aGlzLmN1cnJlbnRXZWVrJC5uZXh0KHcpKTtcbiAgfVxuXG4gIG9uTmV4dFdlZWsoKSB7XG4gICAgdGhpcy5jdXJyZW50V2VlayRcbiAgICAgIC5waXBlKG1hcCgodykgPT4gdGhpcy5hZGREYXlzKHcsIDcpKSwgdGFrZSgxKSlcbiAgICAgIC5zdWJzY3JpYmUoKHcpID0+IHRoaXMuY3VycmVudFdlZWskLm5leHQodykpO1xuICB9XG5cbiAgb3BlcmF0aW9uOiBEcmFnT3BlcmF0aW9uIHwgbnVsbCA9IG51bGw7XG4gIGRyYWdTdGFydFRpbWVzbG90OiBUaW1lU2xvdCB8IG51bGwgPSBudWxsO1xuICBvbkNyZWF0ZUV2ZW50KGV2OiBNb3VzZUV2ZW50LCBzbG90OiBUaW1lU2xvdCkge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5tb3VzZVN0YXRlJC5uZXh0KHRydWUpO1xuICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBzbG90O1xuICAgIHRoaXMub3BlcmF0aW9uID0ge1xuICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5jcmVhdGVFdmVudCxcbiAgICAgIGV2ZW50OiB7XG4gICAgICAgIHN0YXJ0OiBzbG90LnN0YXJ0LFxuICAgICAgICBlbmQ6IHNsb3QuZW5kLFxuICAgICAgICBjb2xvcjogJyM1QUM4RkEnLFxuICAgICAgICBkZXNjcmlwdGlvbjogJ1Rlc3QgZXZlbnQnLFxuICAgICAgfVxuICAgIH07XG4gICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoeyBzdGFydDogc2xvdC5zdGFydCwgZW5kOiBzbG90LmVuZCB9KTtcblxuICAgIC8vIHRoaXMuZXZlbnRzJC5uZXh0KFsuLi50aGlzLmV2ZW50cyQudmFsdWUsIHRoaXMub3BlcmF0aW9uLmV2ZW50XSk7XG4gIH1cblxuICBvblN0YXJ0RHJhZ0V2ZW50KGV2ZW50UGFydDogU2NoZWR1bGVyRXZlbnRQYXJ0LCBldjogTW91c2VFdmVudCkge1xuICAgIGV2LnByZXZlbnREZWZhdWx0KCk7XG4gICAgdGhpcy5ob3ZlcmVkVGltZVNsb3QkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKChob3ZlcmVkVGltZVNsb3QpID0+IHtcbiAgICAgIGlmIChldmVudFBhcnQuZXZlbnQpIHtcbiAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWRUaW1lU2xvdDtcbiAgICAgICAgdGhpcy5vcGVyYXRpb24gPSB7XG4gICAgICAgICAgb3BlcmF0aW9uOiBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQsXG4gICAgICAgICAgZXZlbnQ6IGV2ZW50UGFydC5ldmVudCxcbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoeyBzdGFydDogZXZlbnRQYXJ0LmV2ZW50LnN0YXJ0LCBlbmQ6IGV2ZW50UGFydC5ldmVudC5lbmQgfSk7XG4gICAgICB9XG4gICAgfSk7XG4gIH1cblxuICAvLyNyZWdpb24gaG92ZXJlZFRpbWVzbG90JFxuICBwcml2YXRlIGdldEhvdmVyZWRUaW1lc2xvdChldjogTW91c2VFdmVudCwgdGltZVNsb3RzOiBUaW1lU2xvdFtdW10pIHtcbiAgICBjb25zdCBob3ZlcmVkU2xvdHMgPSB0aGlzLnRpbWVTbG90RWxlbWVudHMuZmlsdGVyKChlbCkgPT4ge1xuICAgICAgY29uc3QgcmN0ID0gZWwubmF0aXZlRWxlbWVudC5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcbiAgICAgIGlmIChyY3QubGVmdCA8PSBldi54ICYmIGV2LnggPD0gcmN0LnJpZ2h0ICYmIHJjdC50b3AgPD0gZXYueSAmJiBldi55IDw9IHJjdC5ib3R0b20pIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICBpZiAoIWhvdmVyZWRTbG90cyB8fCBob3ZlcmVkU2xvdHMubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG5cbiAgICBjb25zdCBzbG90RWxlbWVudCA9IGhvdmVyZWRTbG90c1swXS5uYXRpdmVFbGVtZW50O1xuXG4gICAgY29uc3Qgc3RyUm93ID0gc2xvdEVsZW1lbnQuZ2V0QXR0cmlidXRlKCdkYXRhLXJvdycpO1xuICAgIGlmICghc3RyUm93KSB7XG4gICAgICByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgY29uc3Qgcm93ID0gcGFyc2VJbnQoc3RyUm93KTtcblxuICAgIGNvbnN0IHN0ckNvbHVtbiA9IHNsb3RFbGVtZW50LmdldEF0dHJpYnV0ZSgnZGF0YS1jb2x1bW4nKTtcbiAgICBpZiAoIXN0ckNvbHVtbikge1xuICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuICAgIGNvbnN0IGNvbHVtbiA9IHBhcnNlSW50KHN0ckNvbHVtbik7XG5cbiAgICBjb25zdCBzbG90ID0gdGltZVNsb3RzW3Jvd11bY29sdW1uXTtcbiAgICByZXR1cm4gc2xvdDtcbiAgfVxuXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50Om1vdXNlbW92ZScsIFsnJGV2ZW50J10pXG4gIG9uTW91c2Vtb3ZlKGV2OiBNb3VzZUV2ZW50KSB7XG4gICAgdGhpcy50aW1lU2xvdHMkLnBpcGUodGFrZSgxKSkuc3Vic2NyaWJlKCh0aW1lU2xvdHMpID0+IHtcbiAgICAgIGNvbnN0IGhvdmVyZWQgPSB0aGlzLmdldEhvdmVyZWRUaW1lc2xvdChldiwgdGltZVNsb3RzKTtcbiAgICAgIHRoaXMuaG92ZXJlZFRpbWVTbG90JC5uZXh0KGhvdmVyZWQpO1xuXG4gICAgICBpZiAodGhpcy5vcGVyYXRpb24pIHtcbiAgICAgICAgc3dpdGNoICh0aGlzLm9wZXJhdGlvbi5vcGVyYXRpb24pIHtcbiAgICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50OiB7XG4gICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24uZXZlbnQgJiYgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCAmJiBob3ZlcmVkICYmICh0aGlzLm9wZXJhdGlvbi5ldmVudC5lbmQuZ2V0VGltZSgpICE9IGhvdmVyZWQuZW5kLmdldFRpbWUoKSkpIHtcbiAgICAgICAgICAgICAgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpID09PSBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIC8vIDEgc2xvdFxuICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpIDwgaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEcmFnIGRvd25cbiAgICAgICAgICAgICAgICAvLyB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydCA9IHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kID0gaG92ZXJlZC5lbmQ7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ldmVudHMkLm5leHQodGhpcy5ldmVudHMkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYgJiYgISF0aGlzLmRyYWdTdGFydFRpbWVzbG90KSlcbiAgICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gaG92ZXJlZC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XG4gICAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5zdGFydC5nZXRUaW1lKCkgPiBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSkge1xuICAgICAgICAgICAgICAgIC8vIERyYWcgdXBcbiAgICAgICAgICAgICAgICAvLyB0aGlzLm9wZXJhdGlvbi5ldmVudC5zdGFydCA9IGhvdmVyZWQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kID0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5lbmQ7XG4gICAgICAgICAgICAgICAgLy8gdGhpcy5ldmVudHMkLm5leHQodGhpcy5ldmVudHMkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYgJiYgISF0aGlzLmRyYWdTdGFydFRpbWVzbG90KSlcbiAgICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGV2ICYmIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICBldi5zdGFydCA9IGhvdmVyZWQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgICAgICAgZXYuZW5kID0gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdC5lbmQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGV2O1xuICAgICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgICAucGlwZSh0YWtlKDEpKVxuICAgICAgICAgICAgICAgICAgLnN1YnNjcmliZSgoZXYpID0+IHRoaXMucHJldmlld0V2ZW50JC5uZXh0KGV2KSk7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGJyZWFrO1xuICAgICAgICAgIGNhc2UgRURyYWdPcGVyYXRpb24ubW92ZUV2ZW50OiB7XG4gICAgICAgICAgICBpZiAoaG92ZXJlZCAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgIC8vIHRoaXMub3BlcmF0aW9uLmV2ZW50LnN0YXJ0LnNldFRpbWUodGhpcy5vcGVyYXRpb24uZXZlbnQuc3RhcnQuZ2V0VGltZSgpICsgaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkgLSB0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSk7XG4gICAgICAgICAgICAgIC8vIHRoaXMub3BlcmF0aW9uLmV2ZW50LmVuZC5zZXRUaW1lKHRoaXMub3BlcmF0aW9uLmV2ZW50LmVuZC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgICAgLy8gdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWQ7XG4gICAgICAgICAgICAgIC8vIC8vIHRoaXMuZXZlbnRzJC5uZXh0KHRoaXMuZXZlbnRzJC52YWx1ZSk7XG5cbiAgICAgICAgICAgICAgdGhpcy5wcmV2aWV3RXZlbnQkXG4gICAgICAgICAgICAgICAgLnBpcGUoZmlsdGVyKChldikgPT4gISFldiAmJiAhIXRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QpKVxuICAgICAgICAgICAgICAgIC5waXBlKG1hcCgoZXYpID0+IHtcbiAgICAgICAgICAgICAgICAgIGlmIChldiAmJiB0aGlzLmRyYWdTdGFydFRpbWVzbG90KSB7XG4gICAgICAgICAgICAgICAgICAgIGV2LnN0YXJ0LnNldFRpbWUoZXYuc3RhcnQuZ2V0VGltZSgpICsgaG92ZXJlZC5zdGFydC5nZXRUaW1lKCkgLSB0aGlzLmRyYWdTdGFydFRpbWVzbG90LnN0YXJ0LmdldFRpbWUoKSk7XG4gICAgICAgICAgICAgICAgICAgIGV2LmVuZC5zZXRUaW1lKGV2LmVuZC5nZXRUaW1lKCkgKyBob3ZlcmVkLnN0YXJ0LmdldFRpbWUoKSAtIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3Quc3RhcnQuZ2V0VGltZSgpKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IGhvdmVyZWQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICByZXR1cm4gZXY7XG4gICAgICAgICAgICAgICAgfSkpXG4gICAgICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgICAgICAuc3Vic2NyaWJlKChldikgPT4gdGhpcy5wcmV2aWV3RXZlbnQkLm5leHQoZXYpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9IGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICB9KTtcbiAgfVxuICAvLyNlbmRyZWdpb25cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJywgWyckZXZlbnQnXSlcbiAgb25Nb3VzZVVwKGV2OiBNb3VzZUV2ZW50KSB7XG4gICAgaWYgKHRoaXMub3BlcmF0aW9uKSB7XG4gICAgICBzd2l0Y2ggKHRoaXMub3BlcmF0aW9uLm9wZXJhdGlvbikge1xuICAgICAgICBjYXNlIEVEcmFnT3BlcmF0aW9uLmNyZWF0ZUV2ZW50OiB7XG4gICAgICAgICAgY29tYmluZUxhdGVzdChbdGhpcy5wcmV2aWV3RXZlbnQkXSlcbiAgICAgICAgICAgIC5waXBlKHRha2UoMSkpXG4gICAgICAgICAgICAuc3Vic2NyaWJlKChbcHJldmlld0V2ZW50XSkgPT4ge1xuICAgICAgICAgICAgICBpZiAocHJldmlld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24gPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZHJhZ1N0YXJ0VGltZXNsb3QgPSBudWxsO1xuICAgICAgICAgICAgICAgIHRoaXMuZXZlbnRzJC5uZXh0KFsuLi50aGlzLmV2ZW50cyQudmFsdWUsIHtcbiAgICAgICAgICAgICAgICAgIHN0YXJ0OiBwcmV2aWV3RXZlbnQuc3RhcnQsXG4gICAgICAgICAgICAgICAgICBlbmQ6IHByZXZpZXdFdmVudC5lbmQsXG4gICAgICAgICAgICAgICAgICBjb2xvcjogJyNGMDAnLFxuICAgICAgICAgICAgICAgICAgZGVzY3JpcHRpb246ICdOZXcgZXZlbnQnXG4gICAgICAgICAgICAgICAgfV0pO1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlld0V2ZW50JC5uZXh0KG51bGwpO1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSBicmVhaztcbiAgICAgICAgY2FzZSBFRHJhZ09wZXJhdGlvbi5tb3ZlRXZlbnQ6IHtcbiAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCRcbiAgICAgICAgICAgIC5waXBlKGZpbHRlcigoZXYpID0+ICEhZXYpKVxuICAgICAgICAgICAgLnBpcGUodGFrZSgxKSlcbiAgICAgICAgICAgIC5zdWJzY3JpYmUoKHByZXZpZXdFdmVudCkgPT4ge1xuICAgICAgICAgICAgICBpZiAodGhpcy5vcGVyYXRpb24gJiYgdGhpcy5vcGVyYXRpb24uZXZlbnQgJiYgcHJldmlld0V2ZW50KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24uZXZlbnQuc3RhcnQgPSBwcmV2aWV3RXZlbnQuc3RhcnQ7XG4gICAgICAgICAgICAgICAgdGhpcy5vcGVyYXRpb24uZXZlbnQuZW5kID0gcHJldmlld0V2ZW50LmVuZDtcbiAgICAgICAgICAgICAgICB0aGlzLm9wZXJhdGlvbiA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5kcmFnU3RhcnRUaW1lc2xvdCA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5ldmVudHMkLm5leHQodGhpcy5ldmVudHMkLnZhbHVlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnByZXZpZXdFdmVudCQubmV4dChudWxsKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0gYnJlYWs7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgbmdPbkRlc3Ryb3koKSB7XG4gICAgdGhpcy5kZXN0cm95ZWQkLm5leHQodHJ1ZSk7XG4gIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJ0YWJsZSBkLWZsZXggdy0xMDAgb3ZlcmZsb3cteS1hdXRvXCIgW3N0eWxlLm1heC1oZWlnaHQucHhdPVwibnVsbFwiPlxuICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1oZWFkXCI+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJ3LTEwMCBkLWZsZXggZmxleC1yb3dcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJkLWZsZXggY2FsZW5kYXItbGVmdCBqdXN0aWZ5LWNvbnRlbnQtYmV0d2VlblwiPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgZmxleC1zdGFydFwiIChjbGljayk9XCJvblByZXZpb3VzV2VlaygpXCI+Jmx0OzwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDxidXR0b24gY2xhc3M9XCJidG4gYnRuLWRlZmF1bHQgZmxleC1lbmRcIiAoY2xpY2spPVwib25OZXh0V2VlaygpXCI+Jmd0OzwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZmxleC1ncm93LTFcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIChkYXlzT2ZXZWVrJCB8IGFzeW5jKVwiPlxuICAgICAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwiZC1ibG9jayBjb2wtZm9ybS1sYWJlbCB0ZXh0LWNlbnRlclwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBkYXkgfCBkYXRlOiAnZGQtTU0teXl5eScgfX1cbiAgICAgICAgICAgICAgICA8L3NwYW4+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWJvZHlcIj5cbiAgICAgICAgPGRpdiBjbGFzcz1cInBvc2l0aW9uLXJlbGF0aXZlXCI+XG4gICAgICAgICAgICA8IS0tIFRpbWVzbG90cyAtLT5cbiAgICAgICAgICAgIDxkaXYgKm5nRm9yPVwibGV0IHRpbWVzbG90cyBvZiAodGltZVNsb3RzJCB8IGFzeW5jKTsgbGV0IGkgPSBpbmRleFwiIGNsYXNzPVwiZC1mbGV4IGZsZXgtcm93IHAtMCB0aW1lc2xvdFwiIFtzdHlsZS5oZWlnaHQucHhdPVwidW5pdEhlaWdodCQgfCBhc3luY1wiPlxuICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJjYWxlbmRhci1jZWxsIGNhbGVuZGFyLWxlZnQgYWxpZ24tdG9wIHB5LTBcIj57eyB0aW1lc2xvdHNbMF0uc3RhcnQgfCBkYXRlOiAnSEg6bW06c3MnIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImNhbGVuZGFyLWNlbGwgZmxleC1ncm93LTFcIiAqbmdGb3I9XCJsZXQgc2xvdCBvZiB0aW1lc2xvdHM7IGxldCBqID0gaW5kZXhcIiAjc2xvdCAobW91c2Vkb3duKT1cIm9uQ3JlYXRlRXZlbnQoJGV2ZW50LCBzbG90KVwiIFthdHRyLmRhdGEtcm93XT1cImlcIiBbYXR0ci5kYXRhLWNvbHVtbl09XCJqXCI+PC9kaXY+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgIFxuICAgICAgICAgICAgPCEtLSBFdmVudHMgLS0+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRpbWVTbG90RHVyYXRpb24kIHwgYXN5bmMpIGFzIHRpbWVTbG90RHVyYXRpb25cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiKHRpbWVsaW5lZEV2ZW50UGFydHNGb3JUaGlzV2VlayQgfCBhc3luYykgYXMgcGFydERhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHBhcnREYXRhLnBhcnRzXCIgY2xhc3M9XCJldmVudCBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZXZlbnRQYXJ0LnBhcnQgfCBic1NlY29uZHNUb2RheU9mZnNldCkgLyB0aW1lU2xvdER1cmF0aW9uICogKHVuaXRIZWlnaHQkIHwgYXN5bmMpIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cIihldmVudFBhcnQucGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiAodW5pdEhlaWdodCQgfCBhc3luYykhXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5sZWZ0XT1cIidjYWxjKDkwcHggKyAoKDEwMCUgLSA5MHB4KSAvIDcgKiAnICsgKChldmVudFBhcnQucGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1pbm5lclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS53aWR0aF09XCInY2FsYygxMDAlIC8gJyArIHBhcnREYXRhLnRvdGFsICsgJyknXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZXZlbnRQYXJ0LnBhcnQgfCBic1NlY29uZHNUaW1lc3BhbikgLyB0aW1lU2xvdER1cmF0aW9uICogKHVuaXRIZWlnaHQkIHwgYXN5bmMpIVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzdHlsZS5tYXJnaW4tbGVmdF09XCInY2FsYygxMDAlIC8gJyArIHBhcnREYXRhLnRvdGFsICsgJyAqICcgKyBldmVudFBhcnQuaW5kZXggKyAnKSdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobW91c2Vkb3duKT1cIm9uU3RhcnREcmFnRXZlbnQoZXZlbnRQYXJ0LnBhcnQsICRldmVudClcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGl2IGNsYXNzPVwiZXZlbnQtYm9yZGVyXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImV2ZW50UGFydC5wYXJ0LmV2ZW50XCI+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1iZ1wiIFtzdHlsZS5iYWNrZ3JvdW5kLWNvbG9yXT1cImV2ZW50UGFydC5wYXJ0LmV2ZW50LmNvbG9yXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1sYWJlbFwiPnt7IGV2ZW50UGFydC5wYXJ0LmV2ZW50LmRlc2NyaXB0aW9uIH19PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIihwcmV2aWV3RXZlbnRQYXJ0c0ZvclRoaXNXZWVrJCB8IGFzeW5jKSBhcyBwcmV2aWV3UGFydERhdGFcIj5cbiAgICAgICAgICAgICAgICAgICAgPGRpdiAqbmdGb3I9XCJsZXQgZXZlbnRQYXJ0IG9mIHByZXZpZXdQYXJ0RGF0YVwiIGNsYXNzPVwiZXZlbnQgcHJldmlldyBwLTBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLnRvcC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVG9kYXlPZmZzZXQpIC8gdGltZVNsb3REdXJhdGlvbiAqICh1bml0SGVpZ2h0JCB8IGFzeW5jKSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmhlaWdodC5weF09XCIoZXZlbnRQYXJ0IHwgYnNTZWNvbmRzVGltZXNwYW4pIC8gdGltZVNsb3REdXJhdGlvbiAqICh1bml0SGVpZ2h0JCB8IGFzeW5jKSFcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmxlZnRdPVwiJ2NhbGMoOTBweCArICgoMTAwJSAtIDkwcHgpIC8gNyAqICcgKyAoKGV2ZW50UGFydCB8IGRheU9mV2VlaykgLSAxKSArICcpKSdcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJldmVudC1pbm5lciB3LTEwMFwiIFtzdHlsZS5oZWlnaHQucHhdPVwiKGV2ZW50UGFydCB8IGJzU2Vjb25kc1RpbWVzcGFuKSAvIHRpbWVTbG90RHVyYXRpb24gKiAodW5pdEhlaWdodCQgfCBhc3luYykhXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuPC9kaXY+Il19
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJldmlldy1ldmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uLy4uL2xpYnMvbWludHBsYXllci1uZy1ib290c3RyYXAvc3JjL2xpYi9jb21wb25lbnRzL3NjaGVkdWxlci9pbnRlcmZhY2VzL3ByZXZpZXctZXZlbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBpbnRlcmZhY2UgUHJldmlld0V2ZW50IHtcbiAgICBzdGFydDogRGF0ZTtcbiAgICBlbmQ6IERhdGU7XG59Il19
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLWV2ZW50LXBhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9zY2hlZHVsZXIvaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQtcGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnQgfSBmcm9tIFwiLi9zY2hlZHVsZXItZXZlbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudFBhcnQge1xuICAgIHN0YXJ0OiBEYXRlO1xuICAgIGVuZDogRGF0ZTtcbiAgICBldmVudDogU2NoZWR1bGVyRXZlbnQ7XG59Il19
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2NoZWR1bGVyLWV2ZW50LXBhcnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9zY2hlZHVsZXIvaW50ZXJmYWNlcy9zY2hlZHVsZXItZXZlbnQtcGFydC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnQgfSBmcm9tIFwiLi9zY2hlZHVsZXItZXZlbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBTY2hlZHVsZXJFdmVudFBhcnQge1xuICAgIHN0YXJ0OiBEYXRlO1xuICAgIGVuZDogRGF0ZTtcbiAgICBldmVudDogU2NoZWR1bGVyRXZlbnQgfCBudWxsO1xufSJdfQ==
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGltZWxpbmUtdHJhY2suanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi8uLi8uLi8uLi9saWJzL21pbnRwbGF5ZXItbmctYm9vdHN0cmFwL3NyYy9saWIvY29tcG9uZW50cy9zY2hlZHVsZXIvaW50ZXJmYWNlcy90aW1lbGluZS10cmFjay50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgU2NoZWR1bGVyRXZlbnQgfSBmcm9tIFwiLi9zY2hlZHVsZXItZXZlbnRcIjtcblxuZXhwb3J0IGludGVyZmFjZSBUaW1lbGluZVRyYWNrIHtcbiAgICBpbmRleDogbnVtYmVyO1xuICAgIGV2ZW50czogU2NoZWR1bGVyRXZlbnRbXTtcbn0iXX0=