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.
- package/README.md +25 -0
- package/esm2020/barsa-calendar.mjs +5 -0
- package/esm2020/lib/barsa-calendar.module.mjs +106 -0
- package/esm2020/lib/calendar-container/calendar-container.component.mjs +190 -0
- package/esm2020/lib/calendar-header/calendar-header.component.mjs +61 -0
- package/esm2020/lib/calendar-list/calendar-list.component.mjs +19 -0
- package/esm2020/lib/calendar-list-container/calendar-list-container.component.mjs +30 -0
- package/esm2020/lib/calendar-list-item/calendar-list-item.component.mjs +14 -0
- package/esm2020/lib/calendar-month/calendar-month.component.mjs +244 -0
- package/esm2020/lib/calendar-selection-days/calendar-selection-days.component.mjs +193 -0
- package/esm2020/lib/calendar-week/calendar-week.component.mjs +182 -0
- package/esm2020/lib/constants.mjs +4 -0
- package/esm2020/lib/date-time-picker/date-time-picker.component.mjs +324 -0
- package/esm2020/lib/day-event-list/day-event-list.component.mjs +53 -0
- package/esm2020/lib/day-number-box/day-number-box.component.mjs +105 -0
- package/esm2020/lib/days-in-week.pipe.mjs +17 -0
- package/esm2020/lib/equal-date.pipe.mjs +23 -0
- package/esm2020/lib/event-button/event-button.component.mjs +70 -0
- package/esm2020/lib/event-date.pipe.mjs +24 -0
- package/esm2020/lib/event-preview/event-preview.component.mjs +60 -0
- package/esm2020/lib/event-time.pipe.mjs +22 -0
- package/esm2020/lib/from-to-time.pipe.mjs +23 -0
- package/esm2020/lib/models.mjs +14 -0
- package/esm2020/lib/month-days/month-days.component.mjs +220 -0
- package/esm2020/lib/services/calendar.service.mjs +610 -0
- package/esm2020/public-api.mjs +21 -0
- package/fesm2015/barsa-calendar.mjs +2447 -0
- package/fesm2015/barsa-calendar.mjs.map +1 -0
- package/fesm2020/barsa-calendar.mjs +2455 -0
- package/fesm2020/barsa-calendar.mjs.map +1 -0
- package/index.d.ts +5 -0
- package/lib/barsa-calendar.module.d.ts +33 -0
- package/lib/calendar-container/calendar-container.component.d.ts +73 -0
- package/lib/calendar-header/calendar-header.component.d.ts +29 -0
- package/lib/calendar-list/calendar-list.component.d.ts +8 -0
- package/lib/calendar-list-container/calendar-list-container.component.d.ts +14 -0
- package/lib/calendar-list-item/calendar-list-item.component.d.ts +7 -0
- package/lib/calendar-month/calendar-month.component.d.ts +70 -0
- package/lib/calendar-selection-days/calendar-selection-days.component.d.ts +47 -0
- package/lib/calendar-week/calendar-week.component.d.ts +57 -0
- package/lib/constants.d.ts +1 -0
- package/lib/date-time-picker/date-time-picker.component.d.ts +98 -0
- package/lib/day-event-list/day-event-list.component.d.ts +20 -0
- package/lib/day-number-box/day-number-box.component.d.ts +30 -0
- package/lib/days-in-week.pipe.d.ts +9 -0
- package/lib/equal-date.pipe.d.ts +8 -0
- package/lib/event-button/event-button.component.d.ts +26 -0
- package/lib/event-date.pipe.d.ts +9 -0
- package/lib/event-preview/event-preview.component.d.ts +19 -0
- package/lib/event-time.pipe.d.ts +9 -0
- package/lib/from-to-time.pipe.d.ts +9 -0
- package/lib/models.d.ts +107 -0
- package/lib/month-days/month-days.component.d.ts +69 -0
- package/lib/services/calendar.service.d.ts +70 -0
- package/package.json +31 -0
- package/public-api.d.ts +17 -0
|
@@ -0,0 +1,244 @@
|
|
|
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
|
+
import * as i11 from "../equal-date.pipe";
|
|
16
|
+
export class CalendarMonthComponent extends BaseComponent {
|
|
17
|
+
constructor(daysInWeek, _cdr, _calendarService) {
|
|
18
|
+
super();
|
|
19
|
+
this.daysInWeek = daysInWeek;
|
|
20
|
+
this._cdr = _cdr;
|
|
21
|
+
this._calendarService = _calendarService;
|
|
22
|
+
this.datePicker = false;
|
|
23
|
+
this.rangePicker = false;
|
|
24
|
+
this.canDelete = false;
|
|
25
|
+
this.canAdd = false;
|
|
26
|
+
this.canEdit = false;
|
|
27
|
+
this.editEvent = new EventEmitter();
|
|
28
|
+
this.deleteEvent = new EventEmitter();
|
|
29
|
+
this.daySelect = new EventEmitter();
|
|
30
|
+
this.dayClick = new EventEmitter();
|
|
31
|
+
this.dayMouseMove = new EventEmitter();
|
|
32
|
+
this.dayMouseUp = new EventEmitter();
|
|
33
|
+
this.dayMouseDown = new EventEmitter();
|
|
34
|
+
this.showEvent = new EventEmitter();
|
|
35
|
+
this.taskHeight = 30;
|
|
36
|
+
this._hasPopoverOpened = [];
|
|
37
|
+
}
|
|
38
|
+
ngOnChanges(changes) {
|
|
39
|
+
super.ngOnChanges(changes);
|
|
40
|
+
let needToDetectChange = false;
|
|
41
|
+
const { containerHeight, deviceSize, moDataList, days, monthWeeksCount, startSelectedDayIndex, endSelectedDayIndex } = changes;
|
|
42
|
+
if (containerHeight && !containerHeight.firstChange) {
|
|
43
|
+
this.fitToContainer(changes.containerHeight.currentValue);
|
|
44
|
+
}
|
|
45
|
+
if (deviceSize && !deviceSize.firstChange) {
|
|
46
|
+
this.prepareWeekDays(changes.deviceSize.currentValue);
|
|
47
|
+
}
|
|
48
|
+
if (moDataList && !moDataList.firstChange) {
|
|
49
|
+
this._prepareDaysTasks(changes.moDataList.currentValue);
|
|
50
|
+
needToDetectChange = true;
|
|
51
|
+
}
|
|
52
|
+
if (days && !days.firstChange) {
|
|
53
|
+
this.fitToContainer(this.containerHeight);
|
|
54
|
+
this._prepareDaysTasks(this.moDataList);
|
|
55
|
+
needToDetectChange = true;
|
|
56
|
+
}
|
|
57
|
+
if (monthWeeksCount && !monthWeeksCount.firstChange) {
|
|
58
|
+
this.fitToContainer(this.containerHeight);
|
|
59
|
+
this._prepareDaysTasks(this.moDataList);
|
|
60
|
+
needToDetectChange = true;
|
|
61
|
+
}
|
|
62
|
+
if ((startSelectedDayIndex && !startSelectedDayIndex.firstChange) ||
|
|
63
|
+
(endSelectedDayIndex && !endSelectedDayIndex.firstChange)) {
|
|
64
|
+
needToDetectChange = true;
|
|
65
|
+
}
|
|
66
|
+
if (needToDetectChange) {
|
|
67
|
+
this._cdr.detectChanges();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
ngOnInit() {
|
|
71
|
+
super.ngOnInit();
|
|
72
|
+
this.isPickerMode = this.datePicker || this.rangePicker;
|
|
73
|
+
this.prepareWeekDays(this.deviceSize);
|
|
74
|
+
this._prepareDaysTasks(this.moDataList);
|
|
75
|
+
this.fitToContainer(this.containerHeight);
|
|
76
|
+
}
|
|
77
|
+
onDayBoxSelect(day) {
|
|
78
|
+
this._fireDaySelect(day);
|
|
79
|
+
}
|
|
80
|
+
onDaySelect(weekIndex, dayIndex) {
|
|
81
|
+
if (!this.canAdd) {
|
|
82
|
+
return;
|
|
83
|
+
}
|
|
84
|
+
const day = this.days[weekIndex * 7 + dayIndex];
|
|
85
|
+
this._fireDaySelect(day);
|
|
86
|
+
}
|
|
87
|
+
onOpenPopoverChange(isOpen) {
|
|
88
|
+
this._openPopover(isOpen);
|
|
89
|
+
}
|
|
90
|
+
onMoreButton(e, popover) {
|
|
91
|
+
this._preventEvent(e);
|
|
92
|
+
popover.open();
|
|
93
|
+
}
|
|
94
|
+
onTask(e, task) {
|
|
95
|
+
this.showEvent.emit(task);
|
|
96
|
+
}
|
|
97
|
+
onDayClick(day) {
|
|
98
|
+
this.selected = day;
|
|
99
|
+
this.dayClick.emit(day);
|
|
100
|
+
}
|
|
101
|
+
onDayMouseMove(day) {
|
|
102
|
+
this.dayMouseMove.emit(day);
|
|
103
|
+
}
|
|
104
|
+
onDayMouseDown(day) {
|
|
105
|
+
this.dayMouseDown.emit(day);
|
|
106
|
+
}
|
|
107
|
+
onDayMouseUp(day) {
|
|
108
|
+
this.dayMouseUp.emit(day);
|
|
109
|
+
}
|
|
110
|
+
_preventEvent(e) {
|
|
111
|
+
e.stopPropagation();
|
|
112
|
+
e.preventDefault();
|
|
113
|
+
}
|
|
114
|
+
_fireDaySelect(day) {
|
|
115
|
+
if (this._hasPopoverOpened.length === 0) {
|
|
116
|
+
this.daySelect.emit(moment(day.date));
|
|
117
|
+
}
|
|
118
|
+
}
|
|
119
|
+
_openPopover(isOpen) {
|
|
120
|
+
if (isOpen) {
|
|
121
|
+
this._hasPopoverOpened.push(true);
|
|
122
|
+
}
|
|
123
|
+
else {
|
|
124
|
+
setTimeout(() => {
|
|
125
|
+
this._hasPopoverOpened = [];
|
|
126
|
+
}, 0);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
prepareWeekDays(deviceSize) {
|
|
130
|
+
if (deviceSize !== 's' && deviceSize !== 'm') {
|
|
131
|
+
this.selectedWeekDays = this.weekDays;
|
|
132
|
+
}
|
|
133
|
+
else {
|
|
134
|
+
this.selectedWeekDays = this.weekDaysMin;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
fitToContainer(containerHeight) {
|
|
138
|
+
let _weeksCount;
|
|
139
|
+
if (this.monthWeeksCount > 0) {
|
|
140
|
+
const weeksCount = this.monthWeeksCount;
|
|
141
|
+
_weeksCount = weeksCount;
|
|
142
|
+
}
|
|
143
|
+
else {
|
|
144
|
+
_weeksCount = this.days.length / 7;
|
|
145
|
+
}
|
|
146
|
+
this.numberOfWeek = Array.from(Array(_weeksCount).keys());
|
|
147
|
+
this.numberOfWeek = this.numberOfWeek.map((value) => value);
|
|
148
|
+
if (this.isPickerMode) {
|
|
149
|
+
this.dayHeight = 40;
|
|
150
|
+
return;
|
|
151
|
+
}
|
|
152
|
+
this.dayHeight = Math.floor(containerHeight / (_weeksCount + 1));
|
|
153
|
+
this.maxTaskCount = Math.floor((this.dayHeight - this.taskHeight) / this.taskHeight);
|
|
154
|
+
if (this.maxTaskCount > 0) {
|
|
155
|
+
this.maxRowTasks = new Array(this.maxTaskCount).fill(0).map((x, i) => i);
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
_prepareDaysTasks(calendarTasks) {
|
|
159
|
+
if (this.isPickerMode) {
|
|
160
|
+
this.weekTasksArray = {};
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
const calendarFields = this.calendarFields;
|
|
164
|
+
// Sort all Tasks
|
|
165
|
+
const moDataList = this._calendarService.sortTasks(calendarTasks, calendarFields);
|
|
166
|
+
this.days.forEach((day) => (day.tasks = []));
|
|
167
|
+
const weekTasksArray = [];
|
|
168
|
+
for (let j = 0; j < this.days.length / 7; j++) {
|
|
169
|
+
const days = this.daysInWeek.transform(this.days, j);
|
|
170
|
+
const week = this._calendarService.createWeekTask(days, moDataList, calendarFields, 0);
|
|
171
|
+
weekTasksArray.push(week);
|
|
172
|
+
}
|
|
173
|
+
weekTasksArray.forEach((week) => {
|
|
174
|
+
const arr = Object.values(week);
|
|
175
|
+
for (let i = arr.length; i < this.maxTaskCount; i++) {
|
|
176
|
+
week[i.toString()] = [];
|
|
177
|
+
}
|
|
178
|
+
});
|
|
179
|
+
// به ازای هر ردیف تسک باید تعداد 7 ستون اضافه گردد و برای ستونی که تسکی ندارد یک جای خالی colspan 1 میگذاریم
|
|
180
|
+
weekTasksArray.forEach((week) => {
|
|
181
|
+
this._calendarService.fillWeek(week);
|
|
182
|
+
});
|
|
183
|
+
this.weekTasksArray = weekTasksArray;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
CalendarMonthComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: CalendarMonthComponent, deps: [{ token: i1.DaysInWeekPipe }, { token: i0.ChangeDetectorRef }, { token: i2.CalendarService }], target: i0.ɵɵFactoryTarget.Component });
|
|
187
|
+
CalendarMonthComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: CalendarMonthComponent, selector: "bc-calendar-month", 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", canDelete: "canDelete", canAdd: "canAdd", canEdit: "canEdit", selectedDate: "selectedDate", 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\" [attr.picker]=\"datePicker\">\n <thead fd-table-header>\n <tr fd-table-row>\n <th\n class=\"weekday-header\"\n *ngFor=\"let weekDay of selectedWeekDays\"\n fd-table-cell\n [class.noborder]=\"isPickerMode\"\n >\n {{ weekDay }}\n </th>\n </tr>\n </thead>\n <tbody fd-table-body>\n <ng-container *ngFor=\"let weekDay of numberOfWeek\">\n <tr fd-table-row>\n <td\n [style.height.px]=\"dayHeight\"\n fd-table-cell\n colspan=\"7\"\n [style.border]=\"isPickerMode ? 'none' : null\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n renderTasks;\n context: {\n $implicit: isPickerMode ? null : moDataList[weekDay],\n weekIndex: weekDay,\n days: days | daysInWeek: weekDay,\n maxRowTasks: maxRowTasks,\n weekDays: weekDays,\n calendarFields: calendarFields,\n rtl: rtl,\n isPickerMode: isPickerMode\n }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>\n<ng-template\n #renderTasks\n let-task\n let-weekIndex=\"weekIndex\"\n let-weekDays=\"weekDays\"\n let-days=\"days\"\n let-maxRowTasks=\"maxRowTasks\"\n let-calendarFields=\"calendarFields\"\n let-deviceSize=\"deviceSize\"\n let-rtl=\"rtl\"\n let-isPickerMode=\"isPickerMode\"\n>\n <table fd-table-body class=\"table-content\" [compact]=\"true\">\n <tbody>\n <tr fd-table-row class=\"row-day-number\" [attr.rtl]=\"rtl\">\n <td fd-table-cell *ngFor=\"let day of days\" [class.noborder]=\"isPickerMode\">\n <bc-day-number-box\n [class.fd-calendar__item]=\"isPickerMode\"\n [class.fd-calendar__item--other-month]=\"isPickerMode && !day.isInMonth\"\n [class.fd-calendar__item--weekend]=\"isPickerMode && day.isWeekend\"\n [isPickerMode]=\"isPickerMode\"\n [day]=\"day\"\n [isActive]=\"\n day.index === startSelectedDayIndex || day.index === endSelectedDayIndex || day.date\n | equalDate: selectedDate\n \"\n [itemInRange]=\"\n startSelectedDayIndex !== undefined &&\n endSelectedDayIndex !== undefined &&\n day.index >= startSelectedDayIndex &&\n day.index <= endSelectedDayIndex\n \"\n (dayClick)=\"onDayClick(day)\"\n (dayMouseMove)=\"onDayMouseMove(day)\"\n (dayMouseDown)=\"onDayMouseDown(day)\"\n (dayMouseUp)=\"onDayMouseUp(day)\"\n ></bc-day-number-box>\n </td>\n </tr>\n <ng-container *ngIf=\"!isPickerMode\">\n <ng-container\n *ngTemplateOutlet=\"\n renderDayTasks;\n context: {\n $implicit: weekTasksArray[weekIndex],\n maxRowTasks: maxRowTasks,\n weekIndex: weekIndex,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n weekDays: weekDays\n }\n \"\n ></ng-container>\n <tr fd-table-row>\n <td fd-table-cell *ngFor=\"let day of days\" class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\n <ng-container *ngIf=\"maxRowTasks?.length < day.tasks.length\">\n <button\n fd-button\n (click)=\"onMoreButton($event, popover)\"\n [fdType]=\"'transparent'\"\n [compact]=\"true\"\n >\n {{ day.tasks?.length - maxRowTasks?.length }}\n {{ 'More' | bbbTranslate }}\n </button>\n <fd-popover\n #popover\n [mobile]=\"deviceSize === 's'\"\n placement=\"bottom\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"true\"\n (isOpenChange)=\"onOpenPopoverChange($event)\"\n >\n <bc-day-event-list\n [day]=\"day\"\n [calendarFields]=\"calendarFields\"\n [deviceSize]=\"deviceSize\"\n [weekDays]=\"weekDays\"\n [rtl]=\"rtl\"\n [canDelete]=\"canDelete\"\n [canEdit]=\"canEdit\"\n [popover]=\"popover\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n ></bc-day-event-list>\n </fd-popover>\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n</ng-template>\n\n<ng-template\n #renderDayTasks\n let-weekTasks\n let-maxRowTasks=\"maxRowTasks\"\n let-weekIndex=\"weekIndex\"\n let-deviceSize=\"deviceSize\"\n let-calendarFields=\"calendarFields\"\n let-weekDays=\"weekDays\"\n>\n <tr fd-table-row *ngFor=\"let rowTask of maxRowTasks; let i = index\">\n <ng-container *ngIf=\"!weekTasks[i] || weekTasks[i].length === 0\">\n <td fd-table-cell *ngFor=\"let day of weekDays\"></td>\n </ng-container>\n <ng-container *ngFor=\"let task of weekTasks[i]; let dayIndex = index\">\n <td fd-table-cell [attr.colspan]=\"task.colSpan\" *ngIf=\"task.colSpan\">\n <ng-container *ngIf=\"task.event; else newDaySelect\">\n <bc-event-button\n [task]=\"task\"\n [calendarFields]=\"calendarFields\"\n [deviceSize]=\"deviceSize\"\n [rtl]=\"rtl\"\n [canDelete]=\"canDelete\"\n [canEdit]=\"canEdit\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n (openPopoverChange)=\"onOpenPopoverChange($event)\"\n ></bc-event-button>\n </ng-container>\n <ng-template #newDaySelect>\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n</ng-template>\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[rtl=true] td:first-child{border-right:none}.table-content .row-day-number[rtl=\"fa;se\"] td:first-child{border-left: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}table[picker=true] thead,table[picker=true] tbody{border:none}\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" }, { kind: "pipe", type: i11.EqualDatePipe, name: "equalDate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
188
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: CalendarMonthComponent, decorators: [{
|
|
189
|
+
type: Component,
|
|
190
|
+
args: [{ selector: 'bc-calendar-month', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table fd-table class=\"table-header\" [compact]=\"true\" [attr.picker]=\"datePicker\">\n <thead fd-table-header>\n <tr fd-table-row>\n <th\n class=\"weekday-header\"\n *ngFor=\"let weekDay of selectedWeekDays\"\n fd-table-cell\n [class.noborder]=\"isPickerMode\"\n >\n {{ weekDay }}\n </th>\n </tr>\n </thead>\n <tbody fd-table-body>\n <ng-container *ngFor=\"let weekDay of numberOfWeek\">\n <tr fd-table-row>\n <td\n [style.height.px]=\"dayHeight\"\n fd-table-cell\n colspan=\"7\"\n [style.border]=\"isPickerMode ? 'none' : null\"\n >\n <ng-container\n *ngTemplateOutlet=\"\n renderTasks;\n context: {\n $implicit: isPickerMode ? null : moDataList[weekDay],\n weekIndex: weekDay,\n days: days | daysInWeek: weekDay,\n maxRowTasks: maxRowTasks,\n weekDays: weekDays,\n calendarFields: calendarFields,\n rtl: rtl,\n isPickerMode: isPickerMode\n }\n \"\n ></ng-container>\n </td>\n </tr>\n </ng-container>\n </tbody>\n</table>\n<ng-template\n #renderTasks\n let-task\n let-weekIndex=\"weekIndex\"\n let-weekDays=\"weekDays\"\n let-days=\"days\"\n let-maxRowTasks=\"maxRowTasks\"\n let-calendarFields=\"calendarFields\"\n let-deviceSize=\"deviceSize\"\n let-rtl=\"rtl\"\n let-isPickerMode=\"isPickerMode\"\n>\n <table fd-table-body class=\"table-content\" [compact]=\"true\">\n <tbody>\n <tr fd-table-row class=\"row-day-number\" [attr.rtl]=\"rtl\">\n <td fd-table-cell *ngFor=\"let day of days\" [class.noborder]=\"isPickerMode\">\n <bc-day-number-box\n [class.fd-calendar__item]=\"isPickerMode\"\n [class.fd-calendar__item--other-month]=\"isPickerMode && !day.isInMonth\"\n [class.fd-calendar__item--weekend]=\"isPickerMode && day.isWeekend\"\n [isPickerMode]=\"isPickerMode\"\n [day]=\"day\"\n [isActive]=\"\n day.index === startSelectedDayIndex || day.index === endSelectedDayIndex || day.date\n | equalDate: selectedDate\n \"\n [itemInRange]=\"\n startSelectedDayIndex !== undefined &&\n endSelectedDayIndex !== undefined &&\n day.index >= startSelectedDayIndex &&\n day.index <= endSelectedDayIndex\n \"\n (dayClick)=\"onDayClick(day)\"\n (dayMouseMove)=\"onDayMouseMove(day)\"\n (dayMouseDown)=\"onDayMouseDown(day)\"\n (dayMouseUp)=\"onDayMouseUp(day)\"\n ></bc-day-number-box>\n </td>\n </tr>\n <ng-container *ngIf=\"!isPickerMode\">\n <ng-container\n *ngTemplateOutlet=\"\n renderDayTasks;\n context: {\n $implicit: weekTasksArray[weekIndex],\n maxRowTasks: maxRowTasks,\n weekIndex: weekIndex,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n weekDays: weekDays\n }\n \"\n ></ng-container>\n <tr fd-table-row>\n <td fd-table-cell *ngFor=\"let day of days\" class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\n <ng-container *ngIf=\"maxRowTasks?.length < day.tasks.length\">\n <button\n fd-button\n (click)=\"onMoreButton($event, popover)\"\n [fdType]=\"'transparent'\"\n [compact]=\"true\"\n >\n {{ day.tasks?.length - maxRowTasks?.length }}\n {{ 'More' | bbbTranslate }}\n </button>\n <fd-popover\n #popover\n [mobile]=\"deviceSize === 's'\"\n placement=\"bottom\"\n [focusTrapped]=\"true\"\n [focusAutoCapture]=\"true\"\n (isOpenChange)=\"onOpenPopoverChange($event)\"\n >\n <bc-day-event-list\n [day]=\"day\"\n [calendarFields]=\"calendarFields\"\n [deviceSize]=\"deviceSize\"\n [weekDays]=\"weekDays\"\n [rtl]=\"rtl\"\n [canDelete]=\"canDelete\"\n [canEdit]=\"canEdit\"\n [popover]=\"popover\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n ></bc-day-event-list>\n </fd-popover>\n </ng-container>\n </td>\n </tr>\n </ng-container>\n </tbody>\n </table>\n</ng-template>\n\n<ng-template\n #renderDayTasks\n let-weekTasks\n let-maxRowTasks=\"maxRowTasks\"\n let-weekIndex=\"weekIndex\"\n let-deviceSize=\"deviceSize\"\n let-calendarFields=\"calendarFields\"\n let-weekDays=\"weekDays\"\n>\n <tr fd-table-row *ngFor=\"let rowTask of maxRowTasks; let i = index\">\n <ng-container *ngIf=\"!weekTasks[i] || weekTasks[i].length === 0\">\n <td fd-table-cell *ngFor=\"let day of weekDays\"></td>\n </ng-container>\n <ng-container *ngFor=\"let task of weekTasks[i]; let dayIndex = index\">\n <td fd-table-cell [attr.colspan]=\"task.colSpan\" *ngIf=\"task.colSpan\">\n <ng-container *ngIf=\"task.event; else newDaySelect\">\n <bc-event-button\n [task]=\"task\"\n [calendarFields]=\"calendarFields\"\n [deviceSize]=\"deviceSize\"\n [rtl]=\"rtl\"\n [canDelete]=\"canDelete\"\n [canEdit]=\"canEdit\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n (openPopoverChange)=\"onOpenPopoverChange($event)\"\n ></bc-event-button>\n </ng-container>\n <ng-template #newDaySelect>\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\n </ng-template>\n </td>\n </ng-container>\n </tr>\n</ng-template>\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[rtl=true] td:first-child{border-right:none}.table-content .row-day-number[rtl=\"fa;se\"] td:first-child{border-left: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}table[picker=true] thead,table[picker=true] tbody{border:none}\n"] }]
|
|
191
|
+
}], ctorParameters: function () { return [{ type: i1.DaysInWeekPipe }, { type: i0.ChangeDetectorRef }, { type: i2.CalendarService }]; }, propDecorators: { monthWeeksCount: [{
|
|
192
|
+
type: Input
|
|
193
|
+
}], weekDays: [{
|
|
194
|
+
type: Input
|
|
195
|
+
}], weekDaysMin: [{
|
|
196
|
+
type: Input
|
|
197
|
+
}], today: [{
|
|
198
|
+
type: Input
|
|
199
|
+
}], containerHeight: [{
|
|
200
|
+
type: Input
|
|
201
|
+
}], days: [{
|
|
202
|
+
type: Input
|
|
203
|
+
}], calendarFields: [{
|
|
204
|
+
type: Input
|
|
205
|
+
}], rtl: [{
|
|
206
|
+
type: Input
|
|
207
|
+
}], deviceSize: [{
|
|
208
|
+
type: Input
|
|
209
|
+
}], moDataList: [{
|
|
210
|
+
type: Input
|
|
211
|
+
}], datePicker: [{
|
|
212
|
+
type: Input
|
|
213
|
+
}], rangePicker: [{
|
|
214
|
+
type: Input
|
|
215
|
+
}], canDelete: [{
|
|
216
|
+
type: Input
|
|
217
|
+
}], canAdd: [{
|
|
218
|
+
type: Input
|
|
219
|
+
}], canEdit: [{
|
|
220
|
+
type: Input
|
|
221
|
+
}], selectedDate: [{
|
|
222
|
+
type: Input
|
|
223
|
+
}], startSelectedDayIndex: [{
|
|
224
|
+
type: Input
|
|
225
|
+
}], endSelectedDayIndex: [{
|
|
226
|
+
type: Input
|
|
227
|
+
}], editEvent: [{
|
|
228
|
+
type: Output
|
|
229
|
+
}], deleteEvent: [{
|
|
230
|
+
type: Output
|
|
231
|
+
}], daySelect: [{
|
|
232
|
+
type: Output
|
|
233
|
+
}], dayClick: [{
|
|
234
|
+
type: Output
|
|
235
|
+
}], dayMouseMove: [{
|
|
236
|
+
type: Output
|
|
237
|
+
}], dayMouseUp: [{
|
|
238
|
+
type: Output
|
|
239
|
+
}], dayMouseDown: [{
|
|
240
|
+
type: Output
|
|
241
|
+
}], showEvent: [{
|
|
242
|
+
type: Output
|
|
243
|
+
}] } });
|
|
244
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sTUFBTSxNQUFNLFFBQVEsQ0FBQztBQUU1QixPQUFPLEVBQUUsYUFBYSxFQUFvRSxNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBWXZILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxhQUFhO0lBMkNyRCxZQUNZLFVBQTBCLEVBQzFCLElBQXVCLEVBQ3ZCLGdCQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQUpBLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQzFCLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFuQ3BDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUlmLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUNwRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3RELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxJQUFJ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R1osdUJBQXVCLENBQUMsTUFBTTttS0FHdEMsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IG1vbWVudCBmcm9tICdtb21lbnQnO1xuXG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBDYWxlbmRhckZpZWxkcywgQ2FsZW5kYXJNZXRhb2JqZWN0RGF0YU1vZGVsLCBNZXRhb2JqZWN0RGF0YU1vZGVsIH0gZnJvbSAnYmFyc2Etbm92aW4tcmF5LWNvcmUnO1xuaW1wb3J0IHsgRGF5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IERheXNJbldlZWtQaXBlIH0gZnJvbSAnLi4vZGF5cy1pbi13ZWVrLnBpcGUnO1xuXG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jYWxlbmRhci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1jYWxlbmRhci1tb250aCcsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyTW9udGhDb21wb25lbnQgZXh0ZW5kcyBCYXNlQ29tcG9uZW50IGltcGxlbWVudHMgT25DaGFuZ2VzLCBPbkluaXQge1xuICAgIEBJbnB1dCgpIG1vbnRoV2Vla3NDb3VudDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBASW5wdXQoKSB3ZWVrRGF5c01pbjogc3RyaW5nW107XG4gICAgQElucHV0KCkgdG9kYXk6IERhdGU7XG4gICAgQElucHV0KCkgY29udGFpbmVySGVpZ2h0OiBudW1iZXI7XG4gICAgQElucHV0KCkgZGF5czogRGF5W107XG4gICAgQElucHV0KCkgY2FsZW5kYXJGaWVsZHM6IENhbGVuZGFyRmllbGRzO1xuICAgIEBJbnB1dCgpIHJ0bDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBkZXZpY2VTaXplOiBzdHJpbmc7XG4gICAgQElucHV0KCkgbW9EYXRhTGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdO1xuICAgIEBJbnB1dCgpIGRhdGVQaWNrZXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSByYW5nZVBpY2tlciA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGNhbkRlbGV0ZSA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGNhbkFkZCA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIGNhbkVkaXQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBzZWxlY3RlZERhdGU6IERhdGUgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgc3RhcnRTZWxlY3RlZERheUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgZW5kU2VsZWN0ZWREYXlJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIEBPdXRwdXQoKSBlZGl0RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG4gICAgQE91dHB1dCgpIGRlbGV0ZUV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xuICAgIEBPdXRwdXQoKSBkYXlTZWxlY3QgPSBuZXcgRXZlbnRFbWl0dGVyPGFueT4oKTtcbiAgICBAT3V0cHV0KCkgZGF5Q2xpY2sgPSBuZXcgRXZlbnRFbWl0dGVyPERheT4oKTtcbiAgICBAT3V0cHV0KCkgZGF5TW91c2VNb3ZlID0gbmV3IEV2ZW50RW1pdHRlcjxEYXk+KCk7XG4gICAgQE91dHB1dCgpIGRheU1vdXNlVXAgPSBuZXcgRXZlbnRFbWl0dGVyPERheT4oKTtcbiAgICBAT3V0cHV0KCkgZGF5TW91c2VEb3duID0gbmV3IEV2ZW50RW1pdHRlcjxEYXk+KCk7XG4gICAgQE91dHB1dCgpIHNob3dFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FsZW5kYXJNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xuXG4gICAgZGVmYXVsdFdlZWtzQ291bnREOiBudW1iZXI7XG4gICAgZGVmYXVsdEZpcnN0V2Vla0luZGV4OiBudW1iZXI7XG4gICAgc2VsZWN0ZWRXZWVrRGF5czogc3RyaW5nW107XG4gICAgc2VsZWN0ZWQ6IERheTtcbiAgICBudW1iZXJPZldlZWs6IG51bWJlcltdO1xuICAgIGRheUhlaWdodDogbnVtYmVyO1xuICAgIHRhc2tIZWlnaHQgPSAzMDtcbiAgICBtYXhUYXNrQ291bnQ6IG51bWJlcjtcbiAgICBtYXhSb3dUYXNrczogbnVtYmVyW107XG4gICAgd2Vla1Rhc2tzQXJyYXk6IGFueTtcbiAgICBleHRyYVJvdzogbnVtYmVyW107XG4gICAgaXNQaWNrZXJNb2RlOiBib29sZWFuO1xuXG4gICAgcHJpdmF0ZSBfaGFzUG9wb3Zlck9wZW5lZDogYm9vbGVhbltdID0gW107XG5cbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBkYXlzSW5XZWVrOiBEYXlzSW5XZWVrUGlwZSxcbiAgICAgICAgcHJpdmF0ZSBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJpdmF0ZSBfY2FsZW5kYXJTZXJ2aWNlOiBDYWxlbmRhclNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgbGV0IG5lZWRUb0RldGVjdENoYW5nZSA9IGZhbHNlO1xuICAgICAgICBjb25zdCB7XG4gICAgICAgICAgICBjb250YWluZXJIZWlnaHQsXG4gICAgICAgICAgICBkZXZpY2VTaXplLFxuICAgICAgICAgICAgbW9EYXRhTGlzdCxcbiAgICAgICAgICAgIGRheXMsXG4gICAgICAgICAgICBtb250aFdlZWtzQ291bnQsXG4gICAgICAgICAgICBzdGFydFNlbGVjdGVkRGF5SW5kZXgsXG4gICAgICAgICAgICBlbmRTZWxlY3RlZERheUluZGV4XG4gICAgICAgIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAoY29udGFpbmVySGVpZ2h0ICYmICFjb250YWluZXJIZWlnaHQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZml0VG9Db250YWluZXIoY2hhbmdlcy5jb250YWluZXJIZWlnaHQuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGV2aWNlU2l6ZSAmJiAhZGV2aWNlU2l6ZS5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlV2Vla0RheXMoY2hhbmdlcy5kZXZpY2VTaXplLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vRGF0YUxpc3QgJiYgIW1vRGF0YUxpc3QuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVEYXlzVGFza3MoY2hhbmdlcy5tb0RhdGFMaXN0LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICBuZWVkVG9EZXRlY3RDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkYXlzICYmICFkYXlzLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmZpdFRvQ29udGFpbmVyKHRoaXMuY29udGFpbmVySGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVEYXlzVGFza3ModGhpcy5tb0RhdGFMaXN0KTtcbiAgICAgICAgICAgIG5lZWRUb0RldGVjdENoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG1vbnRoV2Vla3NDb3VudCAmJiAhbW9udGhXZWVrc0NvdW50LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmZpdFRvQ29udGFpbmVyKHRoaXMuY29udGFpbmVySGVpZ2h0KTtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVEYXlzVGFza3ModGhpcy5tb0RhdGFMaXN0KTtcbiAgICAgICAgICAgIG5lZWRUb0RldGVjdENoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKFxuICAgICAgICAgICAgKHN0YXJ0U2VsZWN0ZWREYXlJbmRleCAmJiAhc3RhcnRTZWxlY3RlZERheUluZGV4LmZpcnN0Q2hhbmdlKSB8fFxuICAgICAgICAgICAgKGVuZFNlbGVjdGVkRGF5SW5kZXggJiYgIWVuZFNlbGVjdGVkRGF5SW5kZXguZmlyc3RDaGFuZ2UpXG4gICAgICAgICkge1xuICAgICAgICAgICAgbmVlZFRvRGV0ZWN0Q2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobmVlZFRvRGV0ZWN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25Jbml0KCk7XG4gICAgICAgIHRoaXMuaXNQaWNrZXJNb2RlID0gdGhpcy5kYXRlUGlja2VyIHx8IHRoaXMucmFuZ2VQaWNrZXI7XG4gICAgICAgIHRoaXMucHJlcGFyZVdlZWtEYXlzKHRoaXMuZGV2aWNlU2l6ZSk7XG4gICAgICAgIHRoaXMuX3ByZXBhcmVEYXlzVGFza3ModGhpcy5tb0RhdGFMaXN0KTtcbiAgICAgICAgdGhpcy5maXRUb0NvbnRhaW5lcih0aGlzLmNvbnRhaW5lckhlaWdodCk7XG4gICAgfVxuXG4gICAgb25EYXlCb3hTZWxlY3QoZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZmlyZURheVNlbGVjdChkYXkpO1xuICAgIH1cbiAgICBvbkRheVNlbGVjdCh3ZWVrSW5kZXg6IG51bWJlciwgZGF5SW5kZXg6IG51bWJlcik6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2FuQWRkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgZGF5ID0gdGhpcy5kYXlzW3dlZWtJbmRleCAqIDcgKyBkYXlJbmRleF07XG4gICAgICAgIHRoaXMuX2ZpcmVEYXlTZWxlY3QoZGF5KTtcbiAgICB9XG5cbiAgICBvbk9wZW5Qb3BvdmVyQ2hhbmdlKGlzT3BlbjogYm9vbGVhbik6IHZvaWQge1xuICAgICAgICB0aGlzLl9vcGVuUG9wb3Zlcihpc09wZW4pO1xuICAgIH1cbiAgICBvbk1vcmVCdXR0b24oZSwgcG9wb3Zlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9wcmV2ZW50RXZlbnQoZSk7XG4gICAgICAgIHBvcG92ZXIub3BlbigpO1xuICAgIH1cbiAgICBvblRhc2soZSwgdGFzazogQ2FsZW5kYXJNZXRhb2JqZWN0RGF0YU1vZGVsKTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2hvd0V2ZW50LmVtaXQodGFzayk7XG4gICAgfVxuICAgIG9uRGF5Q2xpY2soZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zZWxlY3RlZCA9IGRheTtcbiAgICAgICAgdGhpcy5kYXlDbGljay5lbWl0KGRheSk7XG4gICAgfVxuICAgIG9uRGF5TW91c2VNb3ZlKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF5TW91c2VNb3ZlLmVtaXQoZGF5KTtcbiAgICB9XG4gICAgb25EYXlNb3VzZURvd24oZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXlNb3VzZURvd24uZW1pdChkYXkpO1xuICAgIH1cbiAgICBvbkRheU1vdXNlVXAoZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXlNb3VzZVVwLmVtaXQoZGF5KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcHJldmVudEV2ZW50KGUpOiB2b2lkIHtcbiAgICAgICAgZS5zdG9wUHJvcGFnYXRpb24oKTtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgIH1cbiAgICBwcml2YXRlIF9maXJlRGF5U2VsZWN0KGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9oYXNQb3BvdmVyT3BlbmVkLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5kYXlTZWxlY3QuZW1pdChtb21lbnQoZGF5LmRhdGUpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9vcGVuUG9wb3Zlcihpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5faGFzUG9wb3Zlck9wZW5lZC5wdXNoKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFzUG9wb3Zlck9wZW5lZCA9IFtdO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBwcmVwYXJlV2Vla0RheXMoZGV2aWNlU2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChkZXZpY2VTaXplICE9PSAncycgJiYgZGV2aWNlU2l6ZSAhPT0gJ20nKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2Vla0RheXMgPSB0aGlzLndlZWtEYXlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdlZWtEYXlzID0gdGhpcy53ZWVrRGF5c01pbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGZpdFRvQ29udGFpbmVyKGNvbnRhaW5lckhlaWdodCk6IHZvaWQge1xuICAgICAgICBsZXQgX3dlZWtzQ291bnQ7XG5cbiAgICAgICAgaWYgKHRoaXMubW9udGhXZWVrc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgd2Vla3NDb3VudCA9IHRoaXMubW9udGhXZWVrc0NvdW50O1xuICAgICAgICAgICAgX3dlZWtzQ291bnQgPSB3ZWVrc0NvdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3dlZWtzQ291bnQgPSB0aGlzLmRheXMubGVuZ3RoIC8gNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm51bWJlck9mV2VlayA9IEFycmF5LmZyb20oQXJyYXkoX3dlZWtzQ291bnQpLmtleXMoKSk7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZXZWVrID0gdGhpcy5udW1iZXJPZldlZWsubWFwKCh2YWx1ZSkgPT4gdmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5pc1BpY2tlck1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF5SGVpZ2h0ID0gNDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXlIZWlnaHQgPSBNYXRoLmZsb29yKGNvbnRhaW5lckhlaWdodCAvIChfd2Vla3NDb3VudCArIDEpKTtcblxuICAgICAgICB0aGlzLm1heFRhc2tDb3VudCA9IE1hdGguZmxvb3IoKHRoaXMuZGF5SGVpZ2h0IC0gdGhpcy50YXNrSGVpZ2h0KSAvIHRoaXMudGFza0hlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLm1heFRhc2tDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubWF4Um93VGFza3MgPSBuZXcgQXJyYXkodGhpcy5tYXhUYXNrQ291bnQpLmZpbGwoMCkubWFwKCh4LCBpKSA9PiBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlRGF5c1Rhc2tzKGNhbGVuZGFyVGFza3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQaWNrZXJNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtUYXNrc0FycmF5ID0ge307XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYWxlbmRhckZpZWxkcyA9IHRoaXMuY2FsZW5kYXJGaWVsZHM7XG5cbiAgICAgICAgLy8gU29ydCBhbGwgVGFza3NcbiAgICAgICAgY29uc3QgbW9EYXRhTGlzdCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5zb3J0VGFza3MoY2FsZW5kYXJUYXNrcywgY2FsZW5kYXJGaWVsZHMpO1xuICAgICAgICB0aGlzLmRheXMuZm9yRWFjaCgoZGF5KSA9PiAoZGF5LnRhc2tzID0gW10pKTtcbiAgICAgICAgY29uc3Qgd2Vla1Rhc2tzQXJyYXk6IGFueSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZGF5cy5sZW5ndGggLyA3OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLmRheXNJbldlZWsudHJhbnNmb3JtKHRoaXMuZGF5cywgaik7XG4gICAgICAgICAgICBjb25zdCB3ZWVrID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmNyZWF0ZVdlZWtUYXNrKGRheXMsIG1vRGF0YUxpc3QsIGNhbGVuZGFyRmllbGRzLCAwKTtcbiAgICAgICAgICAgIHdlZWtUYXNrc0FycmF5LnB1c2god2Vlayk7XG4gICAgICAgIH1cblxuICAgICAgICB3ZWVrVGFza3NBcnJheS5mb3JFYWNoKCh3ZWVrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcnI6IGFueVtdID0gT2JqZWN0LnZhbHVlcyh3ZWVrKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoOyBpIDwgdGhpcy5tYXhUYXNrQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHdlZWtbaS50b1N0cmluZygpXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8g2KjZhyDYp9iy2KfbjCDZh9ixINix2K/bjNmBINiq2LPaqSDYqNin24zYryDYqti52K/Yp9ivIDcg2LPYqtmI2YYg2KfYttin2YHZhyDar9ix2K/YryDZiCDYqNix2KfbjCDYs9iq2YjZhtuMINqp2Ycg2KrYs9qp24wg2YbYr9in2LHYryDbjNqpINis2KfbjCDYrtin2YTbjCBjb2xzcGFuIDEg2YXbjNqv2LDYp9ix24zZhVxuICAgICAgICB3ZWVrVGFza3NBcnJheS5mb3JFYWNoKCh3ZWVrKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZmlsbFdlZWsod2Vlayk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndlZWtUYXNrc0FycmF5ID0gd2Vla1Rhc2tzQXJyYXk7XG4gICAgfVxufVxuIiwiPHRhYmxlIGZkLXRhYmxlIGNsYXNzPVwidGFibGUtaGVhZGVyXCIgW2NvbXBhY3RdPVwidHJ1ZVwiIFthdHRyLnBpY2tlcl09XCJkYXRlUGlja2VyXCI+XG4gICAgPHRoZWFkIGZkLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgPHRyIGZkLXRhYmxlLXJvdz5cbiAgICAgICAgICAgIDx0aFxuICAgICAgICAgICAgICAgIGNsYXNzPVwid2Vla2RheS1oZWFkZXJcIlxuICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB3ZWVrRGF5IG9mIHNlbGVjdGVkV2Vla0RheXNcIlxuICAgICAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcbiAgICAgICAgICAgICAgICBbY2xhc3Mubm9ib3JkZXJdPVwiaXNQaWNrZXJNb2RlXCJcbiAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICB7eyB3ZWVrRGF5IH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5IGZkLXRhYmxlLWJvZHk+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IHdlZWtEYXkgb2YgbnVtYmVyT2ZXZWVrXCI+XG4gICAgICAgICAgICA8dHIgZmQtdGFibGUtcm93PlxuICAgICAgICAgICAgICAgIDx0ZFxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuaGVpZ2h0LnB4XT1cImRheUhlaWdodFwiXG4gICAgICAgICAgICAgICAgICAgIGZkLXRhYmxlLWNlbGxcbiAgICAgICAgICAgICAgICAgICAgY29sc3Bhbj1cIjdcIlxuICAgICAgICAgICAgICAgICAgICBbc3R5bGUuYm9yZGVyXT1cImlzUGlja2VyTW9kZSA/ICdub25lJyA6IG51bGxcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5kZXJUYXNrcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogaXNQaWNrZXJNb2RlID8gbnVsbCA6IG1vRGF0YUxpc3Rbd2Vla0RheV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtJbmRleDogd2Vla0RheSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5czogZGF5cyB8IGRheXNJbldlZWs6IHdlZWtEYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd1Rhc2tzOiBtYXhSb3dUYXNrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckZpZWxkczogY2FsZW5kYXJGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ0bDogcnRsLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BpY2tlck1vZGU6IGlzUGlja2VyTW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC90Ym9keT5cbjwvdGFibGU+XG48bmctdGVtcGxhdGVcbiAgICAjcmVuZGVyVGFza3NcbiAgICBsZXQtdGFza1xuICAgIGxldC13ZWVrSW5kZXg9XCJ3ZWVrSW5kZXhcIlxuICAgIGxldC13ZWVrRGF5cz1cIndlZWtEYXlzXCJcbiAgICBsZXQtZGF5cz1cImRheXNcIlxuICAgIGxldC1tYXhSb3dUYXNrcz1cIm1heFJvd1Rhc2tzXCJcbiAgICBsZXQtY2FsZW5kYXJGaWVsZHM9XCJjYWxlbmRhckZpZWxkc1wiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtcnRsPVwicnRsXCJcbiAgICBsZXQtaXNQaWNrZXJNb2RlPVwiaXNQaWNrZXJNb2RlXCJcbj5cbiAgICA8dGFibGUgZmQtdGFibGUtYm9keSBjbGFzcz1cInRhYmxlLWNvbnRlbnRcIiBbY29tcGFjdF09XCJ0cnVlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3cgY2xhc3M9XCJyb3ctZGF5LW51bWJlclwiIFthdHRyLnJ0bF09XCJydGxcIj5cbiAgICAgICAgICAgICAgICA8dGQgZmQtdGFibGUtY2VsbCAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNcIiBbY2xhc3Mubm9ib3JkZXJdPVwiaXNQaWNrZXJNb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxiYy1kYXktbnVtYmVyLWJveFxuICAgICAgICAgICAgICAgICAgICAgICAgW2NsYXNzLmZkLWNhbGVuZGFyX19pdGVtXT1cImlzUGlja2VyTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLW90aGVyLW1vbnRoXT1cImlzUGlja2VyTW9kZSAmJiAhZGF5LmlzSW5Nb250aFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2xhc3MuZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmRdPVwiaXNQaWNrZXJNb2RlICYmIGRheS5pc1dlZWtlbmRcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzUGlja2VyTW9kZV09XCJpc1BpY2tlck1vZGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RheV09XCJkYXlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2lzQWN0aXZlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pbmRleCA9PT0gc3RhcnRTZWxlY3RlZERheUluZGV4IHx8IGRheS5pbmRleCA9PT0gZW5kU2VsZWN0ZWREYXlJbmRleCB8fCBkYXkuZGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGVxdWFsRGF0ZTogc2VsZWN0ZWREYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2l0ZW1JblJhbmdlXT1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0U2VsZWN0ZWREYXlJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kU2VsZWN0ZWREYXlJbmRleCAhPT0gdW5kZWZpbmVkICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmluZGV4ID49IHN0YXJ0U2VsZWN0ZWREYXlJbmRleCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pbmRleCA8PSBlbmRTZWxlY3RlZERheUluZGV4XG4gICAgICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF5TW91c2VNb3ZlKT1cIm9uRGF5TW91c2VNb3ZlKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRheU1vdXNlRG93bik9XCJvbkRheU1vdXNlRG93bihkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlNb3VzZVVwKT1cIm9uRGF5TW91c2VVcChkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgPjwvYmMtZGF5LW51bWJlci1ib3g+XG4gICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIWlzUGlja2VyTW9kZVwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlckRheVRhc2tzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogd2Vla1Rhc2tzQXJyYXlbd2Vla0luZGV4XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dUYXNrczogbWF4Um93VGFza3MsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0luZGV4OiB3ZWVrSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckZpZWxkczogY2FsZW5kYXJGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzXG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3c+XG4gICAgICAgICAgICAgICAgICAgIDx0ZCBmZC10YWJsZS1jZWxsICpuZ0Zvcj1cImxldCBkYXkgb2YgZGF5c1wiIGNsYXNzPVwibW9yZS1mZFwiIChjbGljayk9XCJvbkRheUJveFNlbGVjdChkYXkpXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwibWF4Um93VGFza3M/Lmxlbmd0aCA8IGRheS50YXNrcy5sZW5ndGhcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZkLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwib25Nb3JlQnV0dG9uKCRldmVudCwgcG9wb3ZlcilcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY29tcGFjdF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheS50YXNrcz8ubGVuZ3RoIC0gbWF4Um93VGFza3M/Lmxlbmd0aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7eyAnTW9yZScgfCBiYmJUcmFuc2xhdGUgfX1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZmQtcG9wb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjcG9wb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbW9iaWxlXT1cImRldmljZVNpemUgPT09ICdzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb2N1c1RyYXBwZWRdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtmb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cIm9uT3BlblBvcG92ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YmMtZGF5LWV2ZW50LWxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXldPVwiZGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYWxlbmRhckZpZWxkc109XCJjYWxlbmRhckZpZWxkc1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWVrRGF5c109XCJ3ZWVrRGF5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcnRsXT1cInJ0bFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuRGVsZXRlXT1cImNhbkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuRWRpdF09XCJjYW5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtwb3BvdmVyXT1cInBvcG92ZXJcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZUV2ZW50KT1cImRlbGV0ZUV2ZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRpdEV2ZW50KT1cImVkaXRFdmVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA+PC9iYy1kYXktZXZlbnQtbGlzdD5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2ZkLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgICAgICAgICA8L3RyPlxuICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNyZW5kZXJEYXlUYXNrc1xuICAgIGxldC13ZWVrVGFza3NcbiAgICBsZXQtbWF4Um93VGFza3M9XCJtYXhSb3dUYXNrc1wiXG4gICAgbGV0LXdlZWtJbmRleD1cIndlZWtJbmRleFwiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtY2FsZW5kYXJGaWVsZHM9XCJjYWxlbmRhckZpZWxkc1wiXG4gICAgbGV0LXdlZWtEYXlzPVwid2Vla0RheXNcIlxuPlxuICAgIDx0ciBmZC10YWJsZS1yb3cgKm5nRm9yPVwibGV0IHJvd1Rhc2sgb2YgbWF4Um93VGFza3M7IGxldCBpID0gaW5kZXhcIj5cbiAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdJZj1cIiF3ZWVrVGFza3NbaV0gfHwgd2Vla1Rhc2tzW2ldLmxlbmd0aCA9PT0gMFwiPlxuICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgKm5nRm9yPVwibGV0IGRheSBvZiB3ZWVrRGF5c1wiPjwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCB0YXNrIG9mIHdlZWtUYXNrc1tpXTsgbGV0IGRheUluZGV4ID0gaW5kZXhcIj5cbiAgICAgICAgICAgIDx0ZCBmZC10YWJsZS1jZWxsIFthdHRyLmNvbHNwYW5dPVwidGFzay5jb2xTcGFuXCIgKm5nSWY9XCJ0YXNrLmNvbFNwYW5cIj5cbiAgICAgICAgICAgICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwidGFzay5ldmVudDsgZWxzZSBuZXdEYXlTZWxlY3RcIj5cbiAgICAgICAgICAgICAgICAgICAgPGJjLWV2ZW50LWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgW3Rhc2tdPVwidGFza1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGaWVsZHNdPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2RldmljZVNpemVdPVwiZGV2aWNlU2l6ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbcnRsXT1cInJ0bFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuRGVsZXRlXT1cImNhbkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbY2FuRWRpdF09XCJjYW5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJkZWxldGVFdmVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGVkaXRFdmVudCk9XCJlZGl0RXZlbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChvcGVuUG9wb3ZlckNoYW5nZSk9XCJvbk9wZW5Qb3BvdmVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+PC9iYy1ldmVudC1idXR0b24+XG4gICAgICAgICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG5nLXRlbXBsYXRlICNuZXdEYXlTZWxlY3Q+XG4gICAgICAgICAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlXCIgKGNsaWNrKT1cIm9uRGF5U2VsZWN0KHdlZWtJbmRleCwgZGF5SW5kZXgpXCI+PC9kaXY+XG4gICAgICAgICAgICAgICAgPC9uZy10ZW1wbGF0ZT5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgIDwvdHI+XG48L25nLXRlbXBsYXRlPlxuIl19
|
|
@@ -0,0 +1,193 @@
|
|
|
1
|
+
import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, Self } from '@angular/core';
|
|
2
|
+
import { distinctUntilChanged, map } from 'rxjs/operators';
|
|
3
|
+
import { BaseComponent, DateService, getDateService } from 'barsa-novin-ray-core';
|
|
4
|
+
import { CalendarService } from '../services/calendar.service';
|
|
5
|
+
import * as i0 from "@angular/core";
|
|
6
|
+
import * as i1 from "../services/calendar.service";
|
|
7
|
+
import * as i2 from "barsa-novin-ray-core";
|
|
8
|
+
import * as i3 from "@angular/common";
|
|
9
|
+
import * as i4 from "@fundamental-ngx/core/button";
|
|
10
|
+
import * as i5 from "@fundamental-ngx/core/popover";
|
|
11
|
+
import * as i6 from "@fundamental-ngx/core/toolbar";
|
|
12
|
+
import * as i7 from "@fundamental-ngx/platform/button";
|
|
13
|
+
import * as i8 from "../calendar-month/calendar-month.component";
|
|
14
|
+
export class CalendarSelectionDaysComponent extends BaseComponent {
|
|
15
|
+
constructor(_calendarService, _portalService) {
|
|
16
|
+
super();
|
|
17
|
+
this._calendarService = _calendarService;
|
|
18
|
+
this.rangeChange = new EventEmitter();
|
|
19
|
+
this.selectionMode = 'day';
|
|
20
|
+
this.months = [];
|
|
21
|
+
this._isMouseDown = false;
|
|
22
|
+
this.rtl$ = _portalService.rtl$;
|
|
23
|
+
this.width$ = _portalService.deviceSize$.pipe(distinctUntilChanged(), map((deviceSize) => {
|
|
24
|
+
switch (deviceSize) {
|
|
25
|
+
case 'l':
|
|
26
|
+
case 'xl':
|
|
27
|
+
return 480;
|
|
28
|
+
case 's':
|
|
29
|
+
return 320;
|
|
30
|
+
default:
|
|
31
|
+
return 480;
|
|
32
|
+
}
|
|
33
|
+
}));
|
|
34
|
+
this.weekDaysMin = this._calendarService.weekDaysMin();
|
|
35
|
+
this.weekDays = this._calendarService.weekDays();
|
|
36
|
+
this.selectedMonth$ = this._calendarService.selected$;
|
|
37
|
+
this.today = this._calendarService.today;
|
|
38
|
+
this.months = this._calendarService.Months;
|
|
39
|
+
this._prepareYear(this._calendarService.selectedMonth.dateInfo.year);
|
|
40
|
+
}
|
|
41
|
+
ngOnChanges(changes) {
|
|
42
|
+
super.ngOnChanges(changes);
|
|
43
|
+
const { monthInfo } = changes;
|
|
44
|
+
if (monthInfo) {
|
|
45
|
+
this._calendarService.loadCalendarMonthInfo(monthInfo.currentValue);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
onMonthSelected(monthName, index) {
|
|
49
|
+
this._calendarService.gotoMonth(monthName, index);
|
|
50
|
+
}
|
|
51
|
+
onYearSelected(year) {
|
|
52
|
+
this._calendarService.gotoYear(+year);
|
|
53
|
+
}
|
|
54
|
+
onPrevTap() {
|
|
55
|
+
if (this.selectionMode === 'day') {
|
|
56
|
+
this._calendarService.loadPrevious();
|
|
57
|
+
}
|
|
58
|
+
else if (this.selectionMode === 'month') {
|
|
59
|
+
this._calendarService.loadPrevYear();
|
|
60
|
+
}
|
|
61
|
+
else if (this.selectionMode === 'year') {
|
|
62
|
+
this._prepareYear(Number(this.years[0]) - 20);
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
onNextTap() {
|
|
66
|
+
if (this.selectionMode === 'day') {
|
|
67
|
+
this._calendarService.loadNext();
|
|
68
|
+
}
|
|
69
|
+
else if (this.selectionMode === 'month') {
|
|
70
|
+
this._calendarService.loadNextYear();
|
|
71
|
+
}
|
|
72
|
+
else if (this.selectionMode === 'year') {
|
|
73
|
+
this._prepareYear(Number(this.years[this.years.length - 1]) + 1);
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
onToday() {
|
|
77
|
+
this._calendarService.gotoToday();
|
|
78
|
+
}
|
|
79
|
+
onDayMouseMove(day, monthInfo) {
|
|
80
|
+
if (this._isMouseDown) {
|
|
81
|
+
const { endDay, startDay } = this.getStartAndEndDay(monthInfo, day);
|
|
82
|
+
this.startSelectedDayIndex = startDay?.index;
|
|
83
|
+
this.endSelectedDayIndex = endDay?.index;
|
|
84
|
+
console.log('-move-', this.startSelectedDay?.index, this.endSelectedDay?.index);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
onDayMouseDown(day) {
|
|
88
|
+
this._isMouseDown = true;
|
|
89
|
+
this.startSelectedDay = null;
|
|
90
|
+
this.endSelectedDay = null;
|
|
91
|
+
this.startSelectedDay = day;
|
|
92
|
+
this.startSelectedDayIndex = day.index;
|
|
93
|
+
}
|
|
94
|
+
onDayMouseUp(day, monthInfo, popover) {
|
|
95
|
+
this._isMouseDown = false;
|
|
96
|
+
const { endDay, startDay } = this.getStartAndEndDay(monthInfo, day);
|
|
97
|
+
this.startSelectedDay = startDay;
|
|
98
|
+
this.endSelectedDay = endDay;
|
|
99
|
+
this._setFirstAndEndDay(monthInfo, popover);
|
|
100
|
+
}
|
|
101
|
+
onDayClick(day, monthInfo, popover) {
|
|
102
|
+
this.startSelectedDay = this.endSelectedDay = day;
|
|
103
|
+
this._setFirstAndEndDay(monthInfo, popover);
|
|
104
|
+
}
|
|
105
|
+
_prepareYear(from) {
|
|
106
|
+
const years = [];
|
|
107
|
+
for (let i = 0; i < 20; i++) {
|
|
108
|
+
years.push(`${from + i}`);
|
|
109
|
+
}
|
|
110
|
+
this.years = years;
|
|
111
|
+
}
|
|
112
|
+
getStartAndEndDay(monthInfo, day) {
|
|
113
|
+
let startDay = null;
|
|
114
|
+
let endDay = null;
|
|
115
|
+
if (this.startSelectedDay && !this.endSelectedDay) {
|
|
116
|
+
if (day && this.startSelectedDay.date > day.date) {
|
|
117
|
+
startDay = day;
|
|
118
|
+
endDay = this.startSelectedDay;
|
|
119
|
+
}
|
|
120
|
+
else {
|
|
121
|
+
startDay = this.startSelectedDay;
|
|
122
|
+
endDay = day;
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
else if (this.startSelectedDay && this.endSelectedDay) {
|
|
126
|
+
if (day && this.startSelectedDay.date < day.date) {
|
|
127
|
+
startDay = this.startSelectedDay;
|
|
128
|
+
endDay = day;
|
|
129
|
+
}
|
|
130
|
+
else {
|
|
131
|
+
startDay = day;
|
|
132
|
+
endDay = this.endSelectedDay;
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
console.log('-2-', startDay, endDay);
|
|
136
|
+
if (startDay && endDay) {
|
|
137
|
+
const diff = Math.abs(startDay.momentOfDate.diff(endDay.momentOfDate, 'day'));
|
|
138
|
+
if (diff > 6) {
|
|
139
|
+
startDay = monthInfo.days[Math.floor(startDay.index / 7) * 7];
|
|
140
|
+
// const end = endDay.index % 7;
|
|
141
|
+
const indexEnd = Math.ceil((endDay.index + 1) / 7);
|
|
142
|
+
// if (end > 0) {
|
|
143
|
+
// indexEnd++;
|
|
144
|
+
// }
|
|
145
|
+
endDay = monthInfo.days[indexEnd * 7 - 1];
|
|
146
|
+
console.log('-3-', startDay, endDay);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
return { endDay, startDay };
|
|
150
|
+
}
|
|
151
|
+
_setFirstAndEndDay(monthInfo, popover) {
|
|
152
|
+
console.log('-finish-', this.startSelectedDay, this.endSelectedDay);
|
|
153
|
+
if (this.startSelectedDay && this.endSelectedDay) {
|
|
154
|
+
if (popover) {
|
|
155
|
+
popover.close();
|
|
156
|
+
}
|
|
157
|
+
this.rangeChange.emit({
|
|
158
|
+
startDay: this.startSelectedDay,
|
|
159
|
+
endDay: this.endSelectedDay,
|
|
160
|
+
monthInfo
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
CalendarSelectionDaysComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: CalendarSelectionDaysComponent, deps: [{ token: i1.CalendarService, self: true }, { token: i2.PortalService }], target: i0.ɵɵFactoryTarget.Component });
|
|
166
|
+
CalendarSelectionDaysComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.2.7", type: CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: { startSelectedDayIndex: "startSelectedDayIndex", endSelectedDayIndex: "endSelectedDayIndex", monthInfo: "monthInfo" }, outputs: { rangeChange: "rangeChange" }, providers: [
|
|
167
|
+
{
|
|
168
|
+
provide: DateService,
|
|
169
|
+
useFactory: getDateService
|
|
170
|
+
},
|
|
171
|
+
CalendarService
|
|
172
|
+
], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<fdp-button glyph=\"calendar\" buttonType=\"transparent\" [fdPopoverTrigger]=\"popover\"></fdp-button>\n<fd-popover #popover [focusTrapped]=\"true\" [focusAutoCapture]=\"true\" [mobile]=\"(deviceSize$ | async) === 's'\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize$ | async,\n popover: popover\n }\n \"\n >\n </ng-container>\n </fd-popover-body>\n</fd-popover>\n\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n>\n <fd-toolbar [fdType]=\"'transparent'\">\n <fdp-button fd-toolbar-item [label]=\"'DateR_Today' | bbbTranslate\" (click)=\"onToday()\"></fdp-button>\n <fdp-button\n buttonType=\"transparent\"\n fd-toolbar-item\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></fdp-button>\n <fdp-button\n buttonType=\"transparent\"\n fd-toolbar-item\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></fdp-button>\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n <button\n *ngIf=\"selectionMode === 'day' || selectionMode === 'month'\"\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n </fd-toolbar>\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"'month'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 33%\"\n *ngFor=\"let month of months; let i = index\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 25%\"\n *ngFor=\"let year of years\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n </div>\n </ng-container>\n <bc-calendar-month\n *ngSwitchDefault\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"6\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, selectedMonth, popover)\"\n (dayMouseMove)=\"onDayMouseMove($event, selectedMonth)\"\n (dayMouseUp)=\"onDayMouseUp($event, selectedMonth, popover)\"\n (dayMouseDown)=\"onDayMouseDown($event)\"\n [startSelectedDayIndex]=\"startSelectedDayIndex\"\n [endSelectedDayIndex]=\"endSelectedDayIndex\"\n ></bc-calendar-month>\n </ng-container>\n</ng-template>\n", styles: [""], 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: "directive", type: i3.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i3.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i3.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i4.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i5.PopoverBodyComponent, selector: "fd-popover-body" }, { kind: "component", type: i5.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig"] }, { kind: "directive", type: i5.PopoverTriggerDirective, selector: "[fdPopoverTrigger], [fd-popover-trigger]", inputs: ["fdPopoverTrigger"] }, { kind: "component", type: i6.ToolbarComponent, selector: "fd-toolbar", inputs: ["class", "shouldOverflow", "fdType", "hasTitle", "title", "active", "clearBorder", "forceOverflow", "tabindex"] }, { kind: "directive", type: i6.ToolbarItemDirective, selector: "[fd-toolbar-item]" }, { kind: "component", type: i7.ButtonComponent, selector: "fdp-button", inputs: ["glyphPosition", "label", "glyph", "buttonType", "title", "ariaSelected", "ariaDisabled", "ariaExpanded", "ariaControlsId", "ariaPressed", "name", "type", "value"], outputs: ["buttonClicked"] }, { kind: "component", type: i8.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i2.BbbTranslatePipe, name: "bbbTranslate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush });
|
|
173
|
+
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.2.7", ngImport: i0, type: CalendarSelectionDaysComponent, decorators: [{
|
|
174
|
+
type: Component,
|
|
175
|
+
args: [{ selector: 'bc-calendar-selection-days', changeDetection: ChangeDetectionStrategy.OnPush, providers: [
|
|
176
|
+
{
|
|
177
|
+
provide: DateService,
|
|
178
|
+
useFactory: getDateService
|
|
179
|
+
},
|
|
180
|
+
CalendarService
|
|
181
|
+
], template: "<fdp-button glyph=\"calendar\" buttonType=\"transparent\" [fdPopoverTrigger]=\"popover\"></fdp-button>\n<fd-popover #popover [focusTrapped]=\"true\" [focusAutoCapture]=\"true\" [mobile]=\"(deviceSize$ | async) === 's'\">\n <fd-popover-body [style.width.px]=\"width$ | async\">\n <ng-container\n *ngTemplateOutlet=\"\n month;\n context: {\n $implicit: selectedMonth$ | async,\n width: width$ | async,\n height: height,\n rtl: rtl$ | async,\n weekDays: weekDays,\n weekDaysMin: weekDaysMin,\n today: today,\n deviceSize: deviceSize$ | async,\n popover: popover\n }\n \"\n >\n </ng-container>\n </fd-popover-body>\n</fd-popover>\n\n<ng-template\n #month\n let-selectedMonth\n let-width=\"width\"\n let-height=\"height\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-popover=\"popover\"\n>\n <fd-toolbar [fdType]=\"'transparent'\">\n <fdp-button fd-toolbar-item [label]=\"'DateR_Today' | bbbTranslate\" (click)=\"onToday()\"></fdp-button>\n <fdp-button\n buttonType=\"transparent\"\n fd-toolbar-item\n [glyph]=\"rtl ? 'navigation-right-arrow' : 'navigation-left-arrow'\"\n (click)=\"onPrevTap()\"\n ></fdp-button>\n <fdp-button\n buttonType=\"transparent\"\n fd-toolbar-item\n [glyph]=\"rtl ? 'navigation-left-arrow' : 'navigation-right-arrow'\"\n (click)=\"onNextTap()\"\n ></fdp-button>\n <div class=\"month-years-wrapper\" fd-title fd-toolbar-item>\n <button\n *ngIf=\"selectionMode === 'day' || selectionMode === 'month'\"\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.monthName\"\n (click)=\"selectionMode = 'month'\"\n ></button>\n <button\n fd-button\n [fdType]=\"'transparent'\"\n [label]=\"selectedMonth.dateInfo.year\"\n (click)=\"selectionMode = 'year'\"\n ></button>\n </div>\n </fd-toolbar>\n <ng-container [ngSwitch]=\"selectionMode\">\n <ng-container *ngSwitchCase=\"'month'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 33%\"\n *ngFor=\"let month of months; let i = index\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.monthName === month ? 'emphasized' : 'transparent'\"\n [label]=\"month\"\n (click)=\"selectionMode = 'day'; onMonthSelected(month, i)\"\n ></button>\n </div>\n </ng-container>\n <ng-container *ngSwitchCase=\"'year'\">\n <div class=\"month-year-selection-wrapper\">\n <button\n style=\"flex-grow: 1; width: 25%\"\n *ngFor=\"let year of years\"\n fd-button\n [fdType]=\"selectedMonth.dateInfo.year === +year ? 'emphasized' : 'transparent'\"\n [label]=\"year\"\n (click)=\"selectionMode = 'day'; onYearSelected(year)\"\n ></button>\n </div>\n </ng-container>\n <bc-calendar-month\n *ngSwitchDefault\n [style.width]=\"width\"\n [containerHeight]=\"height\"\n [containerWidth]=\"width\"\n [rtl]=\"rtl\"\n [monthWeeksCount]=\"6\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [datePicker]=\"true\"\n [dateRange]=\"true\"\n [days]=\"selectedMonth.days\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event, selectedMonth, popover)\"\n (dayMouseMove)=\"onDayMouseMove($event, selectedMonth)\"\n (dayMouseUp)=\"onDayMouseUp($event, selectedMonth, popover)\"\n (dayMouseDown)=\"onDayMouseDown($event)\"\n [startSelectedDayIndex]=\"startSelectedDayIndex\"\n [endSelectedDayIndex]=\"endSelectedDayIndex\"\n ></bc-calendar-month>\n </ng-container>\n</ng-template>\n" }]
|
|
182
|
+
}], ctorParameters: function () { return [{ type: i1.CalendarService, decorators: [{
|
|
183
|
+
type: Self
|
|
184
|
+
}] }, { type: i2.PortalService }]; }, propDecorators: { startSelectedDayIndex: [{
|
|
185
|
+
type: Input
|
|
186
|
+
}], endSelectedDayIndex: [{
|
|
187
|
+
type: Input
|
|
188
|
+
}], monthInfo: [{
|
|
189
|
+
type: Input
|
|
190
|
+
}], rangeChange: [{
|
|
191
|
+
type: Output
|
|
192
|
+
}] } });
|
|
193
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItc2VsZWN0aW9uLWRheXMuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci1zZWxlY3Rpb24tZGF5cy9jYWxlbmRhci1zZWxlY3Rpb24tZGF5cy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLXNlbGVjdGlvbi1kYXlzL2NhbGVuZGFyLXNlbGVjdGlvbi1kYXlzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFDdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLElBQUksRUFFUCxNQUFNLGVBQWUsQ0FBQztBQUV2QixPQUFPLEVBQUUsb0JBQW9CLEVBQUUsR0FBRyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0QsT0FBTyxFQUFFLGFBQWEsRUFBRSxXQUFXLEVBQUUsY0FBYyxFQUFpQixNQUFNLHNCQUFzQixDQUFDO0FBRWpHLE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQzs7Ozs7Ozs7OztBQWMvRCxNQUFNLE9BQU8sOEJBQStCLFNBQVEsYUFBYTtJQXdCN0QsWUFBNEIsZ0JBQWlDLEVBQUUsY0FBNkI7UUFDeEYsS0FBSyxFQUFFLENBQUM7UUFEZ0IscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFpQjtRQXBCbkQsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFJcEMsQ0FBQztRQUNMLGtCQUFhLEdBQTZCLEtBQUssQ0FBQztRQVloRCxXQUFNLEdBQWEsRUFBRSxDQUFDO1FBRWQsaUJBQVksR0FBRyxLQUFLLENBQUM7UUFHekIsSUFBSSxDQUFDLElBQUksR0FBRyxjQUFjLENBQUMsSUFBSSxDQUFDO1FBQ2hDLElBQUksQ0FBQyxNQUFNLEdB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VUFBVSxFQUFFLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxJQUFJLENBQUMsY0FBYyxDQUFDLENBQUM7UUFDcEUsSUFBSSxJQUFJLENBQUMsZ0JBQWdCLElBQUksSUFBSSxDQUFDLGNBQWMsRUFBRTtZQUM5QyxJQUFJLE9BQU8sRUFBRTtnQkFDVCxPQUFPLENBQUMsS0FBSyxFQUFFLENBQUM7YUFDbkI7WUFDRCxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQztnQkFDbEIsUUFBUSxFQUFFLElBQUksQ0FBQyxnQkFBZ0I7Z0JBQy9CLE1BQU0sRUFBRSxJQUFJLENBQUMsY0FBYztnQkFDM0IsU0FBUzthQUNaLENBQUMsQ0FBQztTQUNOO0lBQ0wsQ0FBQzs7MkhBN0tRLDhCQUE4QjsrR0FBOUIsOEJBQThCLDhOQVI1QjtRQUNQO1lBQ0ksT0FBTyxFQUFFLFdBQVc7WUFDcEIsVUFBVSxFQUFFLGNBQWM7U0FDN0I7UUFDRCxlQUFlO0tBQ2xCLHNFQzFCTCwrOUlBZ0hBOzJGRHBGYSw4QkFBOEI7a0JBYjFDLFNBQVM7K0JBQ0ksNEJBQTRCLG1CQUdyQix1QkFBdUIsQ0FBQyxNQUFNLGFBQ3BDO3dCQUNQOzRCQUNJLE9BQU8sRUFBRSxXQUFXOzRCQUNwQixVQUFVLEVBQUUsY0FBYzt5QkFDN0I7d0JBQ0QsZUFBZTtxQkFDbEI7OzBCQTBCWSxJQUFJO3dFQXZCUixxQkFBcUI7c0JBQTdCLEtBQUs7Z0JBQ0csbUJBQW1CO3NCQUEzQixLQUFLO2dCQUNHLFNBQVM7c0JBQWpCLEtBQUs7Z0JBQ0ksV0FBVztzQkFBcEIsTUFBTSIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFNlbGYsXG4gICAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUgfSBmcm9tICdyeGpzJztcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XG5pbXBvcnQgeyBCYXNlQ29tcG9uZW50LCBEYXRlU2VydmljZSwgZ2V0RGF0ZVNlcnZpY2UsIFBvcnRhbFNlcnZpY2UgfSBmcm9tICdiYXJzYS1ub3Zpbi1yYXktY29yZSc7XG5pbXBvcnQgeyBDYWxlbmRhck1vbnRoSW5mbywgRGF5IH0gZnJvbSAnLi4vbW9kZWxzJztcbmltcG9ydCB7IENhbGVuZGFyU2VydmljZSB9IGZyb20gJy4uL3NlcnZpY2VzL2NhbGVuZGFyLnNlcnZpY2UnO1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5cycsXG4gICAgdGVtcGxhdGVVcmw6ICcuL2NhbGVuZGFyLXNlbGVjdGlvbi1kYXlzLmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jYWxlbmRhci1zZWxlY3Rpb24tZGF5cy5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRlU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldERhdGVTZXJ2aWNlXG4gICAgICAgIH0sXG4gICAgICAgIENhbGVuZGFyU2VydmljZVxuICAgIF1cbn0pXG5leHBvcnQgY2xhc3MgQ2FsZW5kYXJTZWxlY3Rpb25EYXlzQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgc3RhcnRTZWxlY3RlZERheUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgQElucHV0KCkgZW5kU2VsZWN0ZWREYXlJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIG1vbnRoSW5mbzogQ2FsZW5kYXJNb250aEluZm87XG4gICAgQE91dHB1dCgpIHJhbmdlQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjx7XG4gICAgICAgIHN0YXJ0RGF5OiBEYXk7XG4gICAgICAgIGVuZERheTogRGF5O1xuICAgICAgICBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvO1xuICAgIH0+KCk7XG4gICAgc2VsZWN0aW9uTW9kZTogJ2RheScgfCAnbW9udGgnIHwgJ3llYXInID0gJ2RheSc7XG5cbiAgICBlbmRTZWxlY3RlZERheTogRGF5IHwgbnVsbDtcbiAgICBzdGFydFNlbGVjdGVkRGF5OiBEYXkgfCBudWxsO1xuICAgIHdpZHRoJDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIGhlaWdodDogbnVtYmVyO1xuICAgIHNlbGVjdGVkTW9udGgkOiBPYnNlcnZhYmxlPENhbGVuZGFyTW9udGhJbmZvPjtcbiAgICBydGwkOiBPYnNlcnZhYmxlPGJvb2xlYW4+O1xuICAgIHRvZGF5OiBEYXRlO1xuICAgIHdlZWtEYXlzTWluOiBzdHJpbmdbXTtcbiAgICB3ZWVrRGF5czogc3RyaW5nW107XG4gICAgZGV2aWNlU2l6ZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBtb250aHM6IHN0cmluZ1tdID0gW107XG4gICAgeWVhcnM6IHN0cmluZ1tdO1xuICAgIHByaXZhdGUgX2lzTW91c2VEb3duID0gZmFsc2U7XG4gICAgY29uc3RydWN0b3IoQFNlbGYoKSBwcml2YXRlIF9jYWxlbmRhclNlcnZpY2U6IENhbGVuZGFyU2VydmljZSwgX3BvcnRhbFNlcnZpY2U6IFBvcnRhbFNlcnZpY2UpIHtcbiAgICAgICAgc3VwZXIoKTtcbiAgICAgICAgdGhpcy5ydGwkID0gX3BvcnRhbFNlcnZpY2UucnRsJDtcbiAgICAgICAgdGhpcy53aWR0aCQgPSBfcG9ydGFsU2VydmljZS5kZXZpY2VTaXplJC5waXBlKFxuICAgICAgICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKSxcbiAgICAgICAgICAgIG1hcCgoZGV2aWNlU2l6ZSkgPT4ge1xuICAgICAgICAgICAgICAgIHN3aXRjaCAoZGV2aWNlU2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzpcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAneGwnOlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ4MDtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAncyc6XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMzIwO1xuICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OlxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDQ4MDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuICAgICAgICB0aGlzLndlZWtEYXlzTWluID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzTWluKCk7XG4gICAgICAgIHRoaXMud2Vla0RheXMgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla0RheXMoKTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoJCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZWxlY3RlZCQ7XG4gICAgICAgIHRoaXMudG9kYXkgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2UudG9kYXk7XG4gICAgICAgIHRoaXMubW9udGhzID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLk1vbnRocztcbiAgICAgICAgdGhpcy5fcHJlcGFyZVllYXIodGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNlbGVjdGVkTW9udGguZGF0ZUluZm8ueWVhcik7XG4gICAgfVxuXG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgY29uc3QgeyBtb250aEluZm8gfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmIChtb250aEluZm8pIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkQ2FsZW5kYXJNb250aEluZm8obW9udGhJbmZvLmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgb25Nb250aFNlbGVjdGVkKG1vbnRoTmFtZTogc3RyaW5nLCBpbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5nb3RvTW9udGgobW9udGhOYW1lLCBpbmRleCk7XG4gICAgfVxuICAgIG9uWWVhclNlbGVjdGVkKHllYXI6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1llYXIoK3llYXIpO1xuICAgIH1cblxuICAgIG9uUHJldlRhcCgpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uTW9kZSA9PT0gJ2RheScpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkUHJldmlvdXMoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICdtb250aCcpIHtcbiAgICAgICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkUHJldlllYXIoKTtcbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnNlbGVjdGlvbk1vZGUgPT09ICd5ZWFyJykge1xuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZVllYXIoTnVtYmVyKHRoaXMueWVhcnNbMF0pIC0gMjApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgb25OZXh0VGFwKCk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnZGF5Jykge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmxvYWROZXh0KCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UubG9hZE5leHRZZWFyKCk7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5zZWxlY3Rpb25Nb2RlID09PSAneWVhcicpIHtcbiAgICAgICAgICAgIHRoaXMuX3ByZXBhcmVZZWFyKE51bWJlcih0aGlzLnllYXJzW3RoaXMueWVhcnMubGVuZ3RoIC0gMV0pICsgMSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvblRvZGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuICAgIG9uRGF5TW91c2VNb3ZlKGRheTogRGF5LCBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLl9pc01vdXNlRG93bikge1xuICAgICAgICAgICAgY29uc3QgeyBlbmREYXksIHN0YXJ0RGF5IH0gPSB0aGlzLmdldFN0YXJ0QW5kRW5kRGF5KG1vbnRoSW5mbywgZGF5KTtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheUluZGV4ID0gc3RhcnREYXk/LmluZGV4O1xuICAgICAgICAgICAgdGhpcy5lbmRTZWxlY3RlZERheUluZGV4ID0gZW5kRGF5Py5pbmRleDtcbiAgICAgICAgICAgIGNvbnNvbGUubG9nKCctbW92ZS0nLCB0aGlzLnN0YXJ0U2VsZWN0ZWREYXk/LmluZGV4LCB0aGlzLmVuZFNlbGVjdGVkRGF5Py5pbmRleCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBvbkRheU1vdXNlRG93bihkYXk6IERheSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc01vdXNlRG93biA9IHRydWU7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IG51bGw7XG4gICAgICAgIHRoaXMuZW5kU2VsZWN0ZWREYXkgPSBudWxsO1xuICAgICAgICB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgPSBkYXk7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheUluZGV4ID0gZGF5LmluZGV4O1xuICAgIH1cbiAgICBvbkRheU1vdXNlVXAoZGF5OiBEYXksIG1vbnRoSW5mbywgcG9wb3Zlcik6IHZvaWQge1xuICAgICAgICB0aGlzLl9pc01vdXNlRG93biA9IGZhbHNlO1xuXG4gICAgICAgIGNvbnN0IHsgZW5kRGF5LCBzdGFydERheSB9ID0gdGhpcy5nZXRTdGFydEFuZEVuZERheShtb250aEluZm8sIGRheSk7XG4gICAgICAgIHRoaXMuc3RhcnRTZWxlY3RlZERheSA9IHN0YXJ0RGF5O1xuICAgICAgICB0aGlzLmVuZFNlbGVjdGVkRGF5ID0gZW5kRGF5O1xuICAgICAgICB0aGlzLl9zZXRGaXJzdEFuZEVuZERheShtb250aEluZm8sIHBvcG92ZXIpO1xuICAgIH1cbiAgICBvbkRheUNsaWNrKGRheTogRGF5LCBtb250aEluZm8sIHBvcG92ZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zdGFydFNlbGVjdGVkRGF5ID0gdGhpcy5lbmRTZWxlY3RlZERheSA9IGRheTtcbiAgICAgICAgdGhpcy5fc2V0Rmlyc3RBbmRFbmREYXkobW9udGhJbmZvLCBwb3BvdmVyKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfcHJlcGFyZVllYXIoZnJvbTogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHllYXJzOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IDIwOyBpKyspIHtcbiAgICAgICAgICAgIHllYXJzLnB1c2goYCR7ZnJvbSArIGl9YCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy55ZWFycyA9IHllYXJzO1xuICAgIH1cbiAgICBwcml2YXRlIGdldFN0YXJ0QW5kRW5kRGF5KFxuICAgICAgICBtb250aEluZm86IENhbGVuZGFyTW9udGhJbmZvLFxuICAgICAgICBkYXk6IERheSB8IG51bGxcbiAgICApOiB7IGVuZERheTogRGF5IHwgbnVsbDsgc3RhcnREYXk6IERheSB8IG51bGwgfSB7XG4gICAgICAgIGxldCBzdGFydERheTogRGF5IHwgbnVsbCA9IG51bGw7XG4gICAgICAgIGxldCBlbmREYXk6IERheSB8IG51bGwgPSBudWxsO1xuICAgICAgICBpZiAodGhpcy5zdGFydFNlbGVjdGVkRGF5ICYmICF0aGlzLmVuZFNlbGVjdGVkRGF5KSB7XG4gICAgICAgICAgICBpZiAoZGF5ICYmIHRoaXMuc3RhcnRTZWxlY3RlZERheS5kYXRlID4gZGF5LmRhdGUpIHtcbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGRheTtcbiAgICAgICAgICAgICAgICBlbmREYXkgPSB0aGlzLnN0YXJ0U2VsZWN0ZWREYXk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0YXJ0RGF5ID0gdGhpcy5zdGFydFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgICAgIGVuZERheSA9IGRheTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh0aGlzLnN0YXJ0U2VsZWN0ZWREYXkgJiYgdGhpcy5lbmRTZWxlY3RlZERheSkge1xuICAgICAgICAgICAgaWYgKGRheSAmJiB0aGlzLnN0YXJ0U2VsZWN0ZWREYXkuZGF0ZSA8IGRheS5kYXRlKSB7XG4gICAgICAgICAgICAgICAgc3RhcnREYXkgPSB0aGlzLnN0YXJ0U2VsZWN0ZWREYXk7XG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gZGF5O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdGFydERheSA9IGRheTtcbiAgICAgICAgICAgICAgICBlbmREYXkgPSB0aGlzLmVuZFNlbGVjdGVkRGF5O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNvbnNvbGUubG9nKCctMi0nLCBzdGFydERheSwgZW5kRGF5KTtcbiAgICAgICAgaWYgKHN0YXJ0RGF5ICYmIGVuZERheSkge1xuICAgICAgICAgICAgY29uc3QgZGlmZiA9IE1hdGguYWJzKHN0YXJ0RGF5Lm1vbWVudE9mRGF0ZS5kaWZmKGVuZERheS5tb21lbnRPZkRhdGUsICdkYXknKSk7XG4gICAgICAgICAgICBpZiAoZGlmZiA+IDYpIHtcbiAgICAgICAgICAgICAgICBzdGFydERheSA9IG1vbnRoSW5mby5kYXlzW01hdGguZmxvb3Ioc3RhcnREYXkuaW5kZXggLyA3KSAqIDddO1xuICAgICAgICAgICAgICAgIC8vIGNvbnN0IGVuZCA9IGVuZERheS5pbmRleCAlIDc7XG4gICAgICAgICAgICAgICAgY29uc3QgaW5kZXhFbmQgPSBNYXRoLmNlaWwoKGVuZERheS5pbmRleCArIDEpIC8gNyk7XG4gICAgICAgICAgICAgICAgLy8gaWYgKGVuZCA+IDApIHtcbiAgICAgICAgICAgICAgICAvLyAgICAgaW5kZXhFbmQrKztcbiAgICAgICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAgICAgZW5kRGF5ID0gbW9udGhJbmZvLmRheXNbaW5kZXhFbmQgKiA3IC0gMV07XG4gICAgICAgICAgICAgICAgY29uc29sZS5sb2coJy0zLScsIHN0YXJ0RGF5LCBlbmREYXkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB7IGVuZERheSwgc3RhcnREYXkgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRGaXJzdEFuZEVuZERheShtb250aEluZm8sIHBvcG92ZXIpOiB2b2lkIHtcbiAgICAgICAgY29uc29sZS5sb2coJy1maW5pc2gtJywgdGhpcy5zdGFydFNlbGVjdGVkRGF5LCB0aGlzLmVuZFNlbGVjdGVkRGF5KTtcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRTZWxlY3RlZERheSAmJiB0aGlzLmVuZFNlbGVjdGVkRGF5KSB7XG4gICAgICAgICAgICBpZiAocG9wb3Zlcikge1xuICAgICAgICAgICAgICAgIHBvcG92ZXIuY2xvc2UoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmFuZ2VDaGFuZ2UuZW1pdCh7XG4gICAgICAgICAgICAgICAgc3RhcnREYXk6IHRoaXMuc3RhcnRTZWxlY3RlZERheSxcbiAgICAgICAgICAgICAgICBlbmREYXk6IHRoaXMuZW5kU2VsZWN0ZWREYXksXG4gICAgICAgICAgICAgICAgbW9udGhJbmZvXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIjxmZHAtYnV0dG9uIGdseXBoPVwiY2FsZW5kYXJcIiBidXR0b25UeXBlPVwidHJhbnNwYXJlbnRcIiBbZmRQb3BvdmVyVHJpZ2dlcl09XCJwb3BvdmVyXCI+PC9mZHAtYnV0dG9uPlxuPGZkLXBvcG92ZXIgI3BvcG92ZXIgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCIgW2ZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiIFttb2JpbGVdPVwiKGRldmljZVNpemUkIHwgYXN5bmMpID09PSAncydcIj5cbiAgICA8ZmQtcG9wb3Zlci1ib2R5IFtzdHlsZS53aWR0aC5weF09XCJ3aWR0aCQgfCBhc3luY1wiPlxuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5c01pbjogd2Vla0RheXNNaW4sXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgcG9wb3ZlcjogcG9wb3ZlclxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9mZC1wb3BvdmVyLWJvZHk+XG48L2ZkLXBvcG92ZXI+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNtb250aFxuICAgIGxldC1zZWxlY3RlZE1vbnRoXG4gICAgbGV0LXdpZHRoPVwid2lkdGhcIlxuICAgIGxldC1oZWlnaHQ9XCJoZWlnaHRcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC10b2RheT1cInRvZGF5XCJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxuICAgIGxldC1kZXZpY2VTaXplPVwiZGV2aWNlU2l6ZVwiXG4gICAgbGV0LXBvcG92ZXI9XCJwb3BvdmVyXCJcbj5cbiAgICA8ZmQtdG9vbGJhciBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIj5cbiAgICAgICAgPGZkcC1idXR0b24gZmQtdG9vbGJhci1pdGVtIFtsYWJlbF09XCInRGF0ZVJfVG9kYXknIHwgYmJiVHJhbnNsYXRlXCIgKGNsaWNrKT1cIm9uVG9kYXkoKVwiPjwvZmRwLWJ1dHRvbj5cbiAgICAgICAgPGZkcC1idXR0b25cbiAgICAgICAgICAgIGJ1dHRvblR5cGU9XCJ0cmFuc3BhcmVudFwiXG4gICAgICAgICAgICBmZC10b29sYmFyLWl0ZW1cbiAgICAgICAgICAgIFtnbHlwaF09XCJydGwgPyAnbmF2aWdhdGlvbi1yaWdodC1hcnJvdycgOiAnbmF2aWdhdGlvbi1sZWZ0LWFycm93J1wiXG4gICAgICAgICAgICAoY2xpY2spPVwib25QcmV2VGFwKClcIlxuICAgICAgICA+PC9mZHAtYnV0dG9uPlxuICAgICAgICA8ZmRwLWJ1dHRvblxuICAgICAgICAgICAgYnV0dG9uVHlwZT1cInRyYW5zcGFyZW50XCJcbiAgICAgICAgICAgIGZkLXRvb2xiYXItaXRlbVxuICAgICAgICAgICAgW2dseXBoXT1cInJ0bCA/ICduYXZpZ2F0aW9uLWxlZnQtYXJyb3cnIDogJ25hdmlnYXRpb24tcmlnaHQtYXJyb3cnXCJcbiAgICAgICAgICAgIChjbGljayk9XCJvbk5leHRUYXAoKVwiXG4gICAgICAgID48L2ZkcC1idXR0b24+XG4gICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFycy13cmFwcGVyXCIgZmQtdGl0bGUgZmQtdG9vbGJhci1pdGVtPlxuICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICpuZ0lmPVwic2VsZWN0aW9uTW9kZSA9PT0gJ2RheScgfHwgc2VsZWN0aW9uTW9kZSA9PT0gJ21vbnRoJ1wiXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby5tb250aE5hbWVcIlxuICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ21vbnRoJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW2ZkVHlwZV09XCIndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICBbbGFiZWxdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyXCJcbiAgICAgICAgICAgICAgICAoY2xpY2spPVwic2VsZWN0aW9uTW9kZSA9ICd5ZWFyJ1wiXG4gICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgIDwvZGl2PlxuICAgIDwvZmQtdG9vbGJhcj5cbiAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJzZWxlY3Rpb25Nb2RlXCI+XG4gICAgICAgIDxuZy1jb250YWluZXIgKm5nU3dpdGNoQ2FzZT1cIidtb250aCdcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdGlvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXgtZ3JvdzogMTsgd2lkdGg6IDMzJVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBtb250aCBvZiBtb250aHM7IGxldCBpID0gaW5kZXhcIlxuICAgICAgICAgICAgICAgICAgICBmZC1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgW2ZkVHlwZV09XCJzZWxlY3RlZE1vbnRoLmRhdGVJbmZvLm1vbnRoTmFtZSA9PT0gbW9udGggPyAnZW1waGFzaXplZCcgOiAndHJhbnNwYXJlbnQnXCJcbiAgICAgICAgICAgICAgICAgICAgW2xhYmVsXT1cIm1vbnRoXCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cInNlbGVjdGlvbk1vZGUgPSAnZGF5Jzsgb25Nb250aFNlbGVjdGVkKG1vbnRoLCBpKVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgIDwvbmctY29udGFpbmVyPlxuICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCIneWVhcidcIj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJtb250aC15ZWFyLXNlbGVjdGlvbi13cmFwcGVyXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBzdHlsZT1cImZsZXgtZ3JvdzogMTsgd2lkdGg6IDI1JVwiXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCB5ZWFyIG9mIHllYXJzXCJcbiAgICAgICAgICAgICAgICAgICAgZmQtYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIFtmZFR5cGVdPVwic2VsZWN0ZWRNb250aC5kYXRlSW5mby55ZWFyID09PSAreWVhciA/ICdlbXBoYXNpemVkJyA6ICd0cmFuc3BhcmVudCdcIlxuICAgICAgICAgICAgICAgICAgICBbbGFiZWxdPVwieWVhclwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJzZWxlY3Rpb25Nb2RlID0gJ2RheSc7IG9uWWVhclNlbGVjdGVkKHllYXIpXCJcbiAgICAgICAgICAgICAgICA+PC9idXR0b24+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDxiYy1jYWxlbmRhci1tb250aFxuICAgICAgICAgICAgKm5nU3dpdGNoRGVmYXVsdFxuICAgICAgICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwiaGVpZ2h0XCJcbiAgICAgICAgICAgIFtjb250YWluZXJXaWR0aF09XCJ3aWR0aFwiXG4gICAgICAgICAgICBbcnRsXT1cInJ0bFwiXG4gICAgICAgICAgICBbbW9udGhXZWVrc0NvdW50XT1cIjZcIlxuICAgICAgICAgICAgW3dlZWtEYXlzXT1cIndlZWtEYXlzXCJcbiAgICAgICAgICAgIFt3ZWVrRGF5c01pbl09XCJ3ZWVrRGF5c01pblwiXG4gICAgICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxuICAgICAgICAgICAgW2RhdGVQaWNrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbZGF0ZVJhbmdlXT1cInRydWVcIlxuICAgICAgICAgICAgW2RheXNdPVwic2VsZWN0ZWRNb250aC5kYXlzXCJcbiAgICAgICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxuICAgICAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soJGV2ZW50LCBzZWxlY3RlZE1vbnRoLCBwb3BvdmVyKVwiXG4gICAgICAgICAgICAoZGF5TW91c2VNb3ZlKT1cIm9uRGF5TW91c2VNb3ZlKCRldmVudCwgc2VsZWN0ZWRNb250aClcIlxuICAgICAgICAgICAgKGRheU1vdXNlVXApPVwib25EYXlNb3VzZVVwKCRldmVudCwgc2VsZWN0ZWRNb250aCwgcG9wb3ZlcilcIlxuICAgICAgICAgICAgKGRheU1vdXNlRG93bik9XCJvbkRheU1vdXNlRG93bigkZXZlbnQpXCJcbiAgICAgICAgICAgIFtzdGFydFNlbGVjdGVkRGF5SW5kZXhdPVwic3RhcnRTZWxlY3RlZERheUluZGV4XCJcbiAgICAgICAgICAgIFtlbmRTZWxlY3RlZERheUluZGV4XT1cImVuZFNlbGVjdGVkRGF5SW5kZXhcIlxuICAgICAgICA+PC9iYy1jYWxlbmRhci1tb250aD5cbiAgICA8L25nLWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
|