barsa-calendar 0.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (56) hide show
  1. package/README.md +25 -0
  2. package/esm2020/barsa-calendar.mjs +5 -0
  3. package/esm2020/lib/barsa-calendar.module.mjs +106 -0
  4. package/esm2020/lib/calendar-container/calendar-container.component.mjs +190 -0
  5. package/esm2020/lib/calendar-header/calendar-header.component.mjs +61 -0
  6. package/esm2020/lib/calendar-list/calendar-list.component.mjs +19 -0
  7. package/esm2020/lib/calendar-list-container/calendar-list-container.component.mjs +30 -0
  8. package/esm2020/lib/calendar-list-item/calendar-list-item.component.mjs +14 -0
  9. package/esm2020/lib/calendar-month/calendar-month.component.mjs +244 -0
  10. package/esm2020/lib/calendar-selection-days/calendar-selection-days.component.mjs +193 -0
  11. package/esm2020/lib/calendar-week/calendar-week.component.mjs +182 -0
  12. package/esm2020/lib/constants.mjs +4 -0
  13. package/esm2020/lib/date-time-picker/date-time-picker.component.mjs +324 -0
  14. package/esm2020/lib/day-event-list/day-event-list.component.mjs +53 -0
  15. package/esm2020/lib/day-number-box/day-number-box.component.mjs +105 -0
  16. package/esm2020/lib/days-in-week.pipe.mjs +17 -0
  17. package/esm2020/lib/equal-date.pipe.mjs +23 -0
  18. package/esm2020/lib/event-button/event-button.component.mjs +70 -0
  19. package/esm2020/lib/event-date.pipe.mjs +24 -0
  20. package/esm2020/lib/event-preview/event-preview.component.mjs +60 -0
  21. package/esm2020/lib/event-time.pipe.mjs +22 -0
  22. package/esm2020/lib/from-to-time.pipe.mjs +23 -0
  23. package/esm2020/lib/models.mjs +14 -0
  24. package/esm2020/lib/month-days/month-days.component.mjs +220 -0
  25. package/esm2020/lib/services/calendar.service.mjs +610 -0
  26. package/esm2020/public-api.mjs +21 -0
  27. package/fesm2015/barsa-calendar.mjs +2447 -0
  28. package/fesm2015/barsa-calendar.mjs.map +1 -0
  29. package/fesm2020/barsa-calendar.mjs +2455 -0
  30. package/fesm2020/barsa-calendar.mjs.map +1 -0
  31. package/index.d.ts +5 -0
  32. package/lib/barsa-calendar.module.d.ts +33 -0
  33. package/lib/calendar-container/calendar-container.component.d.ts +73 -0
  34. package/lib/calendar-header/calendar-header.component.d.ts +29 -0
  35. package/lib/calendar-list/calendar-list.component.d.ts +8 -0
  36. package/lib/calendar-list-container/calendar-list-container.component.d.ts +14 -0
  37. package/lib/calendar-list-item/calendar-list-item.component.d.ts +7 -0
  38. package/lib/calendar-month/calendar-month.component.d.ts +70 -0
  39. package/lib/calendar-selection-days/calendar-selection-days.component.d.ts +47 -0
  40. package/lib/calendar-week/calendar-week.component.d.ts +57 -0
  41. package/lib/constants.d.ts +1 -0
  42. package/lib/date-time-picker/date-time-picker.component.d.ts +98 -0
  43. package/lib/day-event-list/day-event-list.component.d.ts +20 -0
  44. package/lib/day-number-box/day-number-box.component.d.ts +30 -0
  45. package/lib/days-in-week.pipe.d.ts +9 -0
  46. package/lib/equal-date.pipe.d.ts +8 -0
  47. package/lib/event-button/event-button.component.d.ts +26 -0
  48. package/lib/event-date.pipe.d.ts +9 -0
  49. package/lib/event-preview/event-preview.component.d.ts +19 -0
  50. package/lib/event-time.pipe.d.ts +9 -0
  51. package/lib/from-to-time.pipe.d.ts +9 -0
  52. package/lib/models.d.ts +107 -0
  53. package/lib/month-days/month-days.component.d.ts +69 -0
  54. package/lib/services/calendar.service.d.ts +70 -0
  55. package/package.json +31 -0
  56. package/public-api.d.ts +17 -0
@@ -0,0 +1,220 @@
1
+ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output } from '@angular/core';
2
+ import moment from 'moment';
3
+ import { BaseComponent } from 'barsa-novin-ray-core';
4
+ import * as i0 from "@angular/core";
5
+ import * as i1 from "../days-in-week.pipe";
6
+ import * as i2 from "../services/calendar.service";
7
+ import * as i3 from "@angular/common";
8
+ import * as i4 from "@fundamental-ngx/core/button";
9
+ import * as i5 from "@fundamental-ngx/core/popover";
10
+ import * as i6 from "@fundamental-ngx/core/table";
11
+ import * as i7 from "../day-number-box/day-number-box.component";
12
+ import * as i8 from "../event-button/event-button.component";
13
+ import * as i9 from "../day-event-list/day-event-list.component";
14
+ import * as i10 from "barsa-novin-ray-core";
15
+ export class MonthDaysComponent extends BaseComponent {
16
+ constructor(daysInWeek, _cdr, _calendarService) {
17
+ super();
18
+ this.daysInWeek = daysInWeek;
19
+ this._cdr = _cdr;
20
+ this._calendarService = _calendarService;
21
+ this.datePicker = false;
22
+ this.rangePicker = false;
23
+ this.editEvent = new EventEmitter();
24
+ this.deleteEvent = new EventEmitter();
25
+ this.daySelect = new EventEmitter();
26
+ this.dayClick = new EventEmitter();
27
+ this.dayMouseMove = new EventEmitter();
28
+ this.dayMouseUp = new EventEmitter();
29
+ this.dayMouseDown = new EventEmitter();
30
+ this.showEvent = new EventEmitter();
31
+ this.taskHeight = 30;
32
+ this._hasPopoverOpened = [];
33
+ }
34
+ ngOnChanges(changes) {
35
+ super.ngOnChanges(changes);
36
+ if (changes.containerHeight && !changes.containerHeight.firstChange) {
37
+ this.fitToContainer(changes.containerHeight.currentValue);
38
+ }
39
+ if (changes.deviceSize && !changes.deviceSize.firstChange) {
40
+ this.prepareWeekDays(changes.deviceSize.currentValue);
41
+ }
42
+ if (changes.moDataList && !changes.moDataList.firstChange) {
43
+ this._prepareDaysTasks(changes.moDataList.currentValue);
44
+ this._cdr.detectChanges();
45
+ }
46
+ if (changes.monthInfo && !changes.monthInfo.firstChange) {
47
+ this._prepareDaysTasks(this.moDataList);
48
+ this._cdr.detectChanges();
49
+ }
50
+ if (changes.monthWeeksCount && !changes.monthWeeksCount.firstChange) {
51
+ this.fitToContainer(this.containerHeight);
52
+ this._prepareDaysTasks(this.moDataList);
53
+ this._cdr.detectChanges();
54
+ }
55
+ }
56
+ ngOnInit() {
57
+ super.ngOnInit();
58
+ this.isPickerMode = this.datePicker || this.rangePicker;
59
+ this.prepareWeekDays(this.deviceSize);
60
+ this._prepareDaysTasks(this.moDataList);
61
+ this.fitToContainer(this.containerHeight);
62
+ }
63
+ onDayBoxSelect(day) {
64
+ this._fireDaySelect(day);
65
+ }
66
+ onDaySelect(weekIndex, dayIndex) {
67
+ const day = this.days[weekIndex * 7 + dayIndex];
68
+ this._fireDaySelect(day);
69
+ }
70
+ onOpenPopoverChange(isOpen) {
71
+ this._openPopover(isOpen);
72
+ }
73
+ onMoreButton(e, popover) {
74
+ this._preventEvent(e);
75
+ popover.open();
76
+ }
77
+ onTask(e, task) {
78
+ this.showEvent.emit(task);
79
+ }
80
+ onDayClick(day) {
81
+ this.selected = day;
82
+ this.dayClick.emit(day);
83
+ }
84
+ onDayMouseMove(day) {
85
+ this.dayMouseMove.emit(day);
86
+ }
87
+ onDayMouseDown(day) {
88
+ this.dayMouseDown.emit(day);
89
+ }
90
+ onDayMouseUp(day) {
91
+ this.dayMouseUp.emit(day);
92
+ }
93
+ _preventEvent(e) {
94
+ e.stopPropagation();
95
+ e.preventDefault();
96
+ }
97
+ _fireDaySelect(day) {
98
+ if (this._hasPopoverOpened.length === 0) {
99
+ this.daySelect.emit(moment(day.date));
100
+ }
101
+ }
102
+ _openPopover(isOpen) {
103
+ if (isOpen) {
104
+ this._hasPopoverOpened.push(true);
105
+ }
106
+ else {
107
+ setTimeout(() => {
108
+ this._hasPopoverOpened = [];
109
+ }, 0);
110
+ }
111
+ }
112
+ prepareWeekDays(deviceSize) {
113
+ if (deviceSize !== 's' && deviceSize !== 'm') {
114
+ this.selectedWeekDays = this.weekDays;
115
+ }
116
+ else {
117
+ this.selectedWeekDays = this.weekDaysMin;
118
+ }
119
+ }
120
+ fitToContainer(containerHeight) {
121
+ let _weeksCount;
122
+ let _firstWeekIndex;
123
+ if (this.monthWeeksCount?.weeksCount > 0) {
124
+ const { weeksCount, firstWeekIndex } = this.monthWeeksCount;
125
+ _weeksCount = weeksCount;
126
+ _firstWeekIndex = firstWeekIndex;
127
+ }
128
+ else {
129
+ _weeksCount = this.days.length / 7;
130
+ _firstWeekIndex = 0;
131
+ }
132
+ this.numberOfWeek = Array.from(Array(_weeksCount).keys());
133
+ this.numberOfWeek = this.numberOfWeek.map((value) => value + _firstWeekIndex);
134
+ if (this.isPickerMode) {
135
+ this.dayHeight = 40;
136
+ return;
137
+ }
138
+ this.dayHeight = Math.floor(containerHeight / _weeksCount) + 1;
139
+ this.maxTaskCount = Math.floor((this.dayHeight - this.taskHeight) / this.taskHeight);
140
+ this.maxRowTasks = new Array(this.maxTaskCount).fill(0).map((x, i) => i);
141
+ }
142
+ _prepareDaysTasks(calendarTasks) {
143
+ if (this.isPickerMode) {
144
+ this.weekTasksArray = {};
145
+ return;
146
+ }
147
+ const calendarFields = this.calendarFields;
148
+ // Sort all Tasks
149
+ const moDataList = this._calendarService.sortTasks(calendarTasks, calendarFields);
150
+ this.days.forEach((day) => (day.tasks = []));
151
+ const weekTasksArray = [];
152
+ for (let j = 0; j < this.days.length / 7; j++) {
153
+ const days = this.daysInWeek.transform(this.days, j);
154
+ const week = this._calendarService.createWeekTask(days, moDataList, calendarFields, 0);
155
+ weekTasksArray.push(week);
156
+ }
157
+ weekTasksArray.forEach((week) => {
158
+ const arr = Object.values(week);
159
+ for (let i = arr.length; i < this.maxTaskCount; i++) {
160
+ week[i.toString()] = [];
161
+ }
162
+ });
163
+ // به ازای هر ردیف تسک باید تعداد 7 ستون اضافه گردد و برای ستونی که تسکی ندارد یک جای خالی colspan 1 میگذاریم
164
+ weekTasksArray.forEach((week) => {
165
+ this._calendarService.fillWeek(week);
166
+ });
167
+ this.weekTasksArray = weekTasksArray;
168
+ }
169
+ }
170
+ MonthDaysComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: MonthDaysComponent, deps: [{ token: i1.DaysInWeekPipe }, { token: i0.ChangeDetectorRef }, { token: i2.CalendarService }], target: i0.ɵɵFactoryTarget.Component });
171
+ MonthDaysComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: MonthDaysComponent, selector: "bc-month-days", inputs: { monthWeeksCount: "monthWeeksCount", weekDays: "weekDays", weekDaysMin: "weekDaysMin", today: "today", containerHeight: "containerHeight", days: "days", calendarFields: "calendarFields", rtl: "rtl", deviceSize: "deviceSize", moDataList: "moDataList", datePicker: "datePicker", rangePicker: "rangePicker", startSelectedDayIndex: "startSelectedDayIndex", endSelectedDayIndex: "endSelectedDayIndex" }, outputs: { editEvent: "editEvent", deleteEvent: "deleteEvent", daySelect: "daySelect", dayClick: "dayClick", dayMouseMove: "dayMouseMove", dayMouseUp: "dayMouseUp", dayMouseDown: "dayMouseDown", showEvent: "showEvent" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<table fd-table class=\"table-header\" [compact]=\"true\">\r\n <thead fd-table-header>\r\n <tr fd-table-row>\r\n <th\r\n class=\"weekday-header\"\r\n *ngFor=\"let weekDay of selectedWeekDays\"\r\n fd-table-cell\r\n [class.noborder]=\"isPickerMode\"\r\n >\r\n {{ weekDay }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody fd-table-body>\r\n <ng-container *ngFor=\"let weekDay of numberOfWeek\">\r\n <tr fd-table-row>\r\n <td\r\n [style.height.px]=\"dayHeight\"\r\n fd-table-cell\r\n colspan=\"7\"\r\n [style.border]=\"isPickerMode ? 'none' : null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n renderTasks;\r\n context: {\r\n $implicit: isPickerMode ? null : moDataList[weekDay],\r\n weekIndex: weekDay,\r\n days: days | daysInWeek: weekDay,\r\n maxRowTasks: maxRowTasks,\r\n weekDays: weekDays,\r\n calendarFields: calendarFields,\r\n rtl: rtl,\r\n isPickerMode: isPickerMode\r\n }\r\n \"\r\n ></ng-container>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n</table>\r\n<ng-template\r\n #renderTasks\r\n let-task\r\n let-weekIndex=\"weekIndex\"\r\n let-weekDays=\"weekDays\"\r\n let-days=\"days\"\r\n let-maxRowTasks=\"maxRowTasks\"\r\n let-calendarFields=\"calendarFields\"\r\n let-deviceSize=\"deviceSize\"\r\n let-rtl=\"rtl\"\r\n let-isPickerMode=\"isPickerMode\"\r\n>\r\n <table fd-table-body class=\"table-content\" [compact]=\"true\">\r\n <tbody>\r\n <tr fd-table-row class=\"row-day-number\">\r\n <td fd-table-cell *ngFor=\"let day of days | daysInWeek: weekIndex\" [class.noborder]=\"isPickerMode\">\r\n <bc-day-number-box\r\n [class.fd-calendar__item]=\"isPickerMode\"\r\n [class.fd-calendar__item--other-month]=\"isPickerMode && !day.isInMonth\"\r\n [class.fd-calendar__item--weekend]=\"isPickerMode && day.isWeekend\"\r\n [isPickerMode]=\"isPickerMode\"\r\n [day]=\"day\"\r\n [class.is-active]=\"day.index === startSelectedDayIndex || day.index === endSelectedDayIndex\"\r\n [class.fd-calendar__item--range]=\"\r\n startSelectedDayIndex &&\r\n endSelectedDayIndex &&\r\n day.index > startSelectedDayIndex &&\r\n day.index < endSelectedDayIndex\r\n \"\r\n (dayClick)=\"onDayClick(day)\"\r\n (dayMouseMove)=\"onDayMouseMove(day)\"\r\n (dayMouseDown)=\"onDayMouseDown(day)\"\r\n (dayMouseUp)=\"onDayMouseUp(day)\"\r\n ></bc-day-number-box>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"!isPickerMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n renderDayTasks;\r\n context: {\r\n $implicit: weekTasksArray[weekIndex],\r\n maxRowTasks: maxRowTasks,\r\n weekIndex: weekIndex,\r\n deviceSize: deviceSize,\r\n calendarFields: calendarFields,\r\n weekDays: weekDays\r\n }\r\n \"\r\n ></ng-container>\r\n <tr fd-table-row>\r\n <td fd-table-cell *ngFor=\"let day of days\" class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\r\n <ng-container *ngIf=\"maxRowTasks.length < day.tasks.length\">\r\n <button\r\n fd-button\r\n (click)=\"onMoreButton($event, popover)\"\r\n [fdType]=\"'transparent'\"\r\n [compact]=\"true\"\r\n >\r\n {{ day.tasks?.length - maxRowTasks.length }}\r\n {{ 'More' | bbbTranslate }}\r\n </button>\r\n <fd-popover\r\n #popover\r\n [mobile]=\"deviceSize === 's'\"\r\n placement=\"bottom\"\r\n [focusTrapped]=\"true\"\r\n [focusAutoCapture]=\"true\"\r\n (isOpenChange)=\"onOpenPopoverChange($event)\"\r\n >\r\n <bc-day-event-list\r\n [day]=\"day\"\r\n [calendarFields]=\"calendarFields\"\r\n [deviceSize]=\"deviceSize\"\r\n [weekDays]=\"weekDays\"\r\n [rtl]=\"rtl\"\r\n [popover]=\"popover\"\r\n (deleteEvent)=\"deleteEvent.emit($event)\"\r\n (editEvent)=\"editEvent.emit($event)\"\r\n ></bc-day-event-list>\r\n </fd-popover>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</ng-template>\r\n\r\n<ng-template\r\n #renderDayTasks\r\n let-weekTasks\r\n let-maxRowTasks=\"maxRowTasks\"\r\n let-weekIndex=\"weekIndex\"\r\n let-deviceSize=\"deviceSize\"\r\n let-calendarFields=\"calendarFields\"\r\n let-weekDays=\"weekDays\"\r\n>\r\n <tr fd-table-row *ngFor=\"let rowTask of maxRowTasks; let i = index\">\r\n <ng-container *ngIf=\"!weekTasks[i] || weekTasks[i].length === 0\">\r\n <td fd-table-cell *ngFor=\"let day of weekDays\"></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let task of weekTasks[i]; let dayIndex = index\">\r\n <td fd-table-cell [attr.colspan]=\"task.colSpan\" *ngIf=\"task.colSpan\">\r\n <ng-container *ngIf=\"task.event; else newDaySelect\">\r\n <bc-event-button\r\n [task]=\"task\"\r\n [rtl]=\"rtl\"\r\n [calendarFields]=\"calendarFields\"\r\n [deviceSize]=\"deviceSize\"\r\n (deleteEvent)=\"deleteEvent.emit($event)\"\r\n (editEvent)=\"editEvent.emit($event)\"\r\n (openPopoverChange)=\"onOpenPopoverChange($event)\"\r\n ></bc-event-button>\r\n </ng-container>\r\n <ng-template #newDaySelect>\r\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n", styles: [":host{display:block}table{table-layout:fixed}.table-header td{padding:0!important}.table-content{width:100%;height:100%;border:none;border-spacing:0}.table-content td{border:none;border-right:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #e5e5e5);height:1.425rem}.table-content .row-day-number td:first-child{border-right:none}table td{overflow:hidden}thead tr{border-bottom:none!important}thead tr th{text-align:center!important;background-color:var(--sapList_Background, #fff)}.weekday-header,.row-day-number td{width:100%}tbody tr td{padding-top:5px}tbody tr:first-child td{padding-top:0}.fd-table__cell{padding:0 .5rem!important}.more-fd{text-align:center!important}.more-fd button{font-size:12px}.fd-calendar__item{font-size:.875rem;font-size:var(--sapFontSize, .875rem);line-height:1.4;line-height:var(--sapContent_LineHeight, 1.4);color:#32363a;color:var(--sapTextColor, #32363a);font-family:\"72\",\"72full\",Arial,Helvetica,sans-serif;font-family:var(--sapFontFamily, \"72\", \"72full\", Arial, Helvetica, sans-serif);font-weight:400;box-sizing:border-box;padding:0;border:0;overflow:hidden;position:relative;height:2.75rem;margin:.0625rem;min-width:2.125rem;border-radius:.25rem;border-radius:var(--sapElement_BorderCornerRadius, .25rem);background-color:#fafafa;background-color:var(--sapLegend_WorkingBackground, #fafafa);flex:1 1 .375rem;border:none!important;padding:1px!important}.fd-calendar__item.fd-calendar__item--other-month{background-color:var(--sapList_Background, #fff)}.fd-calendar__item.fd-calendar__item--weekend{background-color:var(--sapLegend_NotWorkingBackground, #dedede)}.fd-calendar__item.is-active{background-color:var(--sapContent_Selected_Background, #0854a0);border:var(--fdCalendar_Active_Item_Border, none)}.fd-calendar__item.is-active ::ng-deep span{color:var(--sapContent_Selected_TextColor, #fff)}.fd-calendar__item.fd-calendar__item--range{border:.0625rem solid var(--sapList_SelectionBorderColor, #0854a0);background-color:var(--sapList_SelectionBackgroundColor, #e5f0fa)}.noborder{border:none!important}\n"], dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "directive", type: i4.DeprecatedButtonContentDensityDirective, selector: "[fd-button][compact]" }, { kind: "component", type: i5.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "component", type: i6.TableComponent, selector: "table[fd-table]", inputs: ["noBorderX", "noBorderY", "popIn", "responsive", "keys", "allCellsFocusable"], exportAs: ["fd-table"] }, { kind: "directive", type: i6.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i6.TableBodyDirective, selector: "[fdTableBody], [fd-table-body]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i6.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i6.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "tabindex", "hoverable", "fitContent", "noPadding", "noData", "key", "cellFocusedEventAnnouncer"] }, { kind: "directive", type: i6.DeprecatedTableCompactDirective, selector: "table[fd-table][compact]" }, { kind: "component", type: i7.DayNumberBoxComponent, selector: "bc-day-number-box", inputs: ["isWeekMode", "isSingleDay", "day", "isPickerMode", "itemInRange", "isActive"], outputs: ["dayClick", "dayMouseDown", "dayMouseUp", "dayMouseMove"] }, { kind: "component", type: i8.EventButtonComponent, selector: "bc-event-button", inputs: ["buttonTemplate", "calendarFields", "task", "rtl", "canDelete", "canEdit", "deviceSize"], outputs: ["deleteEvent", "editEvent", "openPopoverChange"] }, { kind: "component", type: i9.DayEventListComponent, selector: "bc-day-event-list", inputs: ["day", "deviceSize", "weekDays", "calendarFields", "rtl", "canDelete", "canEdit", "popover"], outputs: ["deleteEvent", "editEvent", "openPopOver"] }, { kind: "pipe", type: i10.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i1.DaysInWeekPipe, name: "daysInWeek" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
172
+ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: MonthDaysComponent, decorators: [{
173
+ type: Component,
174
+ args: [{ selector: 'bc-month-days', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table fd-table class=\"table-header\" [compact]=\"true\">\r\n <thead fd-table-header>\r\n <tr fd-table-row>\r\n <th\r\n class=\"weekday-header\"\r\n *ngFor=\"let weekDay of selectedWeekDays\"\r\n fd-table-cell\r\n [class.noborder]=\"isPickerMode\"\r\n >\r\n {{ weekDay }}\r\n </th>\r\n </tr>\r\n </thead>\r\n <tbody fd-table-body>\r\n <ng-container *ngFor=\"let weekDay of numberOfWeek\">\r\n <tr fd-table-row>\r\n <td\r\n [style.height.px]=\"dayHeight\"\r\n fd-table-cell\r\n colspan=\"7\"\r\n [style.border]=\"isPickerMode ? 'none' : null\"\r\n >\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n renderTasks;\r\n context: {\r\n $implicit: isPickerMode ? null : moDataList[weekDay],\r\n weekIndex: weekDay,\r\n days: days | daysInWeek: weekDay,\r\n maxRowTasks: maxRowTasks,\r\n weekDays: weekDays,\r\n calendarFields: calendarFields,\r\n rtl: rtl,\r\n isPickerMode: isPickerMode\r\n }\r\n \"\r\n ></ng-container>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n</table>\r\n<ng-template\r\n #renderTasks\r\n let-task\r\n let-weekIndex=\"weekIndex\"\r\n let-weekDays=\"weekDays\"\r\n let-days=\"days\"\r\n let-maxRowTasks=\"maxRowTasks\"\r\n let-calendarFields=\"calendarFields\"\r\n let-deviceSize=\"deviceSize\"\r\n let-rtl=\"rtl\"\r\n let-isPickerMode=\"isPickerMode\"\r\n>\r\n <table fd-table-body class=\"table-content\" [compact]=\"true\">\r\n <tbody>\r\n <tr fd-table-row class=\"row-day-number\">\r\n <td fd-table-cell *ngFor=\"let day of days | daysInWeek: weekIndex\" [class.noborder]=\"isPickerMode\">\r\n <bc-day-number-box\r\n [class.fd-calendar__item]=\"isPickerMode\"\r\n [class.fd-calendar__item--other-month]=\"isPickerMode && !day.isInMonth\"\r\n [class.fd-calendar__item--weekend]=\"isPickerMode && day.isWeekend\"\r\n [isPickerMode]=\"isPickerMode\"\r\n [day]=\"day\"\r\n [class.is-active]=\"day.index === startSelectedDayIndex || day.index === endSelectedDayIndex\"\r\n [class.fd-calendar__item--range]=\"\r\n startSelectedDayIndex &&\r\n endSelectedDayIndex &&\r\n day.index > startSelectedDayIndex &&\r\n day.index < endSelectedDayIndex\r\n \"\r\n (dayClick)=\"onDayClick(day)\"\r\n (dayMouseMove)=\"onDayMouseMove(day)\"\r\n (dayMouseDown)=\"onDayMouseDown(day)\"\r\n (dayMouseUp)=\"onDayMouseUp(day)\"\r\n ></bc-day-number-box>\r\n </td>\r\n </tr>\r\n <ng-container *ngIf=\"!isPickerMode\">\r\n <ng-container\r\n *ngTemplateOutlet=\"\r\n renderDayTasks;\r\n context: {\r\n $implicit: weekTasksArray[weekIndex],\r\n maxRowTasks: maxRowTasks,\r\n weekIndex: weekIndex,\r\n deviceSize: deviceSize,\r\n calendarFields: calendarFields,\r\n weekDays: weekDays\r\n }\r\n \"\r\n ></ng-container>\r\n <tr fd-table-row>\r\n <td fd-table-cell *ngFor=\"let day of days\" class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\r\n <ng-container *ngIf=\"maxRowTasks.length < day.tasks.length\">\r\n <button\r\n fd-button\r\n (click)=\"onMoreButton($event, popover)\"\r\n [fdType]=\"'transparent'\"\r\n [compact]=\"true\"\r\n >\r\n {{ day.tasks?.length - maxRowTasks.length }}\r\n {{ 'More' | bbbTranslate }}\r\n </button>\r\n <fd-popover\r\n #popover\r\n [mobile]=\"deviceSize === 's'\"\r\n placement=\"bottom\"\r\n [focusTrapped]=\"true\"\r\n [focusAutoCapture]=\"true\"\r\n (isOpenChange)=\"onOpenPopoverChange($event)\"\r\n >\r\n <bc-day-event-list\r\n [day]=\"day\"\r\n [calendarFields]=\"calendarFields\"\r\n [deviceSize]=\"deviceSize\"\r\n [weekDays]=\"weekDays\"\r\n [rtl]=\"rtl\"\r\n [popover]=\"popover\"\r\n (deleteEvent)=\"deleteEvent.emit($event)\"\r\n (editEvent)=\"editEvent.emit($event)\"\r\n ></bc-day-event-list>\r\n </fd-popover>\r\n </ng-container>\r\n </td>\r\n </tr>\r\n </ng-container>\r\n </tbody>\r\n </table>\r\n</ng-template>\r\n\r\n<ng-template\r\n #renderDayTasks\r\n let-weekTasks\r\n let-maxRowTasks=\"maxRowTasks\"\r\n let-weekIndex=\"weekIndex\"\r\n let-deviceSize=\"deviceSize\"\r\n let-calendarFields=\"calendarFields\"\r\n let-weekDays=\"weekDays\"\r\n>\r\n <tr fd-table-row *ngFor=\"let rowTask of maxRowTasks; let i = index\">\r\n <ng-container *ngIf=\"!weekTasks[i] || weekTasks[i].length === 0\">\r\n <td fd-table-cell *ngFor=\"let day of weekDays\"></td>\r\n </ng-container>\r\n <ng-container *ngFor=\"let task of weekTasks[i]; let dayIndex = index\">\r\n <td fd-table-cell [attr.colspan]=\"task.colSpan\" *ngIf=\"task.colSpan\">\r\n <ng-container *ngIf=\"task.event; else newDaySelect\">\r\n <bc-event-button\r\n [task]=\"task\"\r\n [rtl]=\"rtl\"\r\n [calendarFields]=\"calendarFields\"\r\n [deviceSize]=\"deviceSize\"\r\n (deleteEvent)=\"deleteEvent.emit($event)\"\r\n (editEvent)=\"editEvent.emit($event)\"\r\n (openPopoverChange)=\"onOpenPopoverChange($event)\"\r\n ></bc-event-button>\r\n </ng-container>\r\n <ng-template #newDaySelect>\r\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\r\n </ng-template>\r\n </td>\r\n </ng-container>\r\n </tr>\r\n</ng-template>\r\n", styles: [":host{display:block}table{table-layout:fixed}.table-header td{padding:0!important}.table-content{width:100%;height:100%;border:none;border-spacing:0}.table-content td{border:none;border-right:var(--sapList_BorderWidth, .0625rem) solid var(--sapList_BorderColor, #e5e5e5);height:1.425rem}.table-content .row-day-number td:first-child{border-right:none}table td{overflow:hidden}thead tr{border-bottom:none!important}thead tr th{text-align:center!important;background-color:var(--sapList_Background, #fff)}.weekday-header,.row-day-number td{width:100%}tbody tr td{padding-top:5px}tbody tr:first-child td{padding-top:0}.fd-table__cell{padding:0 .5rem!important}.more-fd{text-align:center!important}.more-fd button{font-size:12px}.fd-calendar__item{font-size:.875rem;font-size:var(--sapFontSize, .875rem);line-height:1.4;line-height:var(--sapContent_LineHeight, 1.4);color:#32363a;color:var(--sapTextColor, #32363a);font-family:\"72\",\"72full\",Arial,Helvetica,sans-serif;font-family:var(--sapFontFamily, \"72\", \"72full\", Arial, Helvetica, sans-serif);font-weight:400;box-sizing:border-box;padding:0;border:0;overflow:hidden;position:relative;height:2.75rem;margin:.0625rem;min-width:2.125rem;border-radius:.25rem;border-radius:var(--sapElement_BorderCornerRadius, .25rem);background-color:#fafafa;background-color:var(--sapLegend_WorkingBackground, #fafafa);flex:1 1 .375rem;border:none!important;padding:1px!important}.fd-calendar__item.fd-calendar__item--other-month{background-color:var(--sapList_Background, #fff)}.fd-calendar__item.fd-calendar__item--weekend{background-color:var(--sapLegend_NotWorkingBackground, #dedede)}.fd-calendar__item.is-active{background-color:var(--sapContent_Selected_Background, #0854a0);border:var(--fdCalendar_Active_Item_Border, none)}.fd-calendar__item.is-active ::ng-deep span{color:var(--sapContent_Selected_TextColor, #fff)}.fd-calendar__item.fd-calendar__item--range{border:.0625rem solid var(--sapList_SelectionBorderColor, #0854a0);background-color:var(--sapList_SelectionBackgroundColor, #e5f0fa)}.noborder{border:none!important}\n"] }]
175
+ }], ctorParameters: function () { return [{ type: i1.DaysInWeekPipe }, { type: i0.ChangeDetectorRef }, { type: i2.CalendarService }]; }, propDecorators: { monthWeeksCount: [{
176
+ type: Input
177
+ }], weekDays: [{
178
+ type: Input
179
+ }], weekDaysMin: [{
180
+ type: Input
181
+ }], today: [{
182
+ type: Input
183
+ }], containerHeight: [{
184
+ type: Input
185
+ }], days: [{
186
+ type: Input
187
+ }], calendarFields: [{
188
+ type: Input
189
+ }], rtl: [{
190
+ type: Input
191
+ }], deviceSize: [{
192
+ type: Input
193
+ }], moDataList: [{
194
+ type: Input
195
+ }], datePicker: [{
196
+ type: Input
197
+ }], rangePicker: [{
198
+ type: Input
199
+ }], startSelectedDayIndex: [{
200
+ type: Input
201
+ }], endSelectedDayIndex: [{
202
+ type: Input
203
+ }], editEvent: [{
204
+ type: Output
205
+ }], deleteEvent: [{
206
+ type: Output
207
+ }], daySelect: [{
208
+ type: Output
209
+ }], dayClick: [{
210
+ type: Output
211
+ }], dayMouseMove: [{
212
+ type: Output
213
+ }], dayMouseUp: [{
214
+ type: Output
215
+ }], dayMouseDown: [{
216
+ type: Output
217
+ }], showEvent: [{
218
+ type: Output
219
+ }] } });
220
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibW9udGgtZGF5cy5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL21vbnRoLWRheXMvbW9udGgtZGF5cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL21vbnRoLWRheXMvbW9udGgtZGF5cy5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ0gsdUJBQXVCLEVBRXZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUdMLE1BQU0sRUFFVCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLE1BQU0sTUFBTSxRQUFRLENBQUM7QUFFNUIsT0FBTyxFQUFFLGFBQWEsRUFBb0UsTUFBTSxzQkFBc0IsQ0FBQzs7Ozs7Ozs7Ozs7O0FBV3ZILE1BQU0sT0FBTyxrQkFBbUIsU0FBUSxhQUFhO0lBcUNqRCxZQUNZLFVBQTBCLEVBQzFCLElBQXVCLEVBQ3ZCLGdCQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQUpBLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQzFCLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUE3QnBDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFHbkIsY0FBUyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3BELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFDdEQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDcEMsYUFBUSxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDbkMsaUJBQVksR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3ZDLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3JDLGlC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c0JBQWxCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csWUFBWTtzQkFBckIsTUFBTTtnQkFDRyxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBTaW1wbGVDaGFuZ2VzXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgbW9tZW50IGZyb20gJ21vbWVudCc7XG5cbmltcG9ydCB7IEJhc2VDb21wb25lbnQsIENhbGVuZGFyRmllbGRzLCBDYWxlbmRhck1ldGFvYmplY3REYXRhTW9kZWwsIE1ldGFvYmplY3REYXRhTW9kZWwgfSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XG5pbXBvcnQgeyBEYXkgfSBmcm9tICcuLi9tb2RlbHMnO1xuaW1wb3J0IHsgRGF5c0luV2Vla1BpcGUgfSBmcm9tICcuLi9kYXlzLWluLXdlZWsucGlwZSc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jYWxlbmRhci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1tb250aC1kYXlzJyxcbiAgICB0ZW1wbGF0ZVVybDogJy4vbW9udGgtZGF5cy5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vbW9udGgtZGF5cy5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIE1vbnRoRGF5c0NvbXBvbmVudCBleHRlbmRzIEJhc2VDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgbW9udGhXZWVrc0NvdW50OiB7IGZpcnN0V2Vla0luZGV4OiBudW1iZXI7IHdlZWtzQ291bnQ6IG51bWJlciB9O1xuICAgIEBJbnB1dCgpIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSB3ZWVrRGF5c01pbjogc3RyaW5nW107XG4gICAgQElucHV0KCkgdG9kYXk6IERhdGU7XG4gICAgQElucHV0KCkgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7XG4gICAgQElucHV0KCkgZGF5czogRGF5W107XG4gICAgQElucHV0KCkgY2FsZW5kYXJGaWVsZHM6IENhbGVuZGFyRmllbGRzO1xuICAgIEBJbnB1dCgpIHJ0bDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkZXZpY2VTaXplOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbW9EYXRhTGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdO1xuICAgIEBJbnB1dCgpIGRhdGVQaWNrZXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSByYW5nZVBpY2tlciA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHN0YXJ0U2VsZWN0ZWREYXlJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIGVuZFNlbGVjdGVkRGF5SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBAT3V0cHV0KCkgZWRpdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xuICAgIEBPdXRwdXQoKSBkZWxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgZGF5U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIGRheUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxEYXk+KCk7XG4gICAgQE91dHB1dCgpIGRheU1vdXNlTW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5PigpO1xuICAgIEBPdXRwdXQoKSBkYXlNb3VzZVVwID0gbmV3IEV2ZW50RW1pdHRlcjxEYXk+KCk7XG4gICAgQE91dHB1dCgpIGRheU1vdXNlRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5PigpO1xuICAgIEBPdXRwdXQoKSBzaG93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbD4oKTtcbiAgICBkZWZhdWx0V2Vla3NDb3VudEQ6IG51bWJlcjtcbiAgICBkZWZhdWx0Rmlyc3RXZWVrSW5kZXg6IG51bWJlcjtcbiAgICBzZWxlY3RlZFdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBzZWxlY3RlZDogRGF5O1xuICAgIG51bWJlck9mV2VlazogbnVtYmVyW107XG4gICAgZGF5SGVpZ2h0OiBudW1iZXI7XG4gICAgdGFza0hlaWdodCA9IDMwO1xuICAgIG1heFRhc2tDb3VudDogbnVtYmVyO1xuICAgIG1heFJvd1Rhc2tzOiBudW1iZXJbXTtcbiAgICB3ZWVrVGFza3NBcnJheTogYW55O1xuICAgIGV4dHJhUm93OiBudW1iZXJbXTtcbiAgICBpc1BpY2tlck1vZGU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIF9oYXNQb3BvdmVyT3BlbmVkOiBib29sZWFuW10gPSBbXTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkYXlzSW5XZWVrOiBEYXlzSW5XZWVrUGlwZSxcbiAgICAgICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBfY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgaWYgKGNoYW5nZXMuY29udGFpbmVySGVpZ2h0ICYmICFjaGFuZ2VzLmNvbnRhaW5lckhlaWdodC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5maXRUb0NvbnRhaW5lcihjaGFuZ2VzLmNvbnRhaW5lckhlaWdodC5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLmRldmljZVNpemUgJiYgIWNoYW5nZXMuZGV2aWNlU2l6ZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlV2Vla0RheXMoY2hhbmdlcy5kZXZpY2VTaXplLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNoYW5nZXMubW9EYXRhTGlzdCAmJiAhY2hhbmdlcy5tb0RhdGFMaXN0LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKGNoYW5nZXMubW9EYXRhTGlzdC5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY2hhbmdlcy5tb250aEluZm8gJiYgIWNoYW5nZXMubW9udGhJbmZvLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKHRoaXMubW9EYXRhTGlzdCk7XG4gICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjaGFuZ2VzLm1vbnRoV2Vla3NDb3VudCAmJiAhY2hhbmdlcy5tb250aFdlZWtzQ291bnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZml0VG9Db250YWluZXIodGhpcy5jb250YWluZXJIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURheXNUYXNrcyh0aGlzLm1vRGF0YUxpc3QpO1xuICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmlzUGlja2VyTW9kZSA9IHRoaXMuZGF0ZVBpY2tlciB8fCB0aGlzLnJhbmdlUGlja2VyO1xuICAgICAgICB0aGlzLnByZXBhcmVXZWVrRGF5cyh0aGlzLmRldmljZVNpemUpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKHRoaXMubW9EYXRhTGlzdCk7XG4gICAgICAgIHRoaXMuZml0VG9Db250YWluZXIodGhpcy5jb250YWluZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIG9uRGF5Qm94U2VsZWN0KGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZpcmVEYXlTZWxlY3QoZGF5KTtcbiAgICB9XG4gICAgb25EYXlTZWxlY3Qod2Vla0luZGV4OiBudW1iZXIsIGRheUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5kYXlzW3dlZWtJbmRleCAqIDcgKyBkYXlJbmRleF07XG4gICAgICAgIHRoaXMuX2ZpcmVEYXlTZWxlY3QoZGF5KTtcbiAgICB9XG5cbiAgICBvbk9wZW5Qb3BvdmVyQ2hhbmdlKGlzT3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVuUG9wb3Zlcihpc09wZW4pO1xuICAgIH1cbiAgICBvbk1vcmVCdXR0b24oZSwgcG9wb3Zlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZSk7XG4gICAgICAgIHBvcG92ZXIub3BlbigpO1xuICAgIH1cbiAgICBvblRhc2soZSwgdGFzazogQ2FsZW5kYXJNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0V2ZW50LmVtaXQodGFzayk7XG4gICAgfVxuICAgIG9uRGF5Q2xpY2soZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGRheTtcbiAgICAgICAgdGhpcy5kYXlDbGljay5lbWl0KGRheSk7XG4gICAgfVxuICAgIG9uRGF5TW91c2VNb3ZlKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF5TW91c2VNb3ZlLmVtaXQoZGF5KTtcbiAgICB9XG4gICAgb25EYXlNb3VzZURvd24oZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXlNb3VzZURvd24uZW1pdChkYXkpO1xuICAgIH1cbiAgICBvbkRheU1vdXNlVXAoZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXlNb3VzZVVwLmVtaXQoZGF5KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcHJldmVudEV2ZW50KGUpOiB2b2lkIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9maXJlRGF5U2VsZWN0KGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNQb3BvdmVyT3BlbmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kYXlTZWxlY3QuZW1pdChtb21lbnQoZGF5LmRhdGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9vcGVuUG9wb3Zlcihpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5faGFzUG9wb3Zlck9wZW5lZC5wdXNoKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFzUG9wb3Zlck9wZW5lZCA9IFtdO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBwcmVwYXJlV2Vla0RheXMoZGV2aWNlU2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChkZXZpY2VTaXplICE9PSAncycgJiYgZGV2aWNlU2l6ZSAhPT0gJ20nKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2Vla0RheXMgPSB0aGlzLndlZWtEYXlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdlZWtEYXlzID0gdGhpcy53ZWVrRGF5c01pbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGZpdFRvQ29udGFpbmVyKGNvbnRhaW5lckhlaWdodCk6IHZvaWQge1xuICAgICAgICBsZXQgX3dlZWtzQ291bnQ7XG4gICAgICAgIGxldCBfZmlyc3RXZWVrSW5kZXg7XG4gICAgICAgIGlmICh0aGlzLm1vbnRoV2Vla3NDb3VudD8ud2Vla3NDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHsgd2Vla3NDb3VudCwgZmlyc3RXZWVrSW5kZXggfSA9IHRoaXMubW9udGhXZWVrc0NvdW50O1xuICAgICAgICAgICAgX3dlZWtzQ291bnQgPSB3ZWVrc0NvdW50O1xuICAgICAgICAgICAgX2ZpcnN0V2Vla0luZGV4ID0gZmlyc3RXZWVrSW5kZXg7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBfd2Vla3NDb3VudCA9IHRoaXMuZGF5cy5sZW5ndGggLyA3O1xuICAgICAgICAgICAgX2ZpcnN0V2Vla0luZGV4ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubnVtYmVyT2ZXZWVrID0gQXJyYXkuZnJvbShBcnJheShfd2Vla3NDb3VudCkua2V5cygpKTtcbiAgICAgICAgdGhpcy5udW1iZXJPZldlZWsgPSB0aGlzLm51bWJlck9mV2Vlay5tYXAoKHZhbHVlKSA9PiB2YWx1ZSArIF9maXJzdFdlZWtJbmRleCk7XG4gICAgICAgIGlmICh0aGlzLmlzUGlja2VyTW9kZSkge1xuICAgICAgICAgICAgdGhpcy5kYXlIZWlnaHQgPSA0MDtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRheUhlaWdodCA9IE1hdGguZmxvb3IoY29udGFpbmVySGVpZ2h0IC8gX3dlZWtzQ291bnQpICsgMTtcblxuICAgICAgICB0aGlzLm1heFRhc2tDb3VudCA9IE1hdGguZmxvb3IoKHRoaXMuZGF5SGVpZ2h0IC0gdGhpcy50YXNrSGVpZ2h0KSAvIHRoaXMudGFza0hlaWdodCk7XG4gICAgICAgIHRoaXMubWF4Um93VGFza3MgPSBuZXcgQXJyYXkodGhpcy5tYXhUYXNrQ291bnQpLmZpbGwoMCkubWFwKCh4LCBpKSA9PiBpKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcHJlcGFyZURheXNUYXNrcyhjYWxlbmRhclRhc2tzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUGlja2VyTW9kZSkge1xuICAgICAgICAgICAgdGhpcy53ZWVrVGFza3NBcnJheSA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsZW5kYXJGaWVsZHMgPSB0aGlzLmNhbGVuZGFyRmllbGRzO1xuXG4gICAgICAgIC8vIFNvcnQgYWxsIFRhc2tzXG4gICAgICAgIGNvbnN0IG1vRGF0YUxpc3QgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc29ydFRhc2tzKGNhbGVuZGFyVGFza3MsIGNhbGVuZGFyRmllbGRzKTtcbiAgICAgICAgdGhpcy5kYXlzLmZvckVhY2goKGRheSkgPT4gKGRheS50YXNrcyA9IFtdKSk7XG4gICAgICAgIGNvbnN0IHdlZWtUYXNrc0FycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmRheXMubGVuZ3RoIC8gNzsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5kYXlzSW5XZWVrLnRyYW5zZm9ybSh0aGlzLmRheXMsIGopO1xuICAgICAgICAgICAgY29uc3Qgd2VlayA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5jcmVhdGVXZWVrVGFzayhkYXlzLCBtb0RhdGFMaXN0LCBjYWxlbmRhckZpZWxkcywgMCk7XG4gICAgICAgICAgICB3ZWVrVGFza3NBcnJheS5wdXNoKHdlZWspO1xuICAgICAgICB9XG5cbiAgICAgICAgd2Vla1Rhc2tzQXJyYXkuZm9yRWFjaCgod2VlaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJyOiBhbnlbXSA9IE9iamVjdC52YWx1ZXMod2Vlayk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aDsgaSA8IHRoaXMubWF4VGFza0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB3ZWVrW2kudG9TdHJpbmcoKV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vINio2Ycg2KfYstin24wg2YfYsSDYsdiv24zZgSDYqtiz2qkg2KjYp9uM2K8g2KrYudiv2KfYryA3INiz2KrZiNmGINin2LbYp9mB2Ycg2q/Ysdiv2K8g2Ygg2KjYsdin24wg2LPYqtmI2YbbjCDaqdmHINiq2LPaqduMINmG2K/Yp9ix2K8g24zaqSDYrNin24wg2K7Yp9mE24wgY29sc3BhbiAxINmF24zar9iw2KfYsduM2YVcbiAgICAgICAgd2Vla1Rhc2tzQXJyYXkuZm9yRWFjaCgod2VlaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmZpbGxXZWVrKHdlZWspO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53ZWVrVGFza3NBcnJheSA9IHdlZWtUYXNrc0FycmF5O1xuICAgIH1cbn1cbiIsIjx0YWJsZSBmZC10YWJsZSBjbGFzcz1cInRhYmxlLWhlYWRlclwiIFtjb21wYWN0XT1cInRydWVcIj5cclxuICAgIDx0aGVhZCBmZC10YWJsZS1oZWFkZXI+XHJcbiAgICAgICAgPHRyIGZkLXRhYmxlLXJvdz5cclxuICAgICAgICAgICAgPHRoXHJcbiAgICAgICAgICAgICAgICBjbGFzcz1cIndlZWtkYXktaGVhZGVyXCJcclxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB3ZWVrRGF5IG9mIHNlbGVjdGVkV2Vla0RheXNcIlxyXG4gICAgICAgICAgICAgICAgZmQtdGFibGUtY2VsbFxyXG4gICAgICAgICAgICAgICAgW2NsYXNzLm5vYm9yZGVyXT1cImlzUGlja2VyTW9kZVwiXHJcbiAgICAgICAgICAgID5cclxuICAgICAgICAgICAgICAgIHt7IHdlZWtEYXkgfX1cclxuICAgICAgICAgICAgPC90aD5cclxuICAgICAgICA8L3RyPlxyXG4gICAgPC90aGVhZD5cclxuICAgIDx0Ym9keSBmZC10YWJsZS1ib2R5PlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2YgbnVtYmVyT2ZXZWVrXCI+XHJcbiAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3c+XHJcbiAgICAgICAgICAgICAgICA8dGRcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRheUhlaWdodFwiXHJcbiAgICAgICAgICAgICAgICAgICAgZmQtdGFibGUtY2VsbFxyXG4gICAgICAgICAgICAgICAgICAgIGNvbHNwYW49XCI3XCJcclxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cImlzUGlja2VyTW9kZSA/ICdub25lJyA6IG51bGxcIlxyXG4gICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclRhc2tzO1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogaXNQaWNrZXJNb2RlID8gbnVsbCA6IG1vRGF0YUxpc3Rbd2Vla0RheV0sXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0luZGV4OiB3ZWVrRGF5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IGRheXMgfCBkYXlzSW5XZWVrOiB3ZWVrRGF5LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd1Rhc2tzOiBtYXhSb3dUYXNrcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5czogd2Vla0RheXMsXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0bDogcnRsLFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGlja2VyTW9kZTogaXNQaWNrZXJNb2RlXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXHJcbiAgICAgICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxyXG4gICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgPC90cj5cclxuICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgIDwvdGJvZHk+XHJcbjwvdGFibGU+XHJcbjxuZy10ZW1wbGF0ZVxyXG4gICAgI3JlbmRlclRhc2tzXHJcbiAgICBsZXQtdGFza1xyXG4gICAgbGV0LXdlZWtJbmRleD1cIndlZWtJbmRleFwiXHJcbiAgICBsZXQtd2Vla0RheXM9XCJ3ZWVrRGF5c1wiXHJcbiAgICBsZXQtZGF5cz1cImRheXNcIlxyXG4gICAgbGV0LW1heFJvd1Rhc2tzPVwibWF4Um93VGFza3NcIlxyXG4gICAgbGV0LWNhbGVuZGFyRmllbGRzPVwiY2FsZW5kYXJGaWVsZHNcIlxyXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcclxuICAgIGxldC1ydGw9XCJydGxcIlxyXG4gICAgbGV0LWlzUGlja2VyTW9kZT1cImlzUGlja2VyTW9kZVwiXHJcbj5cclxuICAgIDx0YWJsZSBmZC10YWJsZS1ib2R5IGNsYXNzPVwidGFibGUtY29udGVudFwiIFtjb21wYWN0XT1cInRydWVcIj5cclxuICAgICAgICA8dGJvZHk+XHJcbiAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3cgY2xhc3M9XCJyb3ctZGF5LW51bWJlclwiPlxyXG4gICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzIHwgZGF5c0luV2Vlazogd2Vla0luZGV4XCIgW2NsYXNzLm5vYm9yZGVyXT1cImlzUGlja2VyTW9kZVwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxiYy1kYXktbnVtYmVyLWJveFxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW1dPVwiaXNQaWNrZXJNb2RlXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtLS1vdGhlci1tb250aF09XCJpc1BpY2tlck1vZGUgJiYgIWRheS5pc0luTW9udGhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRdPVwiaXNQaWNrZXJNb2RlICYmIGRheS5pc1dlZWtlbmRcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNQaWNrZXJNb2RlXT1cImlzUGlja2VyTW9kZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXldPVwiZGF5XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmlzLWFjdGl2ZV09XCJkYXkuaW5kZXggPT09IHN0YXJ0U2VsZWN0ZWREYXlJbmRleCB8fCBkYXkuaW5kZXggPT09IGVuZFNlbGVjdGVkRGF5SW5kZXhcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXJhbmdlXT1cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RlZERheUluZGV4ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRTZWxlY3RlZERheUluZGV4ICYmXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaW5kZXggPiBzdGFydFNlbGVjdGVkRGF5SW5kZXggJiZcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pbmRleCA8IGVuZFNlbGVjdGVkRGF5SW5kZXhcclxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlNb3VzZU1vdmUpPVwib25EYXlNb3VzZU1vdmUoZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlNb3VzZURvd24pPVwib25EYXlNb3VzZURvd24oZGF5KVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlNb3VzZVVwKT1cIm9uRGF5TW91c2VVcChkYXkpXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9iYy1kYXktbnVtYmVyLWJveD5cclxuICAgICAgICAgICAgICAgIDwvdGQ+XHJcbiAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhaXNQaWNrZXJNb2RlXCI+XHJcbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyXHJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyRGF5VGFza3M7XHJcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogd2Vla1Rhc2tzQXJyYXlbd2Vla0luZGV4XSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd1Rhc2tzOiBtYXhSb3dUYXNrcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtJbmRleDogd2Vla0luZGV4LFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGVuZGFyRmllbGRzOiBjYWxlbmRhckZpZWxkcyxcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5c1xyXG4gICAgICAgICAgICAgICAgICAgICAgICB9XHJcbiAgICAgICAgICAgICAgICAgICAgXCJcclxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3c+XHJcbiAgICAgICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgKm5nRm9yPVwibGV0IGRheSBvZiBkYXlzXCIgY2xhc3M9XCJtb3JlLWZkXCIgKGNsaWNrKT1cIm9uRGF5Qm94U2VsZWN0KGRheSlcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIm1heFJvd1Rhc2tzLmxlbmd0aCA8IGRheS50YXNrcy5sZW5ndGhcIj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Nb3JlQnV0dG9uKCRldmVudCwgcG9wb3ZlcilcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NvbXBhY3RdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3sgZGF5LnRhc2tzPy5sZW5ndGggLSBtYXhSb3dUYXNrcy5sZW5ndGggfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnTW9yZScgfCBiYmJUcmFuc2xhdGUgfX1cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGZkLXBvcG92ZXJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcG9wb3ZlclxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFttb2JpbGVdPVwiZGV2aWNlU2l6ZSA9PT0gJ3MnXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2ZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJvbk9wZW5Qb3BvdmVyQ2hhbmdlKCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxiYy1kYXktZXZlbnQtbGlzdFxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF5XT1cImRheVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhckZpZWxkc109XCJjYWxlbmRhckZpZWxkc1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcnRsXT1cInJ0bFwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInBvcG92ZXJcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlRXZlbnQpPVwiZGVsZXRlRXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkaXRFdmVudCk9XCJlZGl0RXZlbnQuZW1pdCgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9iYy1kYXktZXZlbnQtbGlzdD5cclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZmQtcG9wb3Zlcj5cclxuICAgICAgICAgICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cclxuICAgICAgICAgICAgICAgIDwvdHI+XHJcbiAgICAgICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICAgIDwvdGJvZHk+XHJcbiAgICA8L3RhYmxlPlxyXG48L25nLXRlbXBsYXRlPlxyXG5cclxuPG5nLXRlbXBsYXRlXHJcbiAgICAjcmVuZGVyRGF5VGFza3NcclxuICAgIGxldC13ZWVrVGFza3NcclxuICAgIGxldC1tYXhSb3dUYXNrcz1cIm1heFJvd1Rhc2tzXCJcclxuICAgIGxldC13ZWVrSW5kZXg9XCJ3ZWVrSW5kZXhcIlxyXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcclxuICAgIGxldC1jYWxlbmRhckZpZWxkcz1cImNhbGVuZGFyRmllbGRzXCJcclxuICAgIGxldC13ZWVrRGF5cz1cIndlZWtEYXlzXCJcclxuPlxyXG4gICAgPHRyIGZkLXRhYmxlLXJvdyAqbmdGb3I9XCJsZXQgcm93VGFzayBvZiBtYXhSb3dUYXNrczsgbGV0IGkgPSBpbmRleFwiPlxyXG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCIhd2Vla1Rhc2tzW2ldIHx8IHdlZWtUYXNrc1tpXS5sZW5ndGggPT09IDBcIj5cclxuICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiPjwvdGQ+XHJcbiAgICAgICAgPC9uZy1jb250YWluZXI+XHJcbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgdGFzayBvZiB3ZWVrVGFza3NbaV07IGxldCBkYXlJbmRleCA9IGluZGV4XCI+XHJcbiAgICAgICAgICAgIDx0ZCBmZC10YWJsZS1jZWxsIFthdHRyLmNvbHNwYW5dPVwidGFzay5jb2xTcGFuXCIgKm5nSWY9XCJ0YXNrLmNvbFNwYW5cIj5cclxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJ0YXNrLmV2ZW50OyBlbHNlIG5ld0RheVNlbGVjdFwiPlxyXG4gICAgICAgICAgICAgICAgICAgIDxiYy1ldmVudC1idXR0b25cclxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2tdPVwidGFza1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcclxuICAgICAgICAgICAgICAgICAgICAgICAgW2RldmljZVNpemVdPVwiZGV2aWNlU2l6ZVwiXHJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJkZWxldGVFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAoZWRpdEV2ZW50KT1cImVkaXRFdmVudC5lbWl0KCRldmVudClcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgICAob3BlblBvcG92ZXJDaGFuZ2UpPVwib25PcGVuUG9wb3ZlckNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICA+PC9iYy1ldmVudC1idXR0b24+XHJcbiAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cclxuICAgICAgICAgICAgICAgIDxuZy10ZW1wbGF0ZSAjbmV3RGF5U2VsZWN0PlxyXG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlXCIgKGNsaWNrKT1cIm9uRGF5U2VsZWN0KHdlZWtJbmRleCwgZGF5SW5kZXgpXCI+PC9kaXY+XHJcbiAgICAgICAgICAgICAgICA8L25nLXRlbXBsYXRlPlxyXG4gICAgICAgICAgICA8L3RkPlxyXG4gICAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgPC90cj5cclxuPC9uZy10ZW1wbGF0ZT5cclxuIl19