@dsivd/prestations-ng 15.0.0-beta5 → 15.0.1-beta1

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 (56) hide show
  1. package/CHANGELOG.md +74 -10
  2. package/UPGRADING_V15.md +3 -2
  3. package/dsivd-prestations-ng-v15.0.1-beta1.tgz +0 -0
  4. package/esm2020/foehn-address/address.type.mjs +1 -1
  5. package/esm2020/foehn-address/foehn-input-address.component.mjs +2 -2
  6. package/esm2020/foehn-agenda/calendar.type.mjs +3 -0
  7. package/esm2020/foehn-agenda/current-week.type.mjs +4 -0
  8. package/esm2020/foehn-agenda/day-slots.type.mjs +3 -0
  9. package/esm2020/foehn-agenda/foehn-agenda-navigation/foehn-agenda-navigation.component.mjs +70 -0
  10. package/esm2020/foehn-agenda/foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component.mjs +233 -0
  11. package/esm2020/foehn-agenda/foehn-agenda.component.mjs +95 -0
  12. package/esm2020/foehn-agenda/foehn-agenda.module.mjs +64 -0
  13. package/esm2020/foehn-agenda/pagination-week.type.mjs +3 -0
  14. package/esm2020/foehn-agenda/selected-slot.type.mjs +3 -0
  15. package/esm2020/foehn-checkables/foehn-checkable-group.component.mjs +12 -3
  16. package/esm2020/foehn-date-picker/foehn-date-picker.component.mjs +3 -3
  17. package/esm2020/foehn-debug-summary/foehn-debug-summary.component.mjs +18 -9
  18. package/esm2020/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.mjs +254 -0
  19. package/esm2020/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.module.mjs +42 -0
  20. package/esm2020/foehn-upload/foehn-picture-upload/foehn-picture-upload.component.mjs +3 -3
  21. package/esm2020/index.mjs +21 -1
  22. package/esm2020/refinf/model/address-type-light.mjs +3 -0
  23. package/esm2020/refinf/model/canton.mjs +3 -0
  24. package/esm2020/refinf/model/district.mjs +3 -0
  25. package/esm2020/refinf/model/municipality.mjs +3 -0
  26. package/esm2020/refinf/model/place-of-origin.mjs +3 -0
  27. package/esm2020/refinf/model/postal-locality.mjs +3 -0
  28. package/esm2020/sdk-dictionary/default-dictionary.mjs +27 -3
  29. package/fesm2015/dsivd-prestations-ng.mjs +924 -150
  30. package/fesm2015/dsivd-prestations-ng.mjs.map +1 -1
  31. package/fesm2020/dsivd-prestations-ng.mjs +924 -150
  32. package/fesm2020/dsivd-prestations-ng.mjs.map +1 -1
  33. package/foehn-address/address.type.d.ts +3 -3
  34. package/foehn-address/foehn-input-address.component.d.ts +2 -2
  35. package/foehn-agenda/calendar.type.d.ts +7 -0
  36. package/foehn-agenda/current-week.type.d.ts +5 -0
  37. package/foehn-agenda/day-slots.type.d.ts +5 -0
  38. package/foehn-agenda/foehn-agenda-navigation/foehn-agenda-navigation.component.d.ts +19 -0
  39. package/foehn-agenda/foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component.d.ts +49 -0
  40. package/foehn-agenda/foehn-agenda.component.d.ts +29 -0
  41. package/foehn-agenda/foehn-agenda.module.d.ts +17 -0
  42. package/foehn-agenda/pagination-week.type.d.ts +5 -0
  43. package/foehn-agenda/selected-slot.type.d.ts +7 -0
  44. package/foehn-checkables/foehn-checkable-group.component.d.ts +3 -2
  45. package/foehn-debug-summary/foehn-debug-summary.component.d.ts +3 -1
  46. package/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.component.d.ts +45 -0
  47. package/foehn-multiselect-autocomplete/foehn-multiselect-autocomplete.module.d.ts +13 -0
  48. package/index.d.ts +17 -0
  49. package/package.json +1 -1
  50. package/refinf/model/address-type-light.d.ts +5 -0
  51. package/refinf/model/canton.d.ts +4 -0
  52. package/refinf/model/district.d.ts +7 -0
  53. package/refinf/model/municipality.d.ts +8 -0
  54. package/refinf/model/place-of-origin.d.ts +9 -0
  55. package/refinf/model/postal-locality.d.ts +11 -0
  56. package/dsivd-prestations-ng-v15.0.0-beta5.tgz +0 -0
@@ -0,0 +1,233 @@
1
+ import { Component, forwardRef, HostListener, Input, ViewChildren } from '@angular/core';
2
+ import { FoehnInputComponent } from '../../foehn-input/foehn-input.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../../sdk-dictionary/sdk-dictionary.service";
5
+ import * as i2 from "@angular/common";
6
+ import * as i3 from "../../sdk-dictionary/sdk-dictionary.pipe";
7
+ export class FoehnAgendaTimeslotPanelComponent extends FoehnInputComponent {
8
+ constructor(dictionaryService) {
9
+ super();
10
+ this.dictionaryService = dictionaryService;
11
+ this.isClosed = true;
12
+ this.DEFAULT_NB_VISISBLE_ELEMENTS = 22;
13
+ this.keyboardNavigationAllowed = false;
14
+ this.hasSelectedSlotInPanel = false;
15
+ this.nbVisibleElements = this.DEFAULT_NB_VISISBLE_ELEMENTS;
16
+ }
17
+ get currentWeek() {
18
+ return this.currentWeek_;
19
+ }
20
+ set currentWeek(value) {
21
+ this.currentWeek_ = value;
22
+ this.sliceNbVisibleElements();
23
+ }
24
+ handleKeyboardDownEvent(event) {
25
+ if (this.keyboardNavigationAllowed) {
26
+ this.onKeyDownInner(event);
27
+ }
28
+ }
29
+ focus() {
30
+ const timeSlotButtonsElemRefArray = [
31
+ ...this.timeSlotButtonsElemRef.toArray()
32
+ ];
33
+ if (!!timeSlotButtonsElemRefArray.length) {
34
+ timeSlotButtonsElemRefArray[0].nativeElement.focus();
35
+ }
36
+ }
37
+ ngOnChanges(changes) {
38
+ this.onNbVisibleElementsChange(changes.nbVisibleElements);
39
+ }
40
+ capitalCaseFirstLetter(s) {
41
+ if (!s) {
42
+ return s;
43
+ }
44
+ if (s.length === 1) {
45
+ return s.toUpperCase();
46
+ }
47
+ return `${s.charAt(0).toUpperCase()}${s.slice(1)}`;
48
+ }
49
+ handleUserInput(day, date, time, calendar) {
50
+ const validValue = this.getValidValue(day, date, time, calendar);
51
+ if (typeof validValue !== 'undefined') {
52
+ this.userInput.next(validValue);
53
+ this.updateNgModel(validValue);
54
+ }
55
+ }
56
+ togglePanel() {
57
+ this.isClosed = !this.isClosed;
58
+ if (this.isClosed) {
59
+ this.sliceNbVisibleElements();
60
+ }
61
+ else {
62
+ // Need setTimeout because we are outside angular cicle when reloading page
63
+ setTimeout(() => {
64
+ this.timeSlots = this.currentWeek.timeSlots;
65
+ });
66
+ }
67
+ }
68
+ onModelChange(value) {
69
+ if (value) {
70
+ this.selectedTimeSlot = `${value.day}-${value.time}`;
71
+ this.timeInputValue = value.time;
72
+ this.dayInputValue = value.day;
73
+ }
74
+ else if (!value) {
75
+ this.selectedTimeSlot = null;
76
+ this.timeInputValue = null;
77
+ this.dayInputValue = null;
78
+ }
79
+ this.searchTimeValueInTimeSlot();
80
+ }
81
+ getTimeInputValue(s) {
82
+ if (!!s) {
83
+ const valueSplit = s.split('-');
84
+ if (valueSplit.length >= 2) {
85
+ return valueSplit[1];
86
+ }
87
+ }
88
+ return s;
89
+ }
90
+ searchTimeValueInTimeSlot() {
91
+ const positionValue = this.currentWeek.timeSlots.findIndex(x => x === this.timeInputValue &&
92
+ this.currentWeek.day === this.dayInputValue);
93
+ if (positionValue !== -1 && !!this.selectedTimeSlot) {
94
+ this.hasSelectedSlotInPanel = true;
95
+ if (this.isClosed && positionValue >= this.nbVisibleElements) {
96
+ this.togglePanel();
97
+ }
98
+ }
99
+ else {
100
+ this.hasSelectedSlotInPanel = false;
101
+ }
102
+ }
103
+ onTimeFocusin() {
104
+ this.keyboardNavigationAllowed = true;
105
+ this.currentActiveElement = document.activeElement;
106
+ }
107
+ onTimeFocusout() {
108
+ this.keyboardNavigationAllowed = false;
109
+ }
110
+ isSelected(timeSlot) {
111
+ if (!this.selectedTimeSlot) {
112
+ return false;
113
+ }
114
+ return (timeSlot === this.timeInputValue &&
115
+ this.currentWeek.day === this.dayInputValue);
116
+ }
117
+ getButtonTimeSlotAriaLabel(day, timeSlot) {
118
+ let result = `${day} ${timeSlot}`;
119
+ if (this.isSelected(timeSlot)) {
120
+ result += this.dictionaryService.getKeySync('foehn-agenda.timeslot.selected');
121
+ }
122
+ return result;
123
+ }
124
+ getTimeSlotTabIndex(timeSlot, index) {
125
+ if (this.isSelected(timeSlot)) {
126
+ return 0;
127
+ }
128
+ if (!index && !this.hasSelectedSlotInPanel) {
129
+ return 0;
130
+ }
131
+ return -1;
132
+ }
133
+ sliceNbVisibleElements() {
134
+ this.timeSlots = this.currentWeek.timeSlots.slice(0, this.nbVisibleElements);
135
+ this.timeslotRemaining =
136
+ this.currentWeek.timeSlots.length - this.nbVisibleElements;
137
+ }
138
+ getValidValue(day, date, time, calendar) {
139
+ if (!day || !time) {
140
+ if (this.model_ !== undefined) {
141
+ return null;
142
+ }
143
+ return undefined;
144
+ }
145
+ return {
146
+ day,
147
+ time,
148
+ year: calendar.currentWeek.year,
149
+ weekNumber: calendar.currentWeek.weekNumber,
150
+ date
151
+ };
152
+ }
153
+ onNbVisibleElementsChange(change) {
154
+ if (change && change.currentValue) {
155
+ this.sliceNbVisibleElements();
156
+ }
157
+ }
158
+ onKeyDownInner(keyEvent) {
159
+ // IE doesn't support keyEvent.code, and has different values
160
+ // in keyEvent.key (Down instead of ArrowDown for instance), hence the multi-support.
161
+ const ie11CompatibleCode = keyEvent.code || keyEvent.key;
162
+ switch (ie11CompatibleCode) {
163
+ case 'Down':
164
+ case 'ArrowDown':
165
+ case 'Right':
166
+ case 'ArrowRight':
167
+ this.focusTimeSlot(1);
168
+ break;
169
+ case 'Up':
170
+ case 'ArrowUp':
171
+ case 'Left':
172
+ case 'ArrowLeft':
173
+ this.focusTimeSlot(-1);
174
+ break;
175
+ case 'Space':
176
+ case 'Spacebar':
177
+ case 'Enter':
178
+ document.activeElement.dispatchEvent(new Event('click'));
179
+ break;
180
+ default:
181
+ return true;
182
+ }
183
+ keyEvent.preventDefault();
184
+ keyEvent.stopPropagation();
185
+ return false;
186
+ }
187
+ focusTimeSlot(inc) {
188
+ const buttonsArray = [...this.timeSlotButtonsElemRef.toArray()];
189
+ const indexselected = buttonsArray.findIndex(item => item.nativeElement.getAttribute('id') ===
190
+ this.currentActiveElement.getAttribute('id'));
191
+ const newIndex = indexselected + inc;
192
+ if (newIndex >= buttonsArray.length) {
193
+ buttonsArray[0].nativeElement.focus();
194
+ }
195
+ else if (newIndex < 0) {
196
+ buttonsArray[buttonsArray.length - 1].nativeElement.focus();
197
+ }
198
+ else {
199
+ buttonsArray[newIndex].nativeElement.focus();
200
+ }
201
+ }
202
+ }
203
+ FoehnAgendaTimeslotPanelComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaTimeslotPanelComponent, deps: [{ token: i1.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
204
+ FoehnAgendaTimeslotPanelComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: FoehnAgendaTimeslotPanelComponent, selector: "foehn-agenda-timeslot-panel", inputs: { calendar: "calendar", nbVisibleElements: "nbVisibleElements", currentWeek: "currentWeek" }, host: { listeners: { "keydown": "handleKeyboardDownEvent($event)" } }, providers: [
205
+ {
206
+ provide: FoehnInputComponent,
207
+ useExisting: forwardRef(() => FoehnAgendaTimeslotPanelComponent),
208
+ multi: true
209
+ }
210
+ ], viewQueries: [{ propertyName: "timeSlotButtonsElemRef", predicate: ["timeSlotButtonsElemRef"], descendants: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<section\n *ngIf=\"calendar | async as loadedCalendar\"\n class=\"panel panel-default mb-3\"\n>\n <div class=\"panel-heading mt-2 mb-2 py-2 d-flex align-items-baseline\">\n <h3 class=\"h5 ml-3 mt-0 mb-0\">\n {{ capitalCaseFirstLetter(currentWeek.day) }}\n <span class=\"sr-only\" *ngIf=\"!!isSelected(timeInputValue)\">\n &nbsp;{{\n 'foehn-agenda-timeslot-panel.selected-time'\n | fromDictionary: { timeSelectedValue: timeInputValue }\n }}\n </span>\n </h3>\n <small *ngIf=\"!!currentWeek.timeSlots.length\" class=\"sr-only\">\n {{\n 'foehn-agenda-timeslot-panel.nbr-dispo'\n | fromDictionary\n : {\n nbElements: currentWeek.timeSlots.length.toString()\n }\n }}\n </small>\n <small\n *ngIf=\"!currentWeek.timeSlots.length\"\n class=\"font-italic align-self-end ml-2\"\n >\n {{ 'foehn-agenda-timeslot-panel.no-dispo' | fromDictionary }}\n </small>\n </div>\n\n <div\n *ngIf=\"!!currentWeek.timeSlots.length\"\n class=\"panel-body row d-flex flex-wrap ml-auto mr-auto pl-3\"\n (focusin)=\"onTimeFocusin()\"\n (focusout)=\"onTimeFocusout()\"\n role=\"application\"\n >\n <button\n *ngFor=\"let timeSlot of timeSlots; let index = index\"\n class=\"btn btn-info mr-2 mb-2\"\n #timeSlotButtonsElemRef\n [attr.id]=\"currentWeek.day + '-' + timeSlot\"\n [tabindex]=\"getTimeSlotTabIndex(timeSlot, index)\"\n [class.btn-danger]=\"isSelected(timeSlot)\"\n (click)=\"\n handleUserInput(\n currentWeek.day,\n currentWeek.date,\n timeSlot,\n loadedCalendar\n )\n \"\n [attr.aria-label]=\"\n getButtonTimeSlotAriaLabel(currentWeek.day, timeSlot)\n \"\n >\n {{ timeSlot }}\n </button>\n <div\n class=\"col-12 d-flex justify-content-end mb-1\"\n *ngIf=\"currentWeek.timeSlots.length > nbVisibleElements\"\n >\n <button\n class=\"btn btn-link show-more\"\n #timeSlotButtonsElemRef\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"\n (isClosed\n ? 'foehn-agenda-timeslot-panel.show-more-sr-only'\n : 'foehn-agenda-timeslot-panel.show-less'\n )\n | fromDictionary\n : {\n nbrElementsHidden: timeslotRemaining.toString()\n }\n \"\n >\n {{\n (isClosed\n ? 'foehn.agenda-timeslot-panel.show-more'\n : 'foehn-agenda-timeslot-panel.show-less'\n )\n | fromDictionary\n : {\n nbrElementsHidden: timeslotRemaining.toString()\n }\n }}\n </button>\n </div>\n </div>\n</section>\n", styles: [".panel-default{border:1px solid #dfdfdf}.panel-heading{position:sticky;background-color:#fff;width:100%;top:0}.panel-heading small{font-size:.9rem}.panel-heading:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem var(--focus)}.panel-body .btn-info{padding-right:.4rem;padding-left:.4rem}.panel-body .btn-link{padding:0}.show-more{cursor:pointer;font-size:.9rem}\n"], directives: [{ type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "async": i2.AsyncPipe, "fromDictionary": i3.SdkDictionaryPipe } });
211
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaTimeslotPanelComponent, decorators: [{
212
+ type: Component,
213
+ args: [{ selector: 'foehn-agenda-timeslot-panel', providers: [
214
+ {
215
+ provide: FoehnInputComponent,
216
+ useExisting: forwardRef(() => FoehnAgendaTimeslotPanelComponent),
217
+ multi: true
218
+ }
219
+ ], template: "<section\n *ngIf=\"calendar | async as loadedCalendar\"\n class=\"panel panel-default mb-3\"\n>\n <div class=\"panel-heading mt-2 mb-2 py-2 d-flex align-items-baseline\">\n <h3 class=\"h5 ml-3 mt-0 mb-0\">\n {{ capitalCaseFirstLetter(currentWeek.day) }}\n <span class=\"sr-only\" *ngIf=\"!!isSelected(timeInputValue)\">\n &nbsp;{{\n 'foehn-agenda-timeslot-panel.selected-time'\n | fromDictionary: { timeSelectedValue: timeInputValue }\n }}\n </span>\n </h3>\n <small *ngIf=\"!!currentWeek.timeSlots.length\" class=\"sr-only\">\n {{\n 'foehn-agenda-timeslot-panel.nbr-dispo'\n | fromDictionary\n : {\n nbElements: currentWeek.timeSlots.length.toString()\n }\n }}\n </small>\n <small\n *ngIf=\"!currentWeek.timeSlots.length\"\n class=\"font-italic align-self-end ml-2\"\n >\n {{ 'foehn-agenda-timeslot-panel.no-dispo' | fromDictionary }}\n </small>\n </div>\n\n <div\n *ngIf=\"!!currentWeek.timeSlots.length\"\n class=\"panel-body row d-flex flex-wrap ml-auto mr-auto pl-3\"\n (focusin)=\"onTimeFocusin()\"\n (focusout)=\"onTimeFocusout()\"\n role=\"application\"\n >\n <button\n *ngFor=\"let timeSlot of timeSlots; let index = index\"\n class=\"btn btn-info mr-2 mb-2\"\n #timeSlotButtonsElemRef\n [attr.id]=\"currentWeek.day + '-' + timeSlot\"\n [tabindex]=\"getTimeSlotTabIndex(timeSlot, index)\"\n [class.btn-danger]=\"isSelected(timeSlot)\"\n (click)=\"\n handleUserInput(\n currentWeek.day,\n currentWeek.date,\n timeSlot,\n loadedCalendar\n )\n \"\n [attr.aria-label]=\"\n getButtonTimeSlotAriaLabel(currentWeek.day, timeSlot)\n \"\n >\n {{ timeSlot }}\n </button>\n <div\n class=\"col-12 d-flex justify-content-end mb-1\"\n *ngIf=\"currentWeek.timeSlots.length > nbVisibleElements\"\n >\n <button\n class=\"btn btn-link show-more\"\n #timeSlotButtonsElemRef\n (click)=\"togglePanel()\"\n [attr.aria-label]=\"\n (isClosed\n ? 'foehn-agenda-timeslot-panel.show-more-sr-only'\n : 'foehn-agenda-timeslot-panel.show-less'\n )\n | fromDictionary\n : {\n nbrElementsHidden: timeslotRemaining.toString()\n }\n \"\n >\n {{\n (isClosed\n ? 'foehn.agenda-timeslot-panel.show-more'\n : 'foehn-agenda-timeslot-panel.show-less'\n )\n | fromDictionary\n : {\n nbrElementsHidden: timeslotRemaining.toString()\n }\n }}\n </button>\n </div>\n </div>\n</section>\n", styles: [".panel-default{border:1px solid #dfdfdf}.panel-heading{position:sticky;background-color:#fff;width:100%;top:0}.panel-heading small{font-size:.9rem}.panel-heading:focus{outline:0;box-shadow:inset 0 1px 1px #00000013,0 0 0 .2rem var(--focus)}.panel-body .btn-info{padding-right:.4rem;padding-left:.4rem}.panel-body .btn-link{padding:0}.show-more{cursor:pointer;font-size:.9rem}\n"] }]
220
+ }], ctorParameters: function () { return [{ type: i1.SdkDictionaryService }]; }, propDecorators: { timeSlotButtonsElemRef: [{
221
+ type: ViewChildren,
222
+ args: ['timeSlotButtonsElemRef']
223
+ }], calendar: [{
224
+ type: Input
225
+ }], nbVisibleElements: [{
226
+ type: Input
227
+ }], currentWeek: [{
228
+ type: Input
229
+ }], handleKeyboardDownEvent: [{
230
+ type: HostListener,
231
+ args: ['keydown', ['$event']]
232
+ }] } });
233
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tYWdlbmRhLXRpbWVzbG90LXBhbmVsLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZ2VuZGEvZm9laG4tYWdlbmRhLXRpbWVzbG90LXBhbmVsL2ZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tYWdlbmRhL2ZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbC9mb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILFNBQVMsRUFFVCxVQUFVLEVBQ1YsWUFBWSxFQUNaLEtBQUssRUFLTCxZQUFZLEVBQ2YsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0seUNBQXlDLENBQUM7Ozs7O0FBbUI5RSxNQUFNLE9BQU8saUNBQ1QsU0FBUSxtQkFBaUM7SUF5QnpDLFlBQW9CLGlCQUF1QztRQUN2RCxLQUFLLEVBQUUsQ0FBQztRQURRLHNCQUFpQixHQUFqQixpQkFBaUIsQ0FBc0I7UUFaM0QsYUFBUSxHQUFHLElBQUksQ0FBQztRQUlQLGlDQUE0QixHQUFHLEVBQUUsQ0FBQztRQUluQyw4QkFBeUIsR0FBRyxLQUFLLENBQUM7UUFFbEMsMkJBQXNCLEdBQUcsS0FBSyxDQUFDO1FBSW5DLElBQUksQ0FBQyxpQkFBaUIsR0FBRyxJQUFJLENBQUMsNEJBQTRCLENBQUM7SUFDL0QsQ0FBQztJQUVELElBQUksV0FBVztRQUNYLE9BQU8sSUFBSSxDQUFDLFlBQVksQ0FBQztJQUM3QixDQUFDO0lBRUQsSUFDSSxXQUFXLENBQUMsS0FBZTtRQUMzQixJQUFJLENBQUMsWUFBWSxHQUFHLEtBQUssQ0FBQztRQUMxQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztJQUNsQyxDQUFDO0lBR0QsdUJBQXVCLENBQUMsS0FBb0I7UUFDeEMsSUFBSSxJQUFJLENBQUMseUJBQXlCLEVBQUU7WUFDaEMsSUFBSSxDQUFDLGNBQWMsQ0FBQyxLQUFLLENBQUMsQ0FBQztTQUM5QjtJQUNMLENBQUM7SUFFRCxLQUFLO1FBQ0QsTUFBTSwyQkFBMkIsR0FBRztZQUNoQyxHQUFHLElBQUksQ0FBQyxzQkFBc0IsQ0FBQyxPQUFPLEVBQUU7U0FDM0MsQ0FBQztRQUNGLElBQUksQ0FBQyxDQUFDLDJCQUEyQixDQUFDLE1BQU0sRUFBRTtZQUN0QywyQkFBMkIsQ0FBQyxDQUFDLENBQUMsQ0FBQyxhQUFhLENBQUMsS0FBSyxFQUFFLENBQUM7U0FDeEQ7SUFDTCxDQUFDO0lBRUQsV0FBVyxDQUFDLE9BQXNCO1FBQzlCLElBQUksQ0FBQyx5QkFBeUIsQ0FBQyxPQUFPLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUM5RCxDQUFDO0lBRUQsc0JBQXNCLENBQUMsQ0FBUztRQUM1QixJQUFJLENBQUMsQ0FBQyxFQUFFO1lBQ0osT0FBTyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLEVBQUU7WUFDaEIsT0FBTyxDQUFDLENBQUMsV0FBVyxFQUFFLENBQUM7U0FDMUI7UUFDRCxPQUFPLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLENBQUMsQ0FBQyxXQUFXLEVBQUUsR0FBRyxDQUFDLENBQUMsS0FBSyxDQUFDLENBQUMsQ0FBQyxFQUFFLENBQUM7SUFDdkQsQ0FBQztJQUVELGVBQWUsQ0FDWCxHQUFXLEVBQ1gsSUFBYyxFQUNkLElBQVksRUFDWixRQUFrQjtRQUVsQixNQUFNLFVBQVUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSSxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBQ2pFLElBQUksT0FBTyxVQUFVLEtBQUssV0FBVyxFQUFFO1lBQ25DLElBQUksQ0FBQyxTQUFTLENBQUMsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDO1lBQ2hDLElBQUksQ0FBQyxhQUFhLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDbEM7SUFDTCxDQUFDO0lBRUQsV0FBVztRQUNQLElBQUksQ0FBQyxRQUFRLEdBQUcsQ0FBQyxJQUFJLENBQUMsUUFBUSxDQUFDO1FBQy9CLElBQUksSUFBSSxDQUFDLFFBQVEsRUFBRTtZQUNmLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxDQUFDO1NBQ2pDO2FBQU07WUFDSCwyRUFBMkU7WUFDM0UsVUFBVSxDQUFDLEdBQUcsRUFBRTtnQkFDWixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDO1lBQ2hELENBQUMsQ0FBQyxDQUFDO1NBQ047SUFDTCxDQUFDO0lBRUQsYUFBYSxDQUFDLEtBQW1CO1FBQzdCLElBQUksS0FBSyxFQUFFO1lBQ1AsSUFBSSxDQUFDLGdCQUFnQixHQUFHLEdBQUcsS0FBSyxDQUFDLEdBQUcsSUFBSSxLQUFLLENBQUMsSUFBSSxFQUFFLENBQUM7WUFDckQsSUFBSSxDQUFDLGNBQWMsR0FBRyxLQUFLLENBQUMsSUFBSSxDQUFDO1lBQ2pDLElBQUksQ0FBQyxhQUFhLEdBQUcsS0FBSyxDQUFDLEdBQUcsQ0FBQztTQUNsQzthQUFNLElBQUksQ0FBQyxLQUFLLEVBQUU7WUFDZixJQUFJLENBQUMsZ0JBQWdCLEdBQUcsSUFBSSxDQUFDO1lBQzdCLElBQUksQ0FBQyxjQUFjLEdBQUcsSUFBSSxDQUFDO1lBQzNCLElBQUksQ0FBQyxhQUFhLEdBQUcsSUFBSSxDQUFDO1NBQzdCO1FBQ0QsSUFBSSxDQUFDLHlCQUF5QixFQUFFLENBQUM7SUFDckMsQ0FBQztJQUVELGlCQUFpQixDQUFDLENBQVM7UUFDdkIsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFO1lBQ0wsTUFBTSxVQUFVLEdBQUcsQ0FBQyxDQUFDLEtBQUssQ0FBQyxHQUFHLENBQUMsQ0FBQztZQUNoQyxJQUFJLFVBQVUsQ0FBQyxNQUFNLElBQUksQ0FBQyxFQUFFO2dCQUN4QixPQUFPLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQzthQUN4QjtTQUNKO1FBQ0QsT0FBTyxDQUFDLENBQUM7SUFDYixDQUFDO0lBRUQseUJBQXlCO1FBQ3JCLE1BQU0sYUFBYSxHQUFHLElBQUksQ0FBQyxXQUFXLENBQUMsU0FBUyxDQUFDLFNBQVMsQ0FDdEQsQ0FBQyxDQUFDLEVBQUUsQ0FDQSxDQUFDLEtBQUssSUFBSSxDQUFDLGNBQWM7WUFDekIsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FDbEQsQ0FBQztRQUNGLElBQUksYUFBYSxLQUFLLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLEVBQUU7WUFDakQsSUFBSSxDQUFDLHNCQUFzQixHQUFHLElBQUksQ0FBQztZQUNuQyxJQUFJLElBQUksQ0FBQyxRQUFRLElBQUksYUFBYSxJQUFJLElBQUksQ0FBQyxpQkFBaUIsRUFBRTtnQkFDMUQsSUFBSSxDQUFDLFdBQVcsRUFBRSxDQUFDO2FBQ3RCO1NBQ0o7YUFBTTtZQUNILElBQUksQ0FBQyxzQkFBc0IsR0FBRyxLQUFLLENBQUM7U0FDdkM7SUFDTCxDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksQ0FBQyx5QkFBeUIsR0FBRyxJQUFJLENBQUM7UUFDdEMsSUFBSSxDQUFDLG9CQUFvQixHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUM7SUFDdkQsQ0FBQztJQUVELGNBQWM7UUFDVixJQUFJLENBQUMseUJBQXlCLEdBQUcsS0FBSyxDQUFDO0lBQzNDLENBQUM7SUFFRCxVQUFVLENBQUMsUUFBZ0I7UUFDdkIsSUFBSSxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsRUFBRTtZQUN4QixPQUFPLEtBQUssQ0FBQztTQUNoQjtRQUNELE9BQU8sQ0FDSCxRQUFRLEtBQUssSUFBSSxDQUFDLGNBQWM7WUFDaEMsSUFBSSxDQUFDLFdBQVcsQ0FBQyxHQUFHLEtBQUssSUFBSSxDQUFDLGFBQWEsQ0FDOUMsQ0FBQztJQUNOLENBQUM7SUFFRCwwQkFBMEIsQ0FBQyxHQUFXLEVBQUUsUUFBZ0I7UUFDcEQsSUFBSSxNQUFNLEdBQUcsR0FBRyxHQUFHLElBQUksUUFBUSxFQUFFLENBQUM7UUFDbEMsSUFBSSxJQUFJLENBQUMsVUFBVSxDQUFDLFFBQVEsQ0FBQyxFQUFFO1lBQzNCLE1BQU0sSUFBSSxJQUFJLENBQUMsaUJBQWlCLENBQUMsVUFBVSxDQUN2QyxnQ0FBZ0MsQ0FDbkMsQ0FBQztTQUNMO1FBQ0QsT0FBTyxNQUFNLENBQUM7SUFDbEIsQ0FBQztJQUVELG1CQUFtQixDQUFDLFFBQWdCLEVBQUUsS0FBYTtRQUMvQyxJQUFJLElBQUksQ0FBQyxVQUFVLENBQUMsUUFBUSxDQUFDLEVBQUU7WUFDM0IsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUNELElBQUksQ0FBQyxLQUFLLElBQUksQ0FBQyxJQUFJLENBQUMsc0JBQXNCLEVBQUU7WUFDeEMsT0FBTyxDQUFDLENBQUM7U0FDWjtRQUNELE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDZCxDQUFDO0lBRU8sc0JBQXNCO1FBQzFCLElBQUksQ0FBQyxTQUFTLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUM3QyxDQUFDLEVBQ0QsSUFBSSxDQUFDLGlCQUFpQixDQUN6QixDQUFDO1FBQ0YsSUFBSSxDQUFDLGlCQUFpQjtZQUNsQixJQUFJLENBQUMsV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixDQUFDO0lBQ25FLENBQUM7SUFFTyxhQUFhLENBQ2pCLEdBQVcsRUFDWCxJQUFjLEVBQ2QsSUFBWSxFQUNaLFFBQWtCO1FBRWxCLElBQUksQ0FBQyxHQUFHLElBQUksQ0FBQyxJQUFJLEVBQUU7WUFDZixJQUFJLElBQUksQ0FBQyxNQUFNLEtBQUssU0FBUyxFQUFFO2dCQUMzQixPQUFPLElBQUksQ0FBQzthQUNmO1lBQ0QsT0FBTyxTQUFTLENBQUM7U0FDcEI7UUFDRCxPQUFPO1lBQ0gsR0FBRztZQUNILElBQUk7WUFDSixJQUFJLEVBQUUsUUFBUSxDQUFDLFdBQVcsQ0FBQyxJQUFJO1lBQy9CLFVBQVUsRUFBRSxRQUFRLENBQUMsV0FBVyxDQUFDLFVBQVU7WUFDM0MsSUFBSTtTQUNQLENBQUM7SUFDTixDQUFDO0lBRU8seUJBQXlCLENBQUMsTUFBb0I7UUFDbEQsSUFBSSxNQUFNLElBQUksTUFBTSxDQUFDLFlBQVksRUFBRTtZQUMvQixJQUFJLENBQUMsc0JBQXNCLEVBQUUsQ0FBQztTQUNqQztJQUNMLENBQUM7SUFFTyxjQUFjLENBQUMsUUFBdUI7UUFDMUMsNkRBQTZEO1FBQzdELHFGQUFxRjtRQUNyRixNQUFNLGtCQUFrQixHQUFHLFFBQVEsQ0FBQyxJQUFJLElBQUksUUFBUSxDQUFDLEdBQUcsQ0FBQztRQUN6RCxRQUFRLGtCQUFrQixFQUFFO1lBQ3hCLEtBQUssTUFBTSxDQUFDO1lBQ1osS0FBSyxXQUFXLENBQUM7WUFDakIsS0FBSyxPQUFPLENBQUM7WUFDYixLQUFLLFlBQVk7Z0JBQ2IsSUFBSSxDQUFDLGFBQWEsQ0FBQyxDQUFDLENBQUMsQ0FBQztnQkFDdEIsTUFBTTtZQUNWLEtBQUssSUFBSSxDQUFDO1lBQ1YsS0FBSyxTQUFTLENBQUM7WUFDZixLQUFLLE1BQU0sQ0FBQztZQUNaLEtBQUssV0FBVztnQkFDWixJQUFJLENBQUMsYUFBYSxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUM7Z0JBQ3ZCLE1BQU07WUFDVixLQUFLLE9BQU8sQ0FBQztZQUNiLEtBQUssVUFBVSxDQUFDO1lBQ2hCLEtBQUssT0FBTztnQkFDUixRQUFRLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLEtBQUssQ0FBQyxPQUFPLENBQUMsQ0FBQyxDQUFDO2dCQUN6RCxNQUFNO1lBQ1Y7Z0JBQ0ksT0FBTyxJQUFJLENBQUM7U0FDbkI7UUFFRCxRQUFRLENBQUMsY0FBYyxFQUFFLENBQUM7UUFDMUIsUUFBUSxDQUFDLGVBQWUsRUFBRSxDQUFDO1FBRTNCLE9BQU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7SUFFTyxhQUFhLENBQUMsR0FBVztRQUM3QixNQUFNLFlBQVksR0FBRyxDQUFDLEdBQUcsSUFBSSxDQUFDLHNCQUFzQixDQUFDLE9BQU8sRUFBRSxDQUFDLENBQUM7UUFDaEUsTUFBTSxhQUFhLEdBQUcsWUFBWSxDQUFDLFNBQVMsQ0FDeEMsSUFBSSxDQUFDLEVBQUUsQ0FDSCxJQUFJLENBQUMsYUFBYSxDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7WUFDckMsSUFBSSxDQUFDLG9CQUFvQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUMsQ0FDbkQsQ0FBQztRQUNGLE1BQU0sUUFBUSxHQUFHLGFBQWEsR0FBRyxHQUFHLENBQUM7UUFDckMsSUFBSSxRQUFRLElBQUksWUFBWSxDQUFDLE1BQU0sRUFBRTtZQUNqQyxZQUFZLENBQUMsQ0FBQyxDQUFDLENBQUMsYUFBYSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ3pDO2FBQU0sSUFBSSxRQUFRLEdBQUcsQ0FBQyxFQUFFO1lBQ3JCLFlBQVksQ0FBQyxZQUFZLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUMvRDthQUFNO1lBQ0gsWUFBWSxDQUFDLFFBQVEsQ0FBQyxDQUFDLGFBQWEsQ0FBQyxLQUFLLEVBQUUsQ0FBQztTQUNoRDtJQUNMLENBQUM7OzhIQWpRUSxpQ0FBaUM7a0hBQWpDLGlDQUFpQyxtT0FSL0I7UUFDUDtZQUNJLE9BQU8sRUFBRSxtQkFBbUI7WUFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsQ0FBQyxpQ0FBaUMsQ0FBQztZQUNoRSxLQUFLLEVBQUUsSUFBSTtTQUNkO0tBQ0osMkxDN0JMLHk0R0E0RkE7MkZEN0RhLGlDQUFpQztrQkFaN0MsU0FBUzsrQkFDSSw2QkFBNkIsYUFHNUI7d0JBQ1A7NEJBQ0ksT0FBTyxFQUFFLG1CQUFtQjs0QkFDNUIsV0FBVyxFQUFFLFVBQVUsQ0FBQyxHQUFHLEVBQUUsa0NBQWtDLENBQUM7NEJBQ2hFLEtBQUssRUFBRSxJQUFJO3lCQUNkO3FCQUNKOzJHQU1ELHNCQUFzQjtzQkFEckIsWUFBWTt1QkFBQyx3QkFBd0I7Z0JBSXRDLFFBQVE7c0JBRFAsS0FBSztnQkFJTixpQkFBaUI7c0JBRGhCLEtBQUs7Z0JBMkJGLFdBQVc7c0JBRGQsS0FBSztnQkFPTix1QkFBdUI7c0JBRHRCLFlBQVk7dUJBQUMsU0FBUyxFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBmb3J3YXJkUmVmLFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgUXVlcnlMaXN0LFxuICAgIFNpbXBsZUNoYW5nZSxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvZWhuSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi8uLi9mb2Vobi1pbnB1dC9mb2Vobi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2RrRGljdGlvbmFyeVNlcnZpY2UgfSBmcm9tICcuLi8uLi9zZGstZGljdGlvbmFyeS9zZGstZGljdGlvbmFyeS5zZXJ2aWNlJztcbmltcG9ydCB7IFNlbGVjdGVkU2xvdCB9IGZyb20gJy4uL3NlbGVjdGVkLXNsb3QudHlwZSc7XG5pbXBvcnQgeyBEYXlTbG90cyB9IGZyb20gJy4uL2RheS1zbG90cy50eXBlJztcbmltcG9ydCB7IENhbGVuZGFyIH0gZnJvbSAnLi4vY2FsZW5kYXIudHlwZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnZm9laG4tYWdlbmRhLXRpbWVzbG90LXBhbmVsJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vZm9laG4tYWdlbmRhLXRpbWVzbG90LXBhbmVsLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9mb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuY29tcG9uZW50LmNzcyddLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGb2VobklucHV0Q29tcG9uZW50LFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9laG5BZ2VuZGFUaW1lc2xvdFBhbmVsQ29tcG9uZW50KSxcbiAgICAgICAgICAgIG11bHRpOiB0cnVlXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIEZvZWhuQWdlbmRhVGltZXNsb3RQYW5lbENvbXBvbmVudFxuICAgIGV4dGVuZHMgRm9laG5JbnB1dENvbXBvbmVudDxTZWxlY3RlZFNsb3Q+XG4gICAgaW1wbGVtZW50cyBPbkNoYW5nZXMge1xuICAgIEBWaWV3Q2hpbGRyZW4oJ3RpbWVTbG90QnV0dG9uc0VsZW1SZWYnKVxuICAgIHRpbWVTbG90QnV0dG9uc0VsZW1SZWY6IFF1ZXJ5TGlzdDxFbGVtZW50UmVmPjtcblxuICAgIEBJbnB1dCgpXG4gICAgY2FsZW5kYXI6IE9ic2VydmFibGU8Q2FsZW5kYXI+O1xuXG4gICAgQElucHV0KClcbiAgICBuYlZpc2libGVFbGVtZW50czogbnVtYmVyO1xuXG4gICAgc2VsZWN0ZWRUaW1lU2xvdDogc3RyaW5nO1xuICAgIHRpbWVTbG90czogc3RyaW5nW107XG4gICAgaXNDbG9zZWQgPSB0cnVlO1xuICAgIHRpbWVzbG90UmVtYWluaW5nOiBudW1iZXI7XG4gICAgdGltZUlucHV0VmFsdWU6IHN0cmluZztcblxuICAgIHJlYWRvbmx5IERFRkFVTFRfTkJfVklTSVNCTEVfRUxFTUVOVFMgPSAyMjtcblxuICAgIHByaXZhdGUgY3VycmVudFdlZWtfOiBEYXlTbG90cztcbiAgICBwcml2YXRlIGRheUlucHV0VmFsdWU6IHN0cmluZztcbiAgICBwcml2YXRlIGtleWJvYXJkTmF2aWdhdGlvbkFsbG93ZWQgPSBmYWxzZTtcbiAgICBwcml2YXRlIGN1cnJlbnRBY3RpdmVFbGVtZW50OiBFbGVtZW50O1xuICAgIHByaXZhdGUgaGFzU2VsZWN0ZWRTbG90SW5QYW5lbCA9IGZhbHNlO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogU2RrRGljdGlvbmFyeVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5uYlZpc2libGVFbGVtZW50cyA9IHRoaXMuREVGQVVMVF9OQl9WSVNJU0JMRV9FTEVNRU5UUztcbiAgICB9XG5cbiAgICBnZXQgY3VycmVudFdlZWsoKTogRGF5U2xvdHMge1xuICAgICAgICByZXR1cm4gdGhpcy5jdXJyZW50V2Vla187XG4gICAgfVxuXG4gICAgQElucHV0KClcbiAgICBzZXQgY3VycmVudFdlZWsodmFsdWU6IERheVNsb3RzKSB7XG4gICAgICAgIHRoaXMuY3VycmVudFdlZWtfID0gdmFsdWU7XG4gICAgICAgIHRoaXMuc2xpY2VOYlZpc2libGVFbGVtZW50cygpO1xuICAgIH1cblxuICAgIEBIb3N0TGlzdGVuZXIoJ2tleWRvd24nLCBbJyRldmVudCddKVxuICAgIGhhbmRsZUtleWJvYXJkRG93bkV2ZW50KGV2ZW50OiBLZXlib2FyZEV2ZW50KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkFsbG93ZWQpIHtcbiAgICAgICAgICAgIHRoaXMub25LZXlEb3duSW5uZXIoZXZlbnQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRpbWVTbG90QnV0dG9uc0VsZW1SZWZBcnJheSA9IFtcbiAgICAgICAgICAgIC4uLnRoaXMudGltZVNsb3RCdXR0b25zRWxlbVJlZi50b0FycmF5KClcbiAgICAgICAgXTtcbiAgICAgICAgaWYgKCEhdGltZVNsb3RCdXR0b25zRWxlbVJlZkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgdGltZVNsb3RCdXR0b25zRWxlbVJlZkFycmF5WzBdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5vbk5iVmlzaWJsZUVsZW1lbnRzQ2hhbmdlKGNoYW5nZXMubmJWaXNpYmxlRWxlbWVudHMpO1xuICAgIH1cblxuICAgIGNhcGl0YWxDYXNlRmlyc3RMZXR0ZXIoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFzKSB7XG4gICAgICAgICAgICByZXR1cm4gcztcbiAgICAgICAgfVxuICAgICAgICBpZiAocy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHJldHVybiBzLnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGAke3MuY2hhckF0KDApLnRvVXBwZXJDYXNlKCl9JHtzLnNsaWNlKDEpfWA7XG4gICAgfVxuXG4gICAgaGFuZGxlVXNlcklucHV0KFxuICAgICAgICBkYXk6IHN0cmluZyxcbiAgICAgICAgZGF0ZTogbnVtYmVyW10sXG4gICAgICAgIHRpbWU6IHN0cmluZyxcbiAgICAgICAgY2FsZW5kYXI6IENhbGVuZGFyXG4gICAgKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHZhbGlkVmFsdWUgPSB0aGlzLmdldFZhbGlkVmFsdWUoZGF5LCBkYXRlLCB0aW1lLCBjYWxlbmRhcik7XG4gICAgICAgIGlmICh0eXBlb2YgdmFsaWRWYWx1ZSAhPT0gJ3VuZGVmaW5lZCcpIHtcbiAgICAgICAgICAgIHRoaXMudXNlcklucHV0Lm5leHQodmFsaWRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZU5nTW9kZWwodmFsaWRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0b2dnbGVQYW5lbCgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc0Nsb3NlZCA9ICF0aGlzLmlzQ2xvc2VkO1xuICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCkge1xuICAgICAgICAgICAgdGhpcy5zbGljZU5iVmlzaWJsZUVsZW1lbnRzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBOZWVkIHNldFRpbWVvdXQgYmVjYXVzZSB3ZSBhcmUgb3V0c2lkZSBhbmd1bGFyIGNpY2xlIHdoZW4gcmVsb2FkaW5nIHBhZ2VcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudGltZVNsb3RzID0gdGhpcy5jdXJyZW50V2Vlay50aW1lU2xvdHM7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uTW9kZWxDaGFuZ2UodmFsdWU6IFNlbGVjdGVkU2xvdCk6IHZvaWQge1xuICAgICAgICBpZiAodmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lU2xvdCA9IGAke3ZhbHVlLmRheX0tJHt2YWx1ZS50aW1lfWA7XG4gICAgICAgICAgICB0aGlzLnRpbWVJbnB1dFZhbHVlID0gdmFsdWUudGltZTtcbiAgICAgICAgICAgIHRoaXMuZGF5SW5wdXRWYWx1ZSA9IHZhbHVlLmRheTtcbiAgICAgICAgfSBlbHNlIGlmICghdmFsdWUpIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRUaW1lU2xvdCA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnRpbWVJbnB1dFZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuZGF5SW5wdXRWYWx1ZSA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5zZWFyY2hUaW1lVmFsdWVJblRpbWVTbG90KCk7XG4gICAgfVxuXG4gICAgZ2V0VGltZUlucHV0VmFsdWUoczogc3RyaW5nKTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCEhcykge1xuICAgICAgICAgICAgY29uc3QgdmFsdWVTcGxpdCA9IHMuc3BsaXQoJy0nKTtcbiAgICAgICAgICAgIGlmICh2YWx1ZVNwbGl0Lmxlbmd0aCA+PSAyKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlU3BsaXRbMV07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHM7XG4gICAgfVxuXG4gICAgc2VhcmNoVGltZVZhbHVlSW5UaW1lU2xvdCgpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgcG9zaXRpb25WYWx1ZSA9IHRoaXMuY3VycmVudFdlZWsudGltZVNsb3RzLmZpbmRJbmRleChcbiAgICAgICAgICAgIHggPT5cbiAgICAgICAgICAgICAgICB4ID09PSB0aGlzLnRpbWVJbnB1dFZhbHVlICYmXG4gICAgICAgICAgICAgICAgdGhpcy5jdXJyZW50V2Vlay5kYXkgPT09IHRoaXMuZGF5SW5wdXRWYWx1ZVxuICAgICAgICApO1xuICAgICAgICBpZiAocG9zaXRpb25WYWx1ZSAhPT0gLTEgJiYgISF0aGlzLnNlbGVjdGVkVGltZVNsb3QpIHtcbiAgICAgICAgICAgIHRoaXMuaGFzU2VsZWN0ZWRTbG90SW5QYW5lbCA9IHRydWU7XG4gICAgICAgICAgICBpZiAodGhpcy5pc0Nsb3NlZCAmJiBwb3NpdGlvblZhbHVlID49IHRoaXMubmJWaXNpYmxlRWxlbWVudHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRvZ2dsZVBhbmVsKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmhhc1NlbGVjdGVkU2xvdEluUGFuZWwgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG9uVGltZUZvY3VzaW4oKTogdm9pZCB7XG4gICAgICAgIHRoaXMua2V5Ym9hcmROYXZpZ2F0aW9uQWxsb3dlZCA9IHRydWU7XG4gICAgICAgIHRoaXMuY3VycmVudEFjdGl2ZUVsZW1lbnQgPSBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuICAgIH1cblxuICAgIG9uVGltZUZvY3Vzb3V0KCk6IHZvaWQge1xuICAgICAgICB0aGlzLmtleWJvYXJkTmF2aWdhdGlvbkFsbG93ZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICBpc1NlbGVjdGVkKHRpbWVTbG90OiBzdHJpbmcpOiBib29sZWFuIHtcbiAgICAgICAgaWYgKCF0aGlzLnNlbGVjdGVkVGltZVNsb3QpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGltZVNsb3QgPT09IHRoaXMudGltZUlucHV0VmFsdWUgJiZcbiAgICAgICAgICAgIHRoaXMuY3VycmVudFdlZWsuZGF5ID09PSB0aGlzLmRheUlucHV0VmFsdWVcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBnZXRCdXR0b25UaW1lU2xvdEFyaWFMYWJlbChkYXk6IHN0cmluZywgdGltZVNsb3Q6IHN0cmluZyk6IHN0cmluZyB7XG4gICAgICAgIGxldCByZXN1bHQgPSBgJHtkYXl9ICR7dGltZVNsb3R9YDtcbiAgICAgICAgaWYgKHRoaXMuaXNTZWxlY3RlZCh0aW1lU2xvdCkpIHtcbiAgICAgICAgICAgIHJlc3VsdCArPSB0aGlzLmRpY3Rpb25hcnlTZXJ2aWNlLmdldEtleVN5bmMoXG4gICAgICAgICAgICAgICAgJ2ZvZWhuLWFnZW5kYS50aW1lc2xvdC5zZWxlY3RlZCdcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9XG5cbiAgICBnZXRUaW1lU2xvdFRhYkluZGV4KHRpbWVTbG90OiBzdHJpbmcsIGluZGV4OiBudW1iZXIpOiBudW1iZXIge1xuICAgICAgICBpZiAodGhpcy5pc1NlbGVjdGVkKHRpbWVTbG90KSkge1xuICAgICAgICAgICAgcmV0dXJuIDA7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKCFpbmRleCAmJiAhdGhpcy5oYXNTZWxlY3RlZFNsb3RJblBhbmVsKSB7XG4gICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gLTE7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzbGljZU5iVmlzaWJsZUVsZW1lbnRzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLnRpbWVTbG90cyA9IHRoaXMuY3VycmVudFdlZWsudGltZVNsb3RzLnNsaWNlKFxuICAgICAgICAgICAgMCxcbiAgICAgICAgICAgIHRoaXMubmJWaXNpYmxlRWxlbWVudHNcbiAgICAgICAgKTtcbiAgICAgICAgdGhpcy50aW1lc2xvdFJlbWFpbmluZyA9XG4gICAgICAgICAgICB0aGlzLmN1cnJlbnRXZWVrLnRpbWVTbG90cy5sZW5ndGggLSB0aGlzLm5iVmlzaWJsZUVsZW1lbnRzO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0VmFsaWRWYWx1ZShcbiAgICAgICAgZGF5OiBzdHJpbmcsXG4gICAgICAgIGRhdGU6IG51bWJlcltdLFxuICAgICAgICB0aW1lOiBzdHJpbmcsXG4gICAgICAgIGNhbGVuZGFyOiBDYWxlbmRhclxuICAgICk6IFNlbGVjdGVkU2xvdCB8IG51bGwgfCB1bmRlZmluZWQge1xuICAgICAgICBpZiAoIWRheSB8fCAhdGltZSkge1xuICAgICAgICAgICAgaWYgKHRoaXMubW9kZWxfICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiB1bmRlZmluZWQ7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGRheSxcbiAgICAgICAgICAgIHRpbWUsXG4gICAgICAgICAgICB5ZWFyOiBjYWxlbmRhci5jdXJyZW50V2Vlay55ZWFyLFxuICAgICAgICAgICAgd2Vla051bWJlcjogY2FsZW5kYXIuY3VycmVudFdlZWsud2Vla051bWJlcixcbiAgICAgICAgICAgIGRhdGVcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIG9uTmJWaXNpYmxlRWxlbWVudHNDaGFuZ2UoY2hhbmdlOiBTaW1wbGVDaGFuZ2UpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZSAmJiBjaGFuZ2UuY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnNsaWNlTmJWaXNpYmxlRWxlbWVudHMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgb25LZXlEb3duSW5uZXIoa2V5RXZlbnQ6IEtleWJvYXJkRXZlbnQpOiBib29sZWFuIHtcbiAgICAgICAgLy8gSUUgZG9lc24ndCBzdXBwb3J0IGtleUV2ZW50LmNvZGUsIGFuZCBoYXMgZGlmZmVyZW50IHZhbHVlc1xuICAgICAgICAvLyBpbiBrZXlFdmVudC5rZXkgKERvd24gaW5zdGVhZCBvZiBBcnJvd0Rvd24gZm9yIGluc3RhbmNlKSwgaGVuY2UgdGhlIG11bHRpLXN1cHBvcnQuXG4gICAgICAgIGNvbnN0IGllMTFDb21wYXRpYmxlQ29kZSA9IGtleUV2ZW50LmNvZGUgfHwga2V5RXZlbnQua2V5O1xuICAgICAgICBzd2l0Y2ggKGllMTFDb21wYXRpYmxlQ29kZSkge1xuICAgICAgICAgICAgY2FzZSAnRG93bic6XG4gICAgICAgICAgICBjYXNlICdBcnJvd0Rvd24nOlxuICAgICAgICAgICAgY2FzZSAnUmlnaHQnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dSaWdodCc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RpbWVTbG90KDEpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnVXAnOlxuICAgICAgICAgICAgY2FzZSAnQXJyb3dVcCc6XG4gICAgICAgICAgICBjYXNlICdMZWZ0JzpcbiAgICAgICAgICAgIGNhc2UgJ0Fycm93TGVmdCc6XG4gICAgICAgICAgICAgICAgdGhpcy5mb2N1c1RpbWVTbG90KC0xKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlJzpcbiAgICAgICAgICAgIGNhc2UgJ1NwYWNlYmFyJzpcbiAgICAgICAgICAgIGNhc2UgJ0VudGVyJzpcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5hY3RpdmVFbGVtZW50LmRpc3BhdGNoRXZlbnQobmV3IEV2ZW50KCdjbGljaycpKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBrZXlFdmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICBrZXlFdmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBmb2N1c1RpbWVTbG90KGluYzogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGJ1dHRvbnNBcnJheSA9IFsuLi50aGlzLnRpbWVTbG90QnV0dG9uc0VsZW1SZWYudG9BcnJheSgpXTtcbiAgICAgICAgY29uc3QgaW5kZXhzZWxlY3RlZCA9IGJ1dHRvbnNBcnJheS5maW5kSW5kZXgoXG4gICAgICAgICAgICBpdGVtID0+XG4gICAgICAgICAgICAgICAgaXRlbS5uYXRpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKSA9PT1cbiAgICAgICAgICAgICAgICB0aGlzLmN1cnJlbnRBY3RpdmVFbGVtZW50LmdldEF0dHJpYnV0ZSgnaWQnKVxuICAgICAgICApO1xuICAgICAgICBjb25zdCBuZXdJbmRleCA9IGluZGV4c2VsZWN0ZWQgKyBpbmM7XG4gICAgICAgIGlmIChuZXdJbmRleCA+PSBidXR0b25zQXJyYXkubGVuZ3RoKSB7XG4gICAgICAgICAgICBidXR0b25zQXJyYXlbMF0ubmF0aXZlRWxlbWVudC5mb2N1cygpO1xuICAgICAgICB9IGVsc2UgaWYgKG5ld0luZGV4IDwgMCkge1xuICAgICAgICAgICAgYnV0dG9uc0FycmF5W2J1dHRvbnNBcnJheS5sZW5ndGggLSAxXS5uYXRpdmVFbGVtZW50LmZvY3VzKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBidXR0b25zQXJyYXlbbmV3SW5kZXhdLm5hdGl2ZUVsZW1lbnQuZm9jdXMoKTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxzZWN0aW9uXG4gICAgKm5nSWY9XCJjYWxlbmRhciB8IGFzeW5jIGFzIGxvYWRlZENhbGVuZGFyXCJcbiAgICBjbGFzcz1cInBhbmVsIHBhbmVsLWRlZmF1bHQgbWItM1wiXG4+XG4gICAgPGRpdiBjbGFzcz1cInBhbmVsLWhlYWRpbmcgbXQtMiBtYi0yIHB5LTIgZC1mbGV4IGFsaWduLWl0ZW1zLWJhc2VsaW5lXCI+XG4gICAgICAgIDxoMyBjbGFzcz1cImg1IG1sLTMgbXQtMCBtYi0wXCI+XG4gICAgICAgICAgICB7eyBjYXBpdGFsQ2FzZUZpcnN0TGV0dGVyKGN1cnJlbnRXZWVrLmRheSkgfX1cbiAgICAgICAgICAgIDxzcGFuIGNsYXNzPVwic3Itb25seVwiICpuZ0lmPVwiISFpc1NlbGVjdGVkKHRpbWVJbnB1dFZhbHVlKVwiPlxuICAgICAgICAgICAgICAgICZuYnNwO3t7XG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuc2VsZWN0ZWQtdGltZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJvbURpY3Rpb25hcnk6IHsgdGltZVNlbGVjdGVkVmFsdWU6IHRpbWVJbnB1dFZhbHVlIH1cbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9zcGFuPlxuICAgICAgICA8L2gzPlxuICAgICAgICA8c21hbGwgKm5nSWY9XCIhIWN1cnJlbnRXZWVrLnRpbWVTbG90cy5sZW5ndGhcIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgJ2ZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbC5uYnItZGlzcG8nXG4gICAgICAgICAgICAgICAgICAgIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICAgICAgICAgIDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJFbGVtZW50czogY3VycmVudFdlZWsudGltZVNsb3RzLmxlbmd0aC50b1N0cmluZygpXG4gICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH19XG4gICAgICAgIDwvc21hbGw+XG4gICAgICAgIDxzbWFsbFxuICAgICAgICAgICAgKm5nSWY9XCIhY3VycmVudFdlZWsudGltZVNsb3RzLmxlbmd0aFwiXG4gICAgICAgICAgICBjbGFzcz1cImZvbnQtaXRhbGljIGFsaWduLXNlbGYtZW5kIG1sLTJcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyAnZm9laG4tYWdlbmRhLXRpbWVzbG90LXBhbmVsLm5vLWRpc3BvJyB8IGZyb21EaWN0aW9uYXJ5IH19XG4gICAgICAgIDwvc21hbGw+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiISFjdXJyZW50V2Vlay50aW1lU2xvdHMubGVuZ3RoXCJcbiAgICAgICAgY2xhc3M9XCJwYW5lbC1ib2R5IHJvdyBkLWZsZXggZmxleC13cmFwIG1sLWF1dG8gbXItYXV0byBwbC0zXCJcbiAgICAgICAgKGZvY3VzaW4pPVwib25UaW1lRm9jdXNpbigpXCJcbiAgICAgICAgKGZvY3Vzb3V0KT1cIm9uVGltZUZvY3Vzb3V0KClcIlxuICAgICAgICByb2xlPVwiYXBwbGljYXRpb25cIlxuICAgID5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgKm5nRm9yPVwibGV0IHRpbWVTbG90IG9mIHRpbWVTbG90czsgbGV0IGluZGV4ID0gaW5kZXhcIlxuICAgICAgICAgICAgY2xhc3M9XCJidG4gYnRuLWluZm8gbXItMiBtYi0yXCJcbiAgICAgICAgICAgICN0aW1lU2xvdEJ1dHRvbnNFbGVtUmVmXG4gICAgICAgICAgICBbYXR0ci5pZF09XCJjdXJyZW50V2Vlay5kYXkgKyAnLScgKyB0aW1lU2xvdFwiXG4gICAgICAgICAgICBbdGFiaW5kZXhdPVwiZ2V0VGltZVNsb3RUYWJJbmRleCh0aW1lU2xvdCwgaW5kZXgpXCJcbiAgICAgICAgICAgIFtjbGFzcy5idG4tZGFuZ2VyXT1cImlzU2VsZWN0ZWQodGltZVNsb3QpXCJcbiAgICAgICAgICAgIChjbGljayk9XCJcbiAgICAgICAgICAgICAgICBoYW5kbGVVc2VySW5wdXQoXG4gICAgICAgICAgICAgICAgICAgIGN1cnJlbnRXZWVrLmRheSxcbiAgICAgICAgICAgICAgICAgICAgY3VycmVudFdlZWsuZGF0ZSxcbiAgICAgICAgICAgICAgICAgICAgdGltZVNsb3QsXG4gICAgICAgICAgICAgICAgICAgIGxvYWRlZENhbGVuZGFyXG4gICAgICAgICAgICAgICAgKVxuICAgICAgICAgICAgXCJcbiAgICAgICAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiXG4gICAgICAgICAgICAgICAgZ2V0QnV0dG9uVGltZVNsb3RBcmlhTGFiZWwoY3VycmVudFdlZWsuZGF5LCB0aW1lU2xvdClcbiAgICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgICAgIHt7IHRpbWVTbG90IH19XG4gICAgICAgIDwvYnV0dG9uPlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgICBjbGFzcz1cImNvbC0xMiBkLWZsZXgganVzdGlmeS1jb250ZW50LWVuZCBtYi0xXCJcbiAgICAgICAgICAgICpuZ0lmPVwiY3VycmVudFdlZWsudGltZVNsb3RzLmxlbmd0aCA+IG5iVmlzaWJsZUVsZW1lbnRzXCJcbiAgICAgICAgPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgIGNsYXNzPVwiYnRuIGJ0bi1saW5rIHNob3ctbW9yZVwiXG4gICAgICAgICAgICAgICAgI3RpbWVTbG90QnV0dG9uc0VsZW1SZWZcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwidG9nZ2xlUGFuZWwoKVwiXG4gICAgICAgICAgICAgICAgW2F0dHIuYXJpYS1sYWJlbF09XCJcbiAgICAgICAgICAgICAgICAgICAgKGlzQ2xvc2VkXG4gICAgICAgICAgICAgICAgICAgICAgICA/ICdmb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuc2hvdy1tb3JlLXNyLW9ubHknXG4gICAgICAgICAgICAgICAgICAgICAgICA6ICdmb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuc2hvdy1sZXNzJ1xuICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmJyRWxlbWVudHNIaWRkZW46IHRpbWVzbG90UmVtYWluaW5nLnRvU3RyaW5nKClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgIChpc0Nsb3NlZFxuICAgICAgICAgICAgICAgICAgICAgICAgPyAnZm9laG4uYWdlbmRhLXRpbWVzbG90LXBhbmVsLnNob3ctbW9yZSdcbiAgICAgICAgICAgICAgICAgICAgICAgIDogJ2ZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbC5zaG93LWxlc3MnXG4gICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYnJFbGVtZW50c0hpZGRlbjogdGltZXNsb3RSZW1haW5pbmcudG9TdHJpbmcoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG48L3NlY3Rpb24+XG4iXX0=
@@ -0,0 +1,95 @@
1
+ import { Component, EventEmitter, forwardRef, Input, Output, ViewChildren } from '@angular/core';
2
+ import { FoehnInputComponent } from '../foehn-input/foehn-input.component';
3
+ import * as i0 from "@angular/core";
4
+ import * as i1 from "../sdk-dictionary/sdk-dictionary.service";
5
+ import * as i2 from "../foehn-validation-alerts/foehn-validation-alerts.component";
6
+ import * as i3 from "./foehn-agenda-navigation/foehn-agenda-navigation.component";
7
+ import * as i4 from "./foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component";
8
+ import * as i5 from "@angular/common";
9
+ import * as i6 from "@angular/forms";
10
+ import * as i7 from "../sdk-dictionary/sdk-dictionary.pipe";
11
+ export class FoehnAgendaComponent extends FoehnInputComponent {
12
+ constructor(dictionaryService) {
13
+ super();
14
+ this.dictionaryService = dictionaryService;
15
+ this.paginationChange = new EventEmitter();
16
+ this.srAnnouncements = '';
17
+ this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS = 1000;
18
+ }
19
+ static cleanIdForQuerySelector(s) {
20
+ return s.replace(new RegExp('\\.', 'g'), '\\.');
21
+ }
22
+ focus() {
23
+ const timeSlotPanelsElemRefArray = [
24
+ ...this.timeSlotPanelsElemRef.toArray()
25
+ ];
26
+ if (!!timeSlotPanelsElemRefArray.length) {
27
+ const timeSlotPanel = timeSlotPanelsElemRefArray.find(elem => !!elem.timeSlots && !!elem.timeSlots.length);
28
+ if (!!timeSlotPanel) {
29
+ timeSlotPanel.focus();
30
+ }
31
+ }
32
+ }
33
+ paginate(paginationWeek) {
34
+ this.paginationChange.next(paginationWeek);
35
+ }
36
+ handleUserInput(selectedTimeSlot) {
37
+ // markAsDirty hides error by simulating the control on ngModel as dirty
38
+ this.markAsDirty();
39
+ this.manageScreenReaderAnnouncement(`${selectedTimeSlot.day} ${selectedTimeSlot.time} ${this.dictionaryService.getKeySync('foehn-agenda.timeslot.selected')}`);
40
+ }
41
+ scrollToNavigation(isTop) {
42
+ let navigationId = `#${FoehnAgendaComponent.cleanIdForQuerySelector(this.buildChildId('week-pagination'))}`;
43
+ navigationId += isTop ? '-bottom' : '-top';
44
+ const navigationElement = document.querySelector(navigationId);
45
+ if (navigationElement) {
46
+ navigationElement.scrollIntoView();
47
+ }
48
+ const navigationLinkId = `${navigationId} .vd-pagination__link`;
49
+ const navigationLink = document.querySelector(navigationLinkId);
50
+ if (navigationLink) {
51
+ navigationLink.focus();
52
+ }
53
+ }
54
+ extractDayTime(selected) {
55
+ if (!selected) {
56
+ return '';
57
+ }
58
+ return `${selected.day} ${selected.time}`;
59
+ }
60
+ manageScreenReaderAnnouncement(msg) {
61
+ clearTimeout(this.srAnnouncementClearTimer);
62
+ this.srAnnouncements = msg;
63
+ this.srAnnouncementClearTimer = setTimeout(() => {
64
+ this.srAnnouncements = '';
65
+ }, this.SR_ANNOUNCEMENT_CLEAR_TIMEOUT_INTERVAL_MS);
66
+ }
67
+ }
68
+ FoehnAgendaComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaComponent, deps: [{ token: i1.SdkDictionaryService }], target: i0.ɵɵFactoryTarget.Component });
69
+ FoehnAgendaComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "12.0.0", version: "13.1.3", type: FoehnAgendaComponent, selector: "foehn-agenda", inputs: { calendar: "calendar", nbVisibleElements: "nbVisibleElements" }, outputs: { paginationChange: "paginationChange" }, providers: [
70
+ {
71
+ provide: FoehnInputComponent,
72
+ useExisting: forwardRef(() => FoehnAgendaComponent),
73
+ multi: true
74
+ }
75
+ ], viewQueries: [{ propertyName: "timeSlotPanelsElemRef", predicate: ["timeSlotPanelElemRef"], descendants: true }], usesInheritance: true, ngImport: i0, template: "<div\n class=\"form-group\"\n [class.has-danger]=\"hasErrors()\"\n [class.vd-form-group-danger]=\"hasErrors()\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n>\n <p\n [attr.id]=\"buildChildId() + 'Label'\"\n [attr.for]=\"buildChildId()\"\n *ngIf=\"label && type !== 'hidden'\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : 'vd-p'\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </p>\n\n <small\n *ngIf=\"helpText && type !== 'hidden'\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-container *ngIf=\"!(calendar | async)\">\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n <p class=\"alert alert-warning\">\n {{ 'foehn-agenda.calendar-indisponible' | fromDictionary }}\n </p>\n </ng-container>\n\n <!-- Fake input with NgModel to be registered into Form controls -->\n <input type=\"hidden\" [name]=\"name || label\" [ngModel]=\"model\" />\n\n <p\n [id]=\"buildChildId('srOnlyAnnouncements')\"\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ srAnnouncements }}\n </p>\n\n <ng-content></ng-content>\n\n <ng-container *ngIf=\"calendar | async as loadedCalendar\">\n <section\n class=\"mb-3\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-invalid]=\"hasErrors() || null\"\n >\n <h2 class=\"h3 mt-3\">\n <span aria-live=\"polite\" role=\"status\" aria-atomic=\"true\">\n {{ loadedCalendar.currentWeek.label }}\n </span>\n </h2>\n\n <!-- Rappel de l'heure actuellement s\u00E9lectionn\u00E9e -->\n <p [id]=\"buildChildId('timeSlotSelectedSrOnly')\" class=\"sr-only\">\n {{ extractDayTime(model) }}\n </p>\n\n <!-- Navigation top hidden from screen reader-->\n <foehn-agenda-navigation\n [id]=\"buildChildId() + 'week-pagination-top'\"\n [calendar]=\"loadedCalendar\"\n (paginationChange)=\"paginate($event)\"\n aria-hidden=\"true\"\n ></foehn-agenda-navigation>\n\n <!-- Link to navigation bottom only for screen reader -->\n <p [id]=\"buildChildId('navigationBottomAnchor')\" class=\"sr-only\">\n {{\n 'foehn-agenda.pagination-anchor.first-part' | fromDictionary\n }}\n <a\n href=\"#\"\n (click)=\"$event.preventDefault(); scrollToNavigation(true)\"\n >\n {{\n 'foehn-agenda.pagination-anchor.top-next-part'\n | fromDictionary\n }}\n </a>\n </p>\n\n <foehn-validation-alerts\n [component]=\"this\"\n ></foehn-validation-alerts>\n\n <div\n class=\"row\"\n [tabIndex]=\"hasErrors() ? 0 : -1\"\n [attr.id]=\"buildChildId()\"\n #entryComponent\n >\n <foehn-agenda-timeslot-panel\n *ngFor=\"let currentWeek of loadedCalendar.currentWeek.week\"\n class=\"col-12\"\n #timeSlotPanelElemRef\n [currentWeek]=\"currentWeek\"\n [calendar]=\"calendar\"\n [nbVisibleElements]=\"nbVisibleElements\"\n [(model)]=\"model\"\n (userInput)=\"handleUserInput($event)\"\n ></foehn-agenda-timeslot-panel>\n </div>\n </section>\n\n <!-- Navigation bottom used for screen reader only -->\n <foehn-agenda-navigation\n class=\"sr-only\"\n [id]=\"buildChildId() + 'week-pagination-bottom'\"\n [calendar]=\"loadedCalendar\"\n [isSrOnly]=\"true\"\n (paginationChange)=\"paginate($event)\"\n ></foehn-agenda-navigation>\n\n <!-- Link to navigation top hidden from screen reader -->\n <p [id]=\"buildChildId('navigationTopAnchor')\" aria-hidden=\"true\">\n {{ 'foehn-agenda.pagination-anchor.first-part' | fromDictionary }}\n <a\n href=\"#\"\n (click)=\"$event.preventDefault(); scrollToNavigation(false)\"\n >\n {{\n 'foehn-agenda.pagination-anchor.bottom-next-part'\n | fromDictionary\n }}\n </a>\n </p>\n </ng-container>\n</div>\n", components: [{ type: i2.FoehnValidationAlertsComponent, selector: "foehn-validation-alerts", inputs: ["component", "shouldErrorsBeLive"] }, { type: i3.FoehnAgendaNavigationComponent, selector: "foehn-agenda-navigation", inputs: ["id", "calendar", "isSrOnly"], outputs: ["paginationChange"] }, { type: i4.FoehnAgendaTimeslotPanelComponent, selector: "foehn-agenda-timeslot-panel", inputs: ["calendar", "nbVisibleElements", "currentWeek"] }], directives: [{ type: i5.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { type: i5.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { type: i6.DefaultValueAccessor, selector: "input:not([type=checkbox])[formControlName],textarea[formControlName],input:not([type=checkbox])[formControl],textarea[formControl],input:not([type=checkbox])[ngModel],textarea[ngModel],[ngDefaultControl]" }, { type: i6.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { type: i6.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { type: i5.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }], pipes: { "fromDictionary": i7.SdkDictionaryPipe, "async": i5.AsyncPipe } });
76
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaComponent, decorators: [{
77
+ type: Component,
78
+ args: [{ selector: 'foehn-agenda', providers: [
79
+ {
80
+ provide: FoehnInputComponent,
81
+ useExisting: forwardRef(() => FoehnAgendaComponent),
82
+ multi: true
83
+ }
84
+ ], template: "<div\n class=\"form-group\"\n [class.has-danger]=\"hasErrors()\"\n [class.vd-form-group-danger]=\"hasErrors()\"\n [attr.id]=\"buildId('Container')\"\n tabindex=\"-1\"\n>\n <p\n [attr.id]=\"buildChildId() + 'Label'\"\n [attr.for]=\"buildChildId()\"\n *ngIf=\"label && type !== 'hidden'\"\n [ngClass]=\"isLabelSrOnly ? 'sr-only' : 'vd-p'\"\n >\n <span [innerHTML]=\"label\"></span>\n <span\n *ngIf=\"!required && !hideNotRequiredExtraLabel\"\n aria-hidden=\"true\"\n >\n {{ 'foehn-input.optional' | fromDictionary }}\n </span>\n </p>\n\n <small\n *ngIf=\"helpText && type !== 'hidden'\"\n [attr.id]=\"buildChildId() + 'Help'\"\n class=\"form-text text-secondary\"\n [innerHTML]=\"helpText\"\n ></small>\n\n <ng-container *ngIf=\"!(calendar | async)\">\n <foehn-validation-alerts [component]=\"this\"></foehn-validation-alerts>\n <p class=\"alert alert-warning\">\n {{ 'foehn-agenda.calendar-indisponible' | fromDictionary }}\n </p>\n </ng-container>\n\n <!-- Fake input with NgModel to be registered into Form controls -->\n <input type=\"hidden\" [name]=\"name || label\" [ngModel]=\"model\" />\n\n <p\n [id]=\"buildChildId('srOnlyAnnouncements')\"\n class=\"sr-only\"\n aria-live=\"polite\"\n aria-atomic=\"true\"\n >\n {{ srAnnouncements }}\n </p>\n\n <ng-content></ng-content>\n\n <ng-container *ngIf=\"calendar | async as loadedCalendar\">\n <section\n class=\"mb-3\"\n [attr.aria-describedby]=\"getDescribedBy()\"\n [attr.aria-invalid]=\"hasErrors() || null\"\n >\n <h2 class=\"h3 mt-3\">\n <span aria-live=\"polite\" role=\"status\" aria-atomic=\"true\">\n {{ loadedCalendar.currentWeek.label }}\n </span>\n </h2>\n\n <!-- Rappel de l'heure actuellement s\u00E9lectionn\u00E9e -->\n <p [id]=\"buildChildId('timeSlotSelectedSrOnly')\" class=\"sr-only\">\n {{ extractDayTime(model) }}\n </p>\n\n <!-- Navigation top hidden from screen reader-->\n <foehn-agenda-navigation\n [id]=\"buildChildId() + 'week-pagination-top'\"\n [calendar]=\"loadedCalendar\"\n (paginationChange)=\"paginate($event)\"\n aria-hidden=\"true\"\n ></foehn-agenda-navigation>\n\n <!-- Link to navigation bottom only for screen reader -->\n <p [id]=\"buildChildId('navigationBottomAnchor')\" class=\"sr-only\">\n {{\n 'foehn-agenda.pagination-anchor.first-part' | fromDictionary\n }}\n <a\n href=\"#\"\n (click)=\"$event.preventDefault(); scrollToNavigation(true)\"\n >\n {{\n 'foehn-agenda.pagination-anchor.top-next-part'\n | fromDictionary\n }}\n </a>\n </p>\n\n <foehn-validation-alerts\n [component]=\"this\"\n ></foehn-validation-alerts>\n\n <div\n class=\"row\"\n [tabIndex]=\"hasErrors() ? 0 : -1\"\n [attr.id]=\"buildChildId()\"\n #entryComponent\n >\n <foehn-agenda-timeslot-panel\n *ngFor=\"let currentWeek of loadedCalendar.currentWeek.week\"\n class=\"col-12\"\n #timeSlotPanelElemRef\n [currentWeek]=\"currentWeek\"\n [calendar]=\"calendar\"\n [nbVisibleElements]=\"nbVisibleElements\"\n [(model)]=\"model\"\n (userInput)=\"handleUserInput($event)\"\n ></foehn-agenda-timeslot-panel>\n </div>\n </section>\n\n <!-- Navigation bottom used for screen reader only -->\n <foehn-agenda-navigation\n class=\"sr-only\"\n [id]=\"buildChildId() + 'week-pagination-bottom'\"\n [calendar]=\"loadedCalendar\"\n [isSrOnly]=\"true\"\n (paginationChange)=\"paginate($event)\"\n ></foehn-agenda-navigation>\n\n <!-- Link to navigation top hidden from screen reader -->\n <p [id]=\"buildChildId('navigationTopAnchor')\" aria-hidden=\"true\">\n {{ 'foehn-agenda.pagination-anchor.first-part' | fromDictionary }}\n <a\n href=\"#\"\n (click)=\"$event.preventDefault(); scrollToNavigation(false)\"\n >\n {{\n 'foehn-agenda.pagination-anchor.bottom-next-part'\n | fromDictionary\n }}\n </a>\n </p>\n </ng-container>\n</div>\n" }]
85
+ }], ctorParameters: function () { return [{ type: i1.SdkDictionaryService }]; }, propDecorators: { calendar: [{
86
+ type: Input
87
+ }], nbVisibleElements: [{
88
+ type: Input
89
+ }], paginationChange: [{
90
+ type: Output
91
+ }], timeSlotPanelsElemRef: [{
92
+ type: ViewChildren,
93
+ args: ['timeSlotPanelElemRef']
94
+ }] } });
95
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tYWdlbmRhLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZ2VuZGEvZm9laG4tYWdlbmRhLmNvbXBvbmVudC50cyIsIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZ2VuZGEvZm9laG4tYWdlbmRhLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLFVBQVUsRUFDVixLQUFLLEVBQ0wsTUFBTSxFQUVOLFlBQVksRUFDZixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQzs7Ozs7Ozs7O0FBbUIzRSxNQUFNLE9BQU8sb0JBQXFCLFNBQVEsbUJBQWlDO0lBbUJ2RSxZQUFvQixpQkFBdUM7UUFDdkQsS0FBSyxFQUFFLENBQUM7UUFEUSxzQkFBaUIsR0FBakIsaUJBQWlCLENBQXNCO1FBWDNELHFCQUFnQixHQUFHLElBQUksWUFBWSxFQUFrQixDQUFDO1FBS3RELG9CQUFlLEdBQUcsRUFBRSxDQUFDO1FBSUosOENBQXlDLEdBQUcsSUFBSSxDQUFDO0lBSWxFLENBQUM7SUFFTyxNQUFNLENBQUMsdUJBQXVCLENBQUMsQ0FBUztRQUM1QyxPQUFPLENBQUMsQ0FBQyxPQUFPLENBQUMsSUFBSSxNQUFNLENBQUMsS0FBSyxFQUFFLEdBQUcsQ0FBQyxFQUFFLEtBQUssQ0FBQyxDQUFDO0lBQ3BELENBQUM7SUFFRCxLQUFLO1FBQ0QsTUFBTSwwQkFBMEIsR0FBRztZQUMvQixHQUFHLElBQUksQ0FBQyxxQkFBcUIsQ0FBQyxPQUFPLEVBQUU7U0FDMUMsQ0FBQztRQUNGLElBQUksQ0FBQyxDQUFDLDBCQUEwQixDQUFDLE1BQU0sRUFBRTtZQUNyQyxNQUFNLGFBQWEsR0FBRywwQkFB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dCI6WyJpbXBvcnQge1xuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgZm9yd2FyZFJlZixcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgUXVlcnlMaXN0LFxuICAgIFZpZXdDaGlsZHJlblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEZvZWhuSW5wdXRDb21wb25lbnQgfSBmcm9tICcuLi9mb2Vobi1pbnB1dC9mb2Vobi1pbnB1dC5jb21wb25lbnQnO1xuaW1wb3J0IHsgT2JzZXJ2YWJsZSB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgU2VsZWN0ZWRTbG90IH0gZnJvbSAnLi9zZWxlY3RlZC1zbG90LnR5cGUnO1xuaW1wb3J0IHsgQ2FsZW5kYXIgfSBmcm9tICcuL2NhbGVuZGFyLnR5cGUnO1xuaW1wb3J0IHsgUGFnaW5hdGlvbldlZWsgfSBmcm9tICcuL3BhZ2luYXRpb24td2Vlay50eXBlJztcbmltcG9ydCB7IFNka0RpY3Rpb25hcnlTZXJ2aWNlIH0gZnJvbSAnLi4vc2RrLWRpY3Rpb25hcnkvc2RrLWRpY3Rpb25hcnkuc2VydmljZSc7XG5pbXBvcnQgeyBGb2VobkFnZW5kYVRpbWVzbG90UGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2ZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbC9mb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuY29tcG9uZW50JztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdmb2Vobi1hZ2VuZGEnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9mb2Vobi1hZ2VuZGEuY29tcG9uZW50Lmh0bWwnLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBGb2VobklucHV0Q29tcG9uZW50LFxuICAgICAgICAgICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRm9laG5BZ2VuZGFDb21wb25lbnQpLFxuICAgICAgICAgICAgbXVsdGk6IHRydWVcbiAgICAgICAgfVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgRm9laG5BZ2VuZGFDb21wb25lbnQgZXh0ZW5kcyBGb2VobklucHV0Q29tcG9uZW50PFNlbGVjdGVkU2xvdD4ge1xuICAgIEBJbnB1dCgpXG4gICAgY2FsZW5kYXI6IE9ic2VydmFibGU8Q2FsZW5kYXI+O1xuXG4gICAgQElucHV0KClcbiAgICBuYlZpc2libGVFbGVtZW50czogbnVtYmVyO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcGFnaW5hdGlvbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8UGFnaW5hdGlvbldlZWs+KCk7XG5cbiAgICBAVmlld0NoaWxkcmVuKCd0aW1lU2xvdFBhbmVsRWxlbVJlZicpXG4gICAgdGltZVNsb3RQYW5lbHNFbGVtUmVmOiBRdWVyeUxpc3Q8Rm9laG5BZ2VuZGFUaW1lc2xvdFBhbmVsQ29tcG9uZW50PjtcblxuICAgIHNyQW5ub3VuY2VtZW50cyA9ICcnO1xuXG4gICAgLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby1leHBsaWNpdC1hbnlcbiAgICBwcml2YXRlIHNyQW5ub3VuY2VtZW50Q2xlYXJUaW1lcjogYW55O1xuICAgIHByaXZhdGUgcmVhZG9ubHkgU1JfQU5OT1VOQ0VNRU5UX0NMRUFSX1RJTUVPVVRfSU5URVJWQUxfTVMgPSAxMDAwO1xuXG4gICAgY29uc3RydWN0b3IocHJpdmF0ZSBkaWN0aW9uYXJ5U2VydmljZTogU2RrRGljdGlvbmFyeVNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHN0YXRpYyBjbGVhbklkRm9yUXVlcnlTZWxlY3RvcihzOiBzdHJpbmcpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gcy5yZXBsYWNlKG5ldyBSZWdFeHAoJ1xcXFwuJywgJ2cnKSwgJ1xcXFwuJyk7XG4gICAgfVxuXG4gICAgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHRpbWVTbG90UGFuZWxzRWxlbVJlZkFycmF5ID0gW1xuICAgICAgICAgICAgLi4udGhpcy50aW1lU2xvdFBhbmVsc0VsZW1SZWYudG9BcnJheSgpXG4gICAgICAgIF07XG4gICAgICAgIGlmICghIXRpbWVTbG90UGFuZWxzRWxlbVJlZkFycmF5Lmxlbmd0aCkge1xuICAgICAgICAgICAgY29uc3QgdGltZVNsb3RQYW5lbCA9IHRpbWVTbG90UGFuZWxzRWxlbVJlZkFycmF5LmZpbmQoXG4gICAgICAgICAgICAgICAgZWxlbSA9PiAhIWVsZW0udGltZVNsb3RzICYmICEhZWxlbS50aW1lU2xvdHMubGVuZ3RoXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgaWYgKCEhdGltZVNsb3RQYW5lbCkge1xuICAgICAgICAgICAgICAgIHRpbWVTbG90UGFuZWwuZm9jdXMoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHBhZ2luYXRlKHBhZ2luYXRpb25XZWVrOiBQYWdpbmF0aW9uV2Vlayk6IHZvaWQge1xuICAgICAgICB0aGlzLnBhZ2luYXRpb25DaGFuZ2UubmV4dChwYWdpbmF0aW9uV2Vlayk7XG4gICAgfVxuXG4gICAgaGFuZGxlVXNlcklucHV0KHNlbGVjdGVkVGltZVNsb3Q6IFNlbGVjdGVkU2xvdCk6IHZvaWQge1xuICAgICAgICAvLyBtYXJrQXNEaXJ0eSBoaWRlcyBlcnJvciBieSBzaW11bGF0aW5nIHRoZSBjb250cm9sIG9uIG5nTW9kZWwgYXMgZGlydHlcbiAgICAgICAgdGhpcy5tYXJrQXNEaXJ0eSgpO1xuICAgICAgICB0aGlzLm1hbmFnZVNjcmVlblJlYWRlckFubm91bmNlbWVudChcbiAgICAgICAgICAgIGAke3NlbGVjdGVkVGltZVNsb3QuZGF5fSAke1xuICAgICAgICAgICAgICAgIHNlbGVjdGVkVGltZVNsb3QudGltZVxuICAgICAgICAgICAgfSAke3RoaXMuZGljdGlvbmFyeVNlcnZpY2UuZ2V0S2V5U3luYyhcbiAgICAgICAgICAgICAgICAnZm9laG4tYWdlbmRhLnRpbWVzbG90LnNlbGVjdGVkJ1xuICAgICAgICAgICAgKX1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2Nyb2xsVG9OYXZpZ2F0aW9uKGlzVG9wOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGxldCBuYXZpZ2F0aW9uSWQgPSBgIyR7Rm9laG5BZ2VuZGFDb21wb25lbnQuY2xlYW5JZEZvclF1ZXJ5U2VsZWN0b3IoXG4gICAgICAgICAgICB0aGlzLmJ1aWxkQ2hpbGRJZCgnd2Vlay1wYWdpbmF0aW9uJylcbiAgICAgICAgKX1gO1xuICAgICAgICBuYXZpZ2F0aW9uSWQgKz0gaXNUb3AgPyAnLWJvdHRvbScgOiAnLXRvcCc7XG4gICAgICAgIGNvbnN0IG5hdmlnYXRpb25FbGVtZW50ID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvcihuYXZpZ2F0aW9uSWQpO1xuICAgICAgICBpZiAobmF2aWdhdGlvbkVsZW1lbnQpIHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25FbGVtZW50LnNjcm9sbEludG9WaWV3KCk7XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgbmF2aWdhdGlvbkxpbmtJZCA9IGAke25hdmlnYXRpb25JZH0gLnZkLXBhZ2luYXRpb25fX2xpbmtgO1xuICAgICAgICBjb25zdCBuYXZpZ2F0aW9uTGluazogSFRNTEVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKFxuICAgICAgICAgICAgbmF2aWdhdGlvbkxpbmtJZFxuICAgICAgICApO1xuICAgICAgICBpZiAobmF2aWdhdGlvbkxpbmspIHtcbiAgICAgICAgICAgIG5hdmlnYXRpb25MaW5rLmZvY3VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBleHRyYWN0RGF5VGltZShzZWxlY3RlZDogU2VsZWN0ZWRTbG90KTogc3RyaW5nIHtcbiAgICAgICAgaWYgKCFzZWxlY3RlZCkge1xuICAgICAgICAgICAgcmV0dXJuICcnO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBgJHtzZWxlY3RlZC5kYXl9ICR7c2VsZWN0ZWQudGltZX1gO1xuICAgIH1cblxuICAgIHByaXZhdGUgbWFuYWdlU2NyZWVuUmVhZGVyQW5ub3VuY2VtZW50KG1zZzogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGNsZWFyVGltZW91dCh0aGlzLnNyQW5ub3VuY2VtZW50Q2xlYXJUaW1lcik7XG4gICAgICAgIHRoaXMuc3JBbm5vdW5jZW1lbnRzID0gbXNnO1xuICAgICAgICB0aGlzLnNyQW5ub3VuY2VtZW50Q2xlYXJUaW1lciA9IHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5zckFubm91bmNlbWVudHMgPSAnJztcbiAgICAgICAgfSwgdGhpcy5TUl9BTk5PVU5DRU1FTlRfQ0xFQVJfVElNRU9VVF9JTlRFUlZBTF9NUyk7XG4gICAgfVxufVxuIiwiPGRpdlxuICAgIGNsYXNzPVwiZm9ybS1ncm91cFwiXG4gICAgW2NsYXNzLmhhcy1kYW5nZXJdPVwiaGFzRXJyb3JzKClcIlxuICAgIFtjbGFzcy52ZC1mb3JtLWdyb3VwLWRhbmdlcl09XCJoYXNFcnJvcnMoKVwiXG4gICAgW2F0dHIuaWRdPVwiYnVpbGRJZCgnQ29udGFpbmVyJylcIlxuICAgIHRhYmluZGV4PVwiLTFcIlxuPlxuICAgIDxwXG4gICAgICAgIFthdHRyLmlkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ0xhYmVsJ1wiXG4gICAgICAgIFthdHRyLmZvcl09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgICpuZ0lmPVwibGFiZWwgJiYgdHlwZSAhPT0gJ2hpZGRlbidcIlxuICAgICAgICBbbmdDbGFzc109XCJpc0xhYmVsU3JPbmx5ID8gJ3NyLW9ubHknIDogJ3ZkLXAnXCJcbiAgICA+XG4gICAgICAgIDxzcGFuIFtpbm5lckhUTUxdPVwibGFiZWxcIj48L3NwYW4+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICAqbmdJZj1cIiFyZXF1aXJlZCAmJiAhaGlkZU5vdFJlcXVpcmVkRXh0cmFMYWJlbFwiXG4gICAgICAgICAgICBhcmlhLWhpZGRlbj1cInRydWVcIlxuICAgICAgICA+XG4gICAgICAgICAgICB7eyAnZm9laG4taW5wdXQub3B0aW9uYWwnIHwgZnJvbURpY3Rpb25hcnkgfX1cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvcD5cblxuICAgIDxzbWFsbFxuICAgICAgICAqbmdJZj1cImhlbHBUZXh0ICYmIHR5cGUgIT09ICdoaWRkZW4nXCJcbiAgICAgICAgW2F0dHIuaWRdPVwiYnVpbGRDaGlsZElkKCkgKyAnSGVscCdcIlxuICAgICAgICBjbGFzcz1cImZvcm0tdGV4dCB0ZXh0LXNlY29uZGFyeVwiXG4gICAgICAgIFtpbm5lckhUTUxdPVwiaGVscFRleHRcIlxuICAgID48L3NtYWxsPlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiEoY2FsZW5kYXIgfCBhc3luYylcIj5cbiAgICAgICAgPGZvZWhuLXZhbGlkYXRpb24tYWxlcnRzIFtjb21wb25lbnRdPVwidGhpc1wiPjwvZm9laG4tdmFsaWRhdGlvbi1hbGVydHM+XG4gICAgICAgIDxwIGNsYXNzPVwiYWxlcnQgYWxlcnQtd2FybmluZ1wiPlxuICAgICAgICAgICAge3sgJ2ZvZWhuLWFnZW5kYS5jYWxlbmRhci1pbmRpc3BvbmlibGUnIHwgZnJvbURpY3Rpb25hcnkgfX1cbiAgICAgICAgPC9wPlxuICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgPCEtLSBGYWtlIGlucHV0IHdpdGggTmdNb2RlbCB0byBiZSByZWdpc3RlcmVkIGludG8gRm9ybSBjb250cm9scyAtLT5cbiAgICA8aW5wdXQgdHlwZT1cImhpZGRlblwiIFtuYW1lXT1cIm5hbWUgfHwgbGFiZWxcIiBbbmdNb2RlbF09XCJtb2RlbFwiIC8+XG5cbiAgICA8cFxuICAgICAgICBbaWRdPVwiYnVpbGRDaGlsZElkKCdzck9ubHlBbm5vdW5jZW1lbnRzJylcIlxuICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICBhcmlhLWxpdmU9XCJwb2xpdGVcIlxuICAgICAgICBhcmlhLWF0b21pYz1cInRydWVcIlxuICAgID5cbiAgICAgICAge3sgc3JBbm5vdW5jZW1lbnRzIH19XG4gICAgPC9wPlxuXG4gICAgPG5nLWNvbnRlbnQ+PC9uZy1jb250ZW50PlxuXG4gICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cImNhbGVuZGFyIHwgYXN5bmMgYXMgbG9hZGVkQ2FsZW5kYXJcIj5cbiAgICAgICAgPHNlY3Rpb25cbiAgICAgICAgICAgIGNsYXNzPVwibWItM1wiXG4gICAgICAgICAgICBbYXR0ci5hcmlhLWRlc2NyaWJlZGJ5XT1cImdldERlc2NyaWJlZEJ5KClcIlxuICAgICAgICAgICAgW2F0dHIuYXJpYS1pbnZhbGlkXT1cImhhc0Vycm9ycygpIHx8IG51bGxcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8aDIgY2xhc3M9XCJoMyBtdC0zXCI+XG4gICAgICAgICAgICAgICAgPHNwYW4gYXJpYS1saXZlPVwicG9saXRlXCIgcm9sZT1cInN0YXR1c1wiIGFyaWEtYXRvbWljPVwidHJ1ZVwiPlxuICAgICAgICAgICAgICAgICAgICB7eyBsb2FkZWRDYWxlbmRhci5jdXJyZW50V2Vlay5sYWJlbCB9fVxuICAgICAgICAgICAgICAgIDwvc3Bhbj5cbiAgICAgICAgICAgIDwvaDI+XG5cbiAgICAgICAgICAgIDwhLS0gUmFwcGVsIGRlIGwnaGV1cmUgYWN0dWVsbGVtZW50IHPDqWxlY3Rpb25uw6llIC0tPlxuICAgICAgICAgICAgPHAgW2lkXT1cImJ1aWxkQ2hpbGRJZCgndGltZVNsb3RTZWxlY3RlZFNyT25seScpXCIgY2xhc3M9XCJzci1vbmx5XCI+XG4gICAgICAgICAgICAgICAge3sgZXh0cmFjdERheVRpbWUobW9kZWwpIH19XG4gICAgICAgICAgICA8L3A+XG5cbiAgICAgICAgICAgIDwhLS0gTmF2aWdhdGlvbiB0b3AgaGlkZGVuIGZyb20gc2NyZWVuIHJlYWRlci0tPlxuICAgICAgICAgICAgPGZvZWhuLWFnZW5kYS1uYXZpZ2F0aW9uXG4gICAgICAgICAgICAgICAgW2lkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ3dlZWstcGFnaW5hdGlvbi10b3AnXCJcbiAgICAgICAgICAgICAgICBbY2FsZW5kYXJdPVwibG9hZGVkQ2FsZW5kYXJcIlxuICAgICAgICAgICAgICAgIChwYWdpbmF0aW9uQ2hhbmdlKT1cInBhZ2luYXRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIGFyaWEtaGlkZGVuPVwidHJ1ZVwiXG4gICAgICAgICAgICA+PC9mb2Vobi1hZ2VuZGEtbmF2aWdhdGlvbj5cblxuICAgICAgICAgICAgPCEtLSBMaW5rIHRvIG5hdmlnYXRpb24gYm90dG9tIG9ubHkgZm9yIHNjcmVlbiByZWFkZXIgLS0+XG4gICAgICAgICAgICA8cCBbaWRdPVwiYnVpbGRDaGlsZElkKCduYXZpZ2F0aW9uQm90dG9tQW5jaG9yJylcIiBjbGFzcz1cInNyLW9ubHlcIj5cbiAgICAgICAgICAgICAgICB7e1xuICAgICAgICAgICAgICAgICAgICAnZm9laG4tYWdlbmRhLnBhZ2luYXRpb24tYW5jaG9yLmZpcnN0LXBhcnQnIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgICAgIDxhXG4gICAgICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cIiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBzY3JvbGxUb05hdmlnYXRpb24odHJ1ZSlcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAge3tcbiAgICAgICAgICAgICAgICAgICAgICAgICdmb2Vobi1hZ2VuZGEucGFnaW5hdGlvbi1hbmNob3IudG9wLW5leHQtcGFydCdcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGZyb21EaWN0aW9uYXJ5XG4gICAgICAgICAgICAgICAgICAgIH19XG4gICAgICAgICAgICAgICAgPC9hPlxuICAgICAgICAgICAgPC9wPlxuXG4gICAgICAgICAgICA8Zm9laG4tdmFsaWRhdGlvbi1hbGVydHNcbiAgICAgICAgICAgICAgICBbY29tcG9uZW50XT1cInRoaXNcIlxuICAgICAgICAgICAgPjwvZm9laG4tdmFsaWRhdGlvbi1hbGVydHM+XG5cbiAgICAgICAgICAgIDxkaXZcbiAgICAgICAgICAgICAgICBjbGFzcz1cInJvd1wiXG4gICAgICAgICAgICAgICAgW3RhYkluZGV4XT1cImhhc0Vycm9ycygpID8gMCA6IC0xXCJcbiAgICAgICAgICAgICAgICBbYXR0ci5pZF09XCJidWlsZENoaWxkSWQoKVwiXG4gICAgICAgICAgICAgICAgI2VudHJ5Q29tcG9uZW50XG4gICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgPGZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbFxuICAgICAgICAgICAgICAgICAgICAqbmdGb3I9XCJsZXQgY3VycmVudFdlZWsgb2YgbG9hZGVkQ2FsZW5kYXIuY3VycmVudFdlZWsud2Vla1wiXG4gICAgICAgICAgICAgICAgICAgIGNsYXNzPVwiY29sLTEyXCJcbiAgICAgICAgICAgICAgICAgICAgI3RpbWVTbG90UGFuZWxFbGVtUmVmXG4gICAgICAgICAgICAgICAgICAgIFtjdXJyZW50V2Vla109XCJjdXJyZW50V2Vla1wiXG4gICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhcl09XCJjYWxlbmRhclwiXG4gICAgICAgICAgICAgICAgICAgIFtuYlZpc2libGVFbGVtZW50c109XCJuYlZpc2libGVFbGVtZW50c1wiXG4gICAgICAgICAgICAgICAgICAgIFsobW9kZWwpXT1cIm1vZGVsXCJcbiAgICAgICAgICAgICAgICAgICAgKHVzZXJJbnB1dCk9XCJoYW5kbGVVc2VySW5wdXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgPjwvZm9laG4tYWdlbmRhLXRpbWVzbG90LXBhbmVsPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvc2VjdGlvbj5cblxuICAgICAgICA8IS0tIE5hdmlnYXRpb24gYm90dG9tIHVzZWQgZm9yIHNjcmVlbiByZWFkZXIgb25seSAtLT5cbiAgICAgICAgPGZvZWhuLWFnZW5kYS1uYXZpZ2F0aW9uXG4gICAgICAgICAgICBjbGFzcz1cInNyLW9ubHlcIlxuICAgICAgICAgICAgW2lkXT1cImJ1aWxkQ2hpbGRJZCgpICsgJ3dlZWstcGFnaW5hdGlvbi1ib3R0b20nXCJcbiAgICAgICAgICAgIFtjYWxlbmRhcl09XCJsb2FkZWRDYWxlbmRhclwiXG4gICAgICAgICAgICBbaXNTck9ubHldPVwidHJ1ZVwiXG4gICAgICAgICAgICAocGFnaW5hdGlvbkNoYW5nZSk9XCJwYWdpbmF0ZSgkZXZlbnQpXCJcbiAgICAgICAgPjwvZm9laG4tYWdlbmRhLW5hdmlnYXRpb24+XG5cbiAgICAgICAgPCEtLSBMaW5rIHRvIG5hdmlnYXRpb24gdG9wIGhpZGRlbiBmcm9tIHNjcmVlbiByZWFkZXIgLS0+XG4gICAgICAgIDxwIFtpZF09XCJidWlsZENoaWxkSWQoJ25hdmlnYXRpb25Ub3BBbmNob3InKVwiIGFyaWEtaGlkZGVuPVwidHJ1ZVwiPlxuICAgICAgICAgICAge3sgJ2ZvZWhuLWFnZW5kYS5wYWdpbmF0aW9uLWFuY2hvci5maXJzdC1wYXJ0JyB8IGZyb21EaWN0aW9uYXJ5IH19XG4gICAgICAgICAgICA8YVxuICAgICAgICAgICAgICAgIGhyZWY9XCIjXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwiJGV2ZW50LnByZXZlbnREZWZhdWx0KCk7IHNjcm9sbFRvTmF2aWdhdGlvbihmYWxzZSlcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgIHt7XG4gICAgICAgICAgICAgICAgICAgICdmb2Vobi1hZ2VuZGEucGFnaW5hdGlvbi1hbmNob3IuYm90dG9tLW5leHQtcGFydCdcbiAgICAgICAgICAgICAgICAgICAgICAgIHwgZnJvbURpY3Rpb25hcnlcbiAgICAgICAgICAgICAgICB9fVxuICAgICAgICAgICAgPC9hPlxuICAgICAgICA8L3A+XG4gICAgPC9uZy1jb250YWluZXI+XG48L2Rpdj5cbiJdfQ==
@@ -0,0 +1,64 @@
1
+ import { NgModule } from '@angular/core';
2
+ import { CommonModule } from '@angular/common';
3
+ import { FoehnAgendaComponent } from './foehn-agenda.component';
4
+ import { A11yModule } from '@angular/cdk/a11y';
5
+ import { FoehnMiscModule } from '../foehn-misc/foehn-misc.module';
6
+ import { SdkDictionaryModule } from '../sdk-dictionary/sdk-dictionary.module';
7
+ import { FormsModule } from '@angular/forms';
8
+ import { FoehnAgendaNavigationComponent } from './foehn-agenda-navigation/foehn-agenda-navigation.component';
9
+ import { FoehnAgendaTimeslotPanelComponent } from './foehn-agenda-timeslot-panel/foehn-agenda-timeslot-panel.component';
10
+ import { FoehnIconsModule } from '../foehn-icons/foehn-icons.module';
11
+ import { FoehnDatePickerButtonModule } from '../foehn-date-picker-button/foehn-date-picker-button.module';
12
+ import { FoehnValidationAlertsModule } from '../foehn-validation-alerts/foehn-validation-alerts.module';
13
+ import * as i0 from "@angular/core";
14
+ export class FoehnAgendaModule {
15
+ }
16
+ FoehnAgendaModule.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaModule, deps: [], target: i0.ɵɵFactoryTarget.NgModule });
17
+ FoehnAgendaModule.ɵmod = i0.ɵɵngDeclareNgModule({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaModule, declarations: [FoehnAgendaComponent,
18
+ FoehnAgendaNavigationComponent,
19
+ FoehnAgendaTimeslotPanelComponent], imports: [CommonModule,
20
+ A11yModule,
21
+ FoehnMiscModule,
22
+ SdkDictionaryModule,
23
+ FoehnIconsModule,
24
+ FoehnDatePickerButtonModule,
25
+ FoehnValidationAlertsModule,
26
+ FormsModule], exports: [FoehnAgendaComponent,
27
+ FoehnAgendaNavigationComponent,
28
+ FoehnAgendaTimeslotPanelComponent] });
29
+ FoehnAgendaModule.ɵinj = i0.ɵɵngDeclareInjector({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaModule, imports: [[
30
+ CommonModule,
31
+ A11yModule,
32
+ FoehnMiscModule,
33
+ SdkDictionaryModule,
34
+ FoehnIconsModule,
35
+ FoehnDatePickerButtonModule,
36
+ FoehnValidationAlertsModule,
37
+ FormsModule
38
+ ]] });
39
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "13.1.3", ngImport: i0, type: FoehnAgendaModule, decorators: [{
40
+ type: NgModule,
41
+ args: [{
42
+ imports: [
43
+ CommonModule,
44
+ A11yModule,
45
+ FoehnMiscModule,
46
+ SdkDictionaryModule,
47
+ FoehnIconsModule,
48
+ FoehnDatePickerButtonModule,
49
+ FoehnValidationAlertsModule,
50
+ FormsModule
51
+ ],
52
+ declarations: [
53
+ FoehnAgendaComponent,
54
+ FoehnAgendaNavigationComponent,
55
+ FoehnAgendaTimeslotPanelComponent
56
+ ],
57
+ exports: [
58
+ FoehnAgendaComponent,
59
+ FoehnAgendaNavigationComponent,
60
+ FoehnAgendaTimeslotPanelComponent
61
+ ]
62
+ }]
63
+ }] });
64
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZm9laG4tYWdlbmRhLm1vZHVsZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL3ByZXN0YXRpb25zLW5nL3NyYy9mb2Vobi1hZ2VuZGEvZm9laG4tYWdlbmRhLm1vZHVsZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUMvQyxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSwwQkFBMEIsQ0FBQztBQUNoRSxPQUFPLEVBQUUsVUFBVSxFQUFFLE1BQU0sbUJBQW1CLENBQUM7QUFDL0MsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLGlDQUFpQyxDQUFDO0FBQ2xFLE9BQU8sRUFBRSxtQkFBbUIsRUFBRSxNQUFNLHlDQUF5QyxDQUFDO0FBQzlFLE9BQU8sRUFBRSxXQUFXLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUM3QyxPQUFPLEVBQUUsOEJBQThCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUM3RyxPQUFPLEVBQUUsaUNBQWlDLEVBQUUsTUFBTSxxRUFBcUUsQ0FBQztBQUN4SCxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxtQ0FBbUMsQ0FBQztBQUNyRSxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSw2REFBNkQsQ0FBQztBQUMxRyxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwyREFBMkQsQ0FBQzs7QUF3QnhHLE1BQU0sT0FBTyxpQkFBaUI7OzhHQUFqQixpQkFBaUI7K0dBQWpCLGlCQUFpQixpQkFWdEIsb0JBQW9CO1FBQ3BCLDhCQUE4QjtRQUM5QixpQ0FBaUMsYUFaakMsWUFBWTtRQUNaLFVBQVU7UUFDVixlQUFlO1FBQ2YsbUJBQW1CO1FBQ25CLGdCQUFnQjtRQUNoQiwyQkFBMkI7UUFDM0IsMkJBQTJCO1FBQzNCLFdBQVcsYUFRWCxvQkFBb0I7UUFDcEIsOEJBQThCO1FBQzlCLGlDQUFpQzsrR0FHNUIsaUJBQWlCLFlBckJqQjtZQUNMLFlBQVk7WUFDWixVQUFVO1lBQ1YsZUFBZTtZQUNmLG1CQUFtQjtZQUNuQixnQkFBZ0I7WUFDaEIsMkJBQTJCO1lBQzNCLDJCQUEyQjtZQUMzQixXQUFXO1NBQ2Q7MkZBWVEsaUJBQWlCO2tCQXRCN0IsUUFBUTttQkFBQztvQkFDTixPQUFPLEVBQUU7d0JBQ0wsWUFBWTt3QkFDWixVQUFVO3dCQUNWLGVBQWU7d0JBQ2YsbUJBQW1CO3dCQUNuQixnQkFBZ0I7d0JBQ2hCLDJCQUEyQjt3QkFDM0IsMkJBQTJCO3dCQUMzQixXQUFXO3FCQUNkO29CQUNELFlBQVksRUFBRTt3QkFDVixvQkFBb0I7d0JBQ3BCLDhCQUE4Qjt3QkFDOUIsaUNBQWlDO3FCQUNwQztvQkFDRCxPQUFPLEVBQUU7d0JBQ0wsb0JBQW9CO3dCQUNwQiw4QkFBOEI7d0JBQzlCLGlDQUFpQztxQkFDcEM7aUJBQ0oiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29tbW9uTW9kdWxlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcbmltcG9ydCB7IEZvZWhuQWdlbmRhQ29tcG9uZW50IH0gZnJvbSAnLi9mb2Vobi1hZ2VuZGEuY29tcG9uZW50JztcbmltcG9ydCB7IEExMXlNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9jZGsvYTExeSc7XG5pbXBvcnQgeyBGb2Vobk1pc2NNb2R1bGUgfSBmcm9tICcuLi9mb2Vobi1taXNjL2ZvZWhuLW1pc2MubW9kdWxlJztcbmltcG9ydCB7IFNka0RpY3Rpb25hcnlNb2R1bGUgfSBmcm9tICcuLi9zZGstZGljdGlvbmFyeS9zZGstZGljdGlvbmFyeS5tb2R1bGUnO1xuaW1wb3J0IHsgRm9ybXNNb2R1bGUgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBGb2VobkFnZW5kYU5hdmlnYXRpb25Db21wb25lbnQgfSBmcm9tICcuL2ZvZWhuLWFnZW5kYS1uYXZpZ2F0aW9uL2ZvZWhuLWFnZW5kYS1uYXZpZ2F0aW9uLmNvbXBvbmVudCc7XG5pbXBvcnQgeyBGb2VobkFnZW5kYVRpbWVzbG90UGFuZWxDb21wb25lbnQgfSBmcm9tICcuL2ZvZWhuLWFnZW5kYS10aW1lc2xvdC1wYW5lbC9mb2Vobi1hZ2VuZGEtdGltZXNsb3QtcGFuZWwuY29tcG9uZW50JztcbmltcG9ydCB7IEZvZWhuSWNvbnNNb2R1bGUgfSBmcm9tICcuLi9mb2Vobi1pY29ucy9mb2Vobi1pY29ucy5tb2R1bGUnO1xuaW1wb3J0IHsgRm9laG5EYXRlUGlja2VyQnV0dG9uTW9kdWxlIH0gZnJvbSAnLi4vZm9laG4tZGF0ZS1waWNrZXItYnV0dG9uL2ZvZWhuLWRhdGUtcGlja2VyLWJ1dHRvbi5tb2R1bGUnO1xuaW1wb3J0IHsgRm9laG5WYWxpZGF0aW9uQWxlcnRzTW9kdWxlIH0gZnJvbSAnLi4vZm9laG4tdmFsaWRhdGlvbi1hbGVydHMvZm9laG4tdmFsaWRhdGlvbi1hbGVydHMubW9kdWxlJztcblxuQE5nTW9kdWxlKHtcbiAgICBpbXBvcnRzOiBbXG4gICAgICAgIENvbW1vbk1vZHVsZSxcbiAgICAgICAgQTExeU1vZHVsZSxcbiAgICAgICAgRm9laG5NaXNjTW9kdWxlLFxuICAgICAgICBTZGtEaWN0aW9uYXJ5TW9kdWxlLFxuICAgICAgICBGb2Vobkljb25zTW9kdWxlLFxuICAgICAgICBGb2VobkRhdGVQaWNrZXJCdXR0b25Nb2R1bGUsXG4gICAgICAgIEZvZWhuVmFsaWRhdGlvbkFsZXJ0c01vZHVsZSxcbiAgICAgICAgRm9ybXNNb2R1bGVcbiAgICBdLFxuICAgIGRlY2xhcmF0aW9uczogW1xuICAgICAgICBGb2VobkFnZW5kYUNvbXBvbmVudCxcbiAgICAgICAgRm9laG5BZ2VuZGFOYXZpZ2F0aW9uQ29tcG9uZW50LFxuICAgICAgICBGb2VobkFnZW5kYVRpbWVzbG90UGFuZWxDb21wb25lbnRcbiAgICBdLFxuICAgIGV4cG9ydHM6IFtcbiAgICAgICAgRm9laG5BZ2VuZGFDb21wb25lbnQsXG4gICAgICAgIEZvZWhuQWdlbmRhTmF2aWdhdGlvbkNvbXBvbmVudCxcbiAgICAgICAgRm9laG5BZ2VuZGFUaW1lc2xvdFBhbmVsQ29tcG9uZW50XG4gICAgXVxufSlcbmV4cG9ydCBjbGFzcyBGb2VobkFnZW5kYU1vZHVsZSB7fVxuIl19
@@ -0,0 +1,3 @@
1
+ export class PaginationWeek {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicGFnaW5hdGlvbi13ZWVrLnR5cGUuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9wcm9qZWN0cy9wcmVzdGF0aW9ucy1uZy9zcmMvZm9laG4tYWdlbmRhL3BhZ2luYXRpb24td2Vlay50eXBlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sT0FBTyxjQUFjO0NBSTFCIiwic291cmNlc0NvbnRlbnQiOlsiZXhwb3J0IGNsYXNzIFBhZ2luYXRpb25XZWVrIHtcbiAgICBsYWJlbDogc3RyaW5nO1xuICAgIHdlZWtOdW1iZXI6IG51bWJlcjtcbiAgICB5ZWFyOiBudW1iZXI7XG59XG4iXX0=
@@ -0,0 +1,3 @@
1
+ export class SelectedSlot {
2
+ }
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VsZWN0ZWQtc2xvdC50eXBlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vcHJvamVjdHMvcHJlc3RhdGlvbnMtbmcvc3JjL2ZvZWhuLWFnZW5kYS9zZWxlY3RlZC1zbG90LnR5cGUudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLFlBQVk7Q0FNeEIiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgY2xhc3MgU2VsZWN0ZWRTbG90IHtcbiAgICBkYXk6IHN0cmluZztcbiAgICB0aW1lOiBzdHJpbmc7XG4gICAgeWVhcjogbnVtYmVyO1xuICAgIHdlZWtOdW1iZXI6IG51bWJlcjtcbiAgICBkYXRlOiBudW1iZXJbXTtcbn1cbiJdfQ==