barsa-calendar 2.0.22 → 2.0.24

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.
@@ -196,7 +196,7 @@ export class CalendarContainerComponent extends ReportViewBaseComponent {
196
196
  useFactory: getDateService,
197
197
  deps: [LogService]
198
198
  }
199
- ], viewQueries: [{ propertyName: "_divRef", first: true, predicate: ["divRef"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div style=\"display: flex; width: 100%; height: 100%; flex-direction: row\">\n @if (deviceSize !== 's' && deviceSize !== 'm') {\n <div style=\"width: 320px; height: 100%\">\n <bc-calendar-selection-days\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n <div style=\"height: 1px; background: #ccc\"></div>\n @if (userCalendars?.Data?.MoDataList?.length) {\n <div>\n <h4>\u062A\u0642\u0648\u06CC\u0645\u200C\u0647\u0627\u06CC\u200C\u0645\u0646</h4>\n @for (calendar of userCalendars.Data.MoDataList; track calendar) {\n <ul fd-list>\n <li fd-list-item style=\"padding: 0\" class=\"user-calendar\">\n <span\n [style.background]=\"calendar.Color ? calendar.Color : null\"\n style=\"width: 5px; height: 100%; position: absolute\"\n ></span>\n <fd-checkbox\n [(ngModel)]=\"calendar.$IsChecked\"\n (change)=\"onCalendarCheckChange(calendar)\"\n ></fd-checkbox>\n <span fd-list-title>{{ calendar.$Caption }}</span>\n </li>\n </ul>\n }\n </div>\n }\n </div>\n }\n <div style=\"flex: 1\" #divRef>\n <bc-calendar-header\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n [weekModeDays]=\"(weekModeDays$ | async)!!\"\n [rtl]=\"rtl\"\n [deviceSize]=\"deviceSize\"\n [mode]=\"(mode$ | async)!!\"\n [modeTitle]=\"(modeTitle$ | async)!!\"\n [title]=\"(title$ | async)!!\"\n (modeChange)=\"onModeChange($event)\"\n (prevTap)=\"onPrevTap()\"\n (nextTap)=\"onNextTap()\"\n (today)=\"onToday()\"\n (rangeChange)=\"onRangeChange($event)\"\n >\n </bc-calendar-header>\n @switch (mode$ | async) { @case ('week') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('day') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('list') { } @default {\n <ng-container\n *ngTemplateOutlet=\"\n monthCalendar;\n context: {\n $implicit: days$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n monthWeeksCount: monthWeeksCount$ | async,\n access: access\n }\n \"\n ></ng-container>\n } }\n </div>\n</div>\n<ng-template\n #monthCalendar\n let-days\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-monthWeeksCount=\"monthWeeksCount\"\n let-access=\"access\"\n>\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [monthWeeksCount]=\"monthWeeksCount\"\n [rtl]=\"rtl\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"days\"\n [canAdd]=\"access.Add\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n ></bc-calendar-month>\n</ng-template>\n\n<ng-template #listCalendar>\n <bc-calendar-list-container\n [showEvents]=\"showEvents\"\n [selectedDay]=\"selectedDay\"\n [calendarFields]=\"calendarFields\"\n (showEventsTap)=\"showEvents = !showEvents\"\n ></bc-calendar-list-container>\n</ng-template>\n\n<ng-template\n #weekCalendar\n let-selectedMonth\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-weekModeDays=\"weekModeDays\"\n let-access=\"access\"\n>\n <bc-calendar-week\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [inDialog]=\"inDialog\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [rtl]=\"rtl\"\n [canAdd]=\"access.Add\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"weekModeDays\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n (rangeSelect)=\"onRangeSelect($event)\"\n ></bc-calendar-week>\n</ng-template>\n", styles: [":host{display:block;width:100%;height:100%}:host ::ng-deep li.user-calendar .fd-list__form-item{padding:.5rem}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "ariaRole", "id"], outputs: ["keyDown"] }, { kind: "directive", type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "component", type: i7.CalendarListContainerComponent, selector: "bc-calendar-list-container", inputs: ["view", "reportItemComponentName", "showEvents", "selectedDay", "calendarFields"], outputs: ["showEventsTap"] }, { kind: "component", type: i8.CalendarWeekComponent, selector: "bc-calendar-week", inputs: ["weekDays", "weekDaysMin", "today", "containerHeight", "calendarFields", "rtl", "inDialog", "deviceSize", "moDataList", "days", "canDelete", "canAdd", "canEdit"], outputs: ["editEvent", "deleteEvent", "showEvent", "rangeSelect", "daySelect", "dayClick"] }, { kind: "component", type: i9.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: "component", type: i10.CalendarHeaderComponent, selector: "bc-calendar-header", inputs: ["monthInfo", "weekModeDays", "hideMode", "modeTitle", "title", "deviceSize", "rtl", "mode"], outputs: ["prevTap", "nextTap", "modeChange", "rangeChange", "today"] }, { kind: "component", type: i11.CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: ["startSelectedDayIndex", "endSelectedDayIndex", "monthInfo", "inline"], outputs: ["rangeChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
199
+ ], viewQueries: [{ propertyName: "_divRef", first: true, predicate: ["divRef"], descendants: true, static: true }], usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div style=\"display: flex; width: 100%; height: 100%; flex-direction: row\">\n @if (deviceSize !== 's' && deviceSize !== 'm') {\n <div style=\"width: 320px; height: 100%\">\n <bc-calendar-selection-days\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n <div style=\"height: 1px; background: #ccc\"></div>\n @if (userCalendars?.Data?.MoDataList?.length) {\n <div>\n <h4>\u062A\u0642\u0648\u06CC\u0645\u200C\u0647\u0627\u06CC\u200C\u0645\u0646</h4>\n @for (calendar of userCalendars.Data.MoDataList; track calendar) {\n <ul fd-list>\n <li fd-list-item style=\"padding: 0\" class=\"user-calendar\">\n <span\n [style.background]=\"calendar.Color ? calendar.Color : null\"\n style=\"width: 5px; height: 100%; position: absolute\"\n ></span>\n <fd-checkbox\n [(ngModel)]=\"calendar.$IsChecked\"\n (change)=\"onCalendarCheckChange(calendar)\"\n ></fd-checkbox>\n <span fd-list-title>{{ calendar.$Caption }}</span>\n </li>\n </ul>\n }\n </div>\n }\n </div>\n }\n <div style=\"flex: 1\" #divRef>\n <bc-calendar-header\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n [weekModeDays]=\"(weekModeDays$ | async)!!\"\n [rtl]=\"rtl\"\n [deviceSize]=\"deviceSize\"\n [mode]=\"(mode$ | async)!!\"\n [modeTitle]=\"(modeTitle$ | async)!!\"\n [title]=\"(title$ | async)!!\"\n (modeChange)=\"onModeChange($event)\"\n (prevTap)=\"onPrevTap()\"\n (nextTap)=\"onNextTap()\"\n (today)=\"onToday()\"\n (rangeChange)=\"onRangeChange($event)\"\n >\n </bc-calendar-header>\n @switch (mode$ | async) { @case ('week') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('day') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('list') { } @default {\n <ng-container\n *ngTemplateOutlet=\"\n monthCalendar;\n context: {\n $implicit: days$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n monthWeeksCount: monthWeeksCount$ | async,\n access: access\n }\n \"\n ></ng-container>\n } }\n </div>\n</div>\n<ng-template\n #monthCalendar\n let-days\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-monthWeeksCount=\"monthWeeksCount\"\n let-access=\"access\"\n>\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [monthWeeksCount]=\"monthWeeksCount\"\n [rtl]=\"rtl\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"days\"\n [canView]=\"access.View\"\n [canAdd]=\"access.Add\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n ></bc-calendar-month>\n</ng-template>\n\n<ng-template #listCalendar>\n <bc-calendar-list-container\n [showEvents]=\"showEvents\"\n [selectedDay]=\"selectedDay\"\n [calendarFields]=\"calendarFields\"\n (showEventsTap)=\"showEvents = !showEvents\"\n ></bc-calendar-list-container>\n</ng-template>\n\n<ng-template\n #weekCalendar\n let-selectedMonth\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-weekModeDays=\"weekModeDays\"\n let-access=\"access\"\n>\n <bc-calendar-week\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [inDialog]=\"inDialog\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [rtl]=\"rtl\"\n [canAdd]=\"access.Add\"\n [canView]=\"access.View\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"weekModeDays\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n (rangeSelect)=\"onRangeSelect($event)\"\n ></bc-calendar-week>\n</ng-template>\n", styles: [":host{display:block;width:100%;height:100%}:host ::ng-deep li.user-calendar .fd-list__form-item{padding:.5rem}\n"], dependencies: [{ kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.NgControlStatus, selector: "[formControlName],[ngModel],[formControl]" }, { kind: "directive", type: i4.NgModel, selector: "[ngModel]:not([formControlName]):not([formControl])", inputs: ["name", "disabled", "ngModel", "ngModelOptions"], outputs: ["ngModelChange"], exportAs: ["ngModel"] }, { kind: "component", type: i5.CheckboxComponent, selector: "fd-checkbox", inputs: ["wrapLabel", "valignLabel", "ariaLabel", "value", "ariaLabelledBy", "ariaDescribedBy", "title", "inputId", "state", "name", "label", "disabled", "tristate", "tristateSelectable", "labelClass", "required", "displayOnly", "values", "standalone"], outputs: ["focusChange"] }, { kind: "component", type: i6.ListComponent, selector: "[fd-list], [fdList]", inputs: ["dropdownMode", "multiInputMode", "mobileMode", "hasMessage", "noBorder", "navigationIndicator", "selection", "keyboardSupport", "byline", "unreadIndicator", "role"], outputs: ["focusEscapeList"] }, { kind: "component", type: i6.ListItemComponent, selector: "[fdListItem] ,[fd-list-item]", inputs: ["selected", "noData", "action", "interactive", "growing", "counter", "unread", "byline", "ariaRole", "id"], outputs: ["keyDown"] }, { kind: "directive", type: i6.ListTitleDirective, selector: "[fd-list-title], [fdListTitle]", inputs: ["wrap"] }, { kind: "component", type: i7.CalendarListContainerComponent, selector: "bc-calendar-list-container", inputs: ["view", "reportItemComponentName", "showEvents", "selectedDay", "calendarFields"], outputs: ["showEventsTap"] }, { kind: "component", type: i8.CalendarWeekComponent, selector: "bc-calendar-week", inputs: ["weekDays", "weekDaysMin", "today", "containerHeight", "calendarFields", "rtl", "inDialog", "deviceSize", "moDataList", "days", "canDelete", "canAdd", "canEdit", "canView"], outputs: ["editEvent", "deleteEvent", "showEvent", "rangeSelect", "daySelect", "dayClick"] }, { kind: "component", type: i9.CalendarMonthComponent, selector: "bc-calendar-month", inputs: ["monthWeeksCount", "weekDays", "weekDaysMin", "today", "containerHeight", "days", "calendarFields", "rtl", "deviceSize", "moDataList", "datePicker", "rangePicker", "canDelete", "canAdd", "canEdit", "canView", "selectedDate", "startSelectedDayIndex", "endSelectedDayIndex"], outputs: ["editEvent", "deleteEvent", "daySelect", "dayClick", "dayMouseMove", "dayMouseUp", "dayMouseDown", "showEvent"] }, { kind: "component", type: i10.CalendarHeaderComponent, selector: "bc-calendar-header", inputs: ["monthInfo", "weekModeDays", "hideMode", "modeTitle", "title", "deviceSize", "rtl", "mode"], outputs: ["prevTap", "nextTap", "modeChange", "rangeChange", "today"] }, { kind: "component", type: i11.CalendarSelectionDaysComponent, selector: "bc-calendar-selection-days", inputs: ["startSelectedDayIndex", "endSelectedDayIndex", "monthInfo", "inline"], outputs: ["rangeChange"] }, { kind: "pipe", type: i1.AsyncPipe, name: "async" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
200
200
  }
201
201
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: CalendarContainerComponent, decorators: [{
202
202
  type: Component,
@@ -206,7 +206,7 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
206
206
  useFactory: getDateService,
207
207
  deps: [LogService]
208
208
  }
209
- ], template: "<div style=\"display: flex; width: 100%; height: 100%; flex-direction: row\">\n @if (deviceSize !== 's' && deviceSize !== 'm') {\n <div style=\"width: 320px; height: 100%\">\n <bc-calendar-selection-days\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n <div style=\"height: 1px; background: #ccc\"></div>\n @if (userCalendars?.Data?.MoDataList?.length) {\n <div>\n <h4>\u062A\u0642\u0648\u06CC\u0645\u200C\u0647\u0627\u06CC\u200C\u0645\u0646</h4>\n @for (calendar of userCalendars.Data.MoDataList; track calendar) {\n <ul fd-list>\n <li fd-list-item style=\"padding: 0\" class=\"user-calendar\">\n <span\n [style.background]=\"calendar.Color ? calendar.Color : null\"\n style=\"width: 5px; height: 100%; position: absolute\"\n ></span>\n <fd-checkbox\n [(ngModel)]=\"calendar.$IsChecked\"\n (change)=\"onCalendarCheckChange(calendar)\"\n ></fd-checkbox>\n <span fd-list-title>{{ calendar.$Caption }}</span>\n </li>\n </ul>\n }\n </div>\n }\n </div>\n }\n <div style=\"flex: 1\" #divRef>\n <bc-calendar-header\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n [weekModeDays]=\"(weekModeDays$ | async)!!\"\n [rtl]=\"rtl\"\n [deviceSize]=\"deviceSize\"\n [mode]=\"(mode$ | async)!!\"\n [modeTitle]=\"(modeTitle$ | async)!!\"\n [title]=\"(title$ | async)!!\"\n (modeChange)=\"onModeChange($event)\"\n (prevTap)=\"onPrevTap()\"\n (nextTap)=\"onNextTap()\"\n (today)=\"onToday()\"\n (rangeChange)=\"onRangeChange($event)\"\n >\n </bc-calendar-header>\n @switch (mode$ | async) { @case ('week') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('day') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('list') { } @default {\n <ng-container\n *ngTemplateOutlet=\"\n monthCalendar;\n context: {\n $implicit: days$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n monthWeeksCount: monthWeeksCount$ | async,\n access: access\n }\n \"\n ></ng-container>\n } }\n </div>\n</div>\n<ng-template\n #monthCalendar\n let-days\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-monthWeeksCount=\"monthWeeksCount\"\n let-access=\"access\"\n>\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [monthWeeksCount]=\"monthWeeksCount\"\n [rtl]=\"rtl\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"days\"\n [canAdd]=\"access.Add\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n ></bc-calendar-month>\n</ng-template>\n\n<ng-template #listCalendar>\n <bc-calendar-list-container\n [showEvents]=\"showEvents\"\n [selectedDay]=\"selectedDay\"\n [calendarFields]=\"calendarFields\"\n (showEventsTap)=\"showEvents = !showEvents\"\n ></bc-calendar-list-container>\n</ng-template>\n\n<ng-template\n #weekCalendar\n let-selectedMonth\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-weekModeDays=\"weekModeDays\"\n let-access=\"access\"\n>\n <bc-calendar-week\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [inDialog]=\"inDialog\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [rtl]=\"rtl\"\n [canAdd]=\"access.Add\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"weekModeDays\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n (rangeSelect)=\"onRangeSelect($event)\"\n ></bc-calendar-week>\n</ng-template>\n", styles: [":host{display:block;width:100%;height:100%}:host ::ng-deep li.user-calendar .fd-list__form-item{padding:.5rem}\n"] }]
209
+ ], template: "<div style=\"display: flex; width: 100%; height: 100%; flex-direction: row\">\n @if (deviceSize !== 's' && deviceSize !== 'm') {\n <div style=\"width: 320px; height: 100%\">\n <bc-calendar-selection-days\n [inline]=\"true\"\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n (rangeChange)=\"onRangeChange($event)\"\n ></bc-calendar-selection-days>\n <div style=\"height: 1px; background: #ccc\"></div>\n @if (userCalendars?.Data?.MoDataList?.length) {\n <div>\n <h4>\u062A\u0642\u0648\u06CC\u0645\u200C\u0647\u0627\u06CC\u200C\u0645\u0646</h4>\n @for (calendar of userCalendars.Data.MoDataList; track calendar) {\n <ul fd-list>\n <li fd-list-item style=\"padding: 0\" class=\"user-calendar\">\n <span\n [style.background]=\"calendar.Color ? calendar.Color : null\"\n style=\"width: 5px; height: 100%; position: absolute\"\n ></span>\n <fd-checkbox\n [(ngModel)]=\"calendar.$IsChecked\"\n (change)=\"onCalendarCheckChange(calendar)\"\n ></fd-checkbox>\n <span fd-list-title>{{ calendar.$Caption }}</span>\n </li>\n </ul>\n }\n </div>\n }\n </div>\n }\n <div style=\"flex: 1\" #divRef>\n <bc-calendar-header\n [monthInfo]=\"(selectedMonth$ | async)!!\"\n [weekModeDays]=\"(weekModeDays$ | async)!!\"\n [rtl]=\"rtl\"\n [deviceSize]=\"deviceSize\"\n [mode]=\"(mode$ | async)!!\"\n [modeTitle]=\"(modeTitle$ | async)!!\"\n [title]=\"(title$ | async)!!\"\n (modeChange)=\"onModeChange($event)\"\n (prevTap)=\"onPrevTap()\"\n (nextTap)=\"onNextTap()\"\n (today)=\"onToday()\"\n (rangeChange)=\"onRangeChange($event)\"\n >\n </bc-calendar-header>\n @switch (mode$ | async) { @case ('week') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('day') {\n <ng-container\n *ngTemplateOutlet=\"\n weekCalendar;\n context: {\n $implicit: selectedMonth$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n weekModeDays: weekModeDays$ | async,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n access: access\n }\n \"\n ></ng-container>\n } @case ('list') { } @default {\n <ng-container\n *ngTemplateOutlet=\"\n monthCalendar;\n context: {\n $implicit: days$ | async,\n moDataList: eventMoDataList$ | async,\n width: width,\n height: height,\n rtl: rtl,\n showEvents: showEvents,\n today: today,\n deviceSize: deviceSize,\n calendarFields: calendarFields,\n monthWeeksCount: monthWeeksCount$ | async,\n access: access\n }\n \"\n ></ng-container>\n } }\n </div>\n</div>\n<ng-template\n #monthCalendar\n let-days\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-monthWeeksCount=\"monthWeeksCount\"\n let-access=\"access\"\n>\n <bc-calendar-month\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [monthWeeksCount]=\"monthWeeksCount\"\n [rtl]=\"rtl\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"days\"\n [canView]=\"access.View\"\n [canAdd]=\"access.Add\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n ></bc-calendar-month>\n</ng-template>\n\n<ng-template #listCalendar>\n <bc-calendar-list-container\n [showEvents]=\"showEvents\"\n [selectedDay]=\"selectedDay\"\n [calendarFields]=\"calendarFields\"\n (showEventsTap)=\"showEvents = !showEvents\"\n ></bc-calendar-list-container>\n</ng-template>\n\n<ng-template\n #weekCalendar\n let-selectedMonth\n let-moDataList=\"moDataList\"\n let-width=\"width\"\n let-height=\"height\"\n let-calendarFields=\"calendarFields\"\n let-rtl=\"rtl\"\n let-today=\"today\"\n let-showEvents=\"showEvents\"\n let-deviceSize=\"deviceSize\"\n let-weekModeDays=\"weekModeDays\"\n let-access=\"access\"\n>\n <bc-calendar-week\n [style.width]=\"width\"\n [containerHeight]=\"parentHeight !== 0 ? parentHeight : height\"\n [containerWidth]=\"width\"\n [inDialog]=\"inDialog\"\n [calendarFields]=\"calendarFields\"\n [moDataList]=\"moDataList\"\n [rtl]=\"rtl\"\n [canAdd]=\"access.Add\"\n [canView]=\"access.View\"\n [canEdit]=\"access.Edit\"\n [canDelete]=\"access.Delete\"\n [weekDays]=\"weekDays\"\n [weekDaysMin]=\"weekDaysMin\"\n [today]=\"today\"\n [showEvents]=\"showEvents\"\n [days]=\"weekModeDays\"\n [deviceSize]=\"deviceSize\"\n (dayClick)=\"onDayClick($event)\"\n (showEvent)=\"onShowTask()\"\n (deleteEvent)=\"deleteTask.emit($event)\"\n (editEvent)=\"editTask.emit($event)\"\n (daySelect)=\"daySelect.emit($event)\"\n (rangeSelect)=\"onRangeSelect($event)\"\n ></bc-calendar-week>\n</ng-template>\n", styles: [":host{display:block;width:100%;height:100%}:host ::ng-deep li.user-calendar .fd-list__form-item{padding:.5rem}\n"] }]
210
210
  }], ctorParameters: () => [{ type: i1.TitleCasePipe }, { type: i2.BbbTranslatePipe }, { type: i3.CalendarService }, { type: i2.DateService }, { type: i0.ElementRef }, { type: i0.ChangeDetectorRef }, { type: i0.Renderer2 }, { type: i2.FindColumnByDbNamePipe }, { type: i2.UlvMainService }, { type: i2.PortalService }], propDecorators: { _divRef: [{
211
211
  type: ViewChild,
212
212
  args: ['divRef', { static: true }]
@@ -227,4 +227,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
227
227
  }], loadData: [{
228
228
  type: Output
229
229
  }] } });
230
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLWNhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXItY29udGFpbmVyL2NhbGVuZGFyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLWNvbnRhaW5lci9jYWxlbmRhci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQU9qQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBaUI5QixNQUFNLE9BQU8sMEJBQ1QsU0FBUSx1QkFBZ0Q7SUFpQ3hELFlBQ1ksVUFBeUIsRUFDekIsYUFBK0IsRUFDL0IsZ0JBQWlDLEVBQ2pDLFlBQXlCLEVBQ3ZCLEdBQWUsRUFDZixJQUF1QixFQUN2QixVQUFxQixFQUNyQixtQkFBMkMsRUFDM0MsZUFBK0IsRUFDL0IsY0FBNkI7UUFFdkMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQVgzRSxlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQ3pCLGtCQUFhLEdBQWIs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QUFDO3lCQUNyQjtxQkFDSjt3VkFNc0MsT0FBTztzQkFBN0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUM1QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaXRsZUNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcbiAgICBSZXBvcnRWaWV3QmFzZUNvbXBvbmVudCxcbiAgICBEYXRlU2VydmljZSxcbiAgICBMb2dTZXJ2aWNlLFxuICAgIGdldERhdGVTZXJ2aWNlLFxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgQ2FsZW5kYXJNZXRhb2JqZWN0RGF0YU1vZGVsLFxuICAgIEJiYlRyYW5zbGF0ZVBpcGUsXG4gICAgRmluZENvbHVtbkJ5RGJOYW1lUGlwZSxcbiAgICBVbHZNYWluU2VydmljZSxcbiAgICBQb3J0YWxTZXJ2aWNlXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyTW9kZSwgQ2FsZW5kYXJNb250aEluZm8sIERheSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jYWxlbmRhci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1jYWxlbmRhci1jb250YWluZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLWNvbnRhaW5lci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRlU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldERhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgZGVwczogW0xvZ1NlcnZpY2VdXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBSZXBvcnRWaWV3QmFzZUNvbXBvbmVudDxVaVJlcG9ydFZpZXdCYXNlU2V0dGluZz5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzXG57XG4gICAgQFZpZXdDaGlsZCgnZGl2UmVmJywgeyBzdGF0aWM6IHRydWUgfSkgX2RpdlJlZjogRWxlbWVudFJlZjtcbiAgICBASW5wdXQoKSBjYWxlbmRhckZpZWxkcztcbiAgICBASW5wdXQoKSB1c2VyQ2FsZW5kYXJzO1xuICAgIEBJbnB1dCgpIHZpZXdTZXR0aW5nOiBVaUNhbGVuZGFyU2V0dGluZztcbiAgICBAT3V0cHV0KCkgZGVsZXRlVGFzayA9IG5ldyBFdmVudEVtaXR0ZXI8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgZWRpdFRhc2sgPSBuZXcgRXZlbnRFbWl0dGVyPE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG4gICAgQE91dHB1dCgpIHJhbmdlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IFtrZXk6IHN0cmluZ106IERhdGUgfT4oKTtcbiAgICBAT3V0cHV0KCkgZGF5U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICAgIEBPdXRwdXQoKSBsb2FkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGFydDogRGF0ZTsgZW5kOiBhbnkgfT4oKTtcbiAgICBzZWxlY3RlZERheTogRGF5O1xuICAgIHRvZGF5SW5kZXggPSAtMTtcbiAgICBzZWxlY3RlZEluZGV4OiBhbnk7XG4gICAgY2FsZW5kYXJzOiBDYWxlbmRhck1vbnRoSW5mb1tdO1xuICAgIHNob3dFdmVudHM6IGJvb2xlYW47XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBzZWxlY3RlZE1vbnRoJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vbnRoSW5mbz47XG4gICAgdG9kYXk6IERhdGU7XG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBtb2RlJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vZGU+O1xuICAgIHNlbGVjdGVkV2VlayQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICB3ZWVrTW9kZURheXMkOiBPYnNlcnZhYmxlPERheVtdPjtcbiAgICBkYXlzJDogT2JzZXJ2YWJsZTxEYXlbXT47XG4gICAgd2Vla3NDb3VudDogbnVtYmVyO1xuICAgIGZpcnN0V2Vla0luZGV4OiBudW1iZXI7XG4gICAgbW9udGhXZWVrc0NvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIG1vZGVUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICB0aXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBldmVudE1vRGF0YUxpc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfdGl0bGVDYXNlOiBUaXRsZUNhc2VQaXBlLFxuICAgICAgICBwcml2YXRlIF9iYmJUcmFuc2xhdGU6IEJiYlRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIHByaXZhdGUgX2NhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9kYXRlU2VydmljZTogRGF0ZVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIF9yZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJvdGVjdGVkIF9maW5kQ29sdW1uQnlEYk5hbWU6IEZpbmRDb2x1bW5CeURiTmFtZVBpcGUsXG4gICAgICAgIHByb3RlY3RlZCBfdWx2TWFpblNlcnZpY2U6IFVsdk1haW5TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX3BvcnRhbFNlcnZpY2U6IFBvcnRhbFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2VsLCBfY2RyLCBfcmVuZGVyZXIyLCBfZmluZENvbHVtbkJ5RGJOYW1lLCBfdWx2TWFpblNlcnZpY2UsIF9wb3J0YWxTZXJ2aWNlKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGaWVsZHMgPSB0aGlzLmNvbnRleHRTZXR0aW5nLlZpZXcuQ2FsZW5kYXJGaWVsZHM7XG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5DYWxlbmRhckNvbG9yRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJGaWVsZHMuQ29sb3IgPSB0aGlzLnZpZXdTZXR0aW5nLkNhbGVuZGFyQ29sb3JGaWVsZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDYWxlbmRhcnMgPSB0aGlzLmNvbnRleHRTZXR0aW5nLlZpZXcuVXNlckNhbGVuZGFycztcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIHRoaXMuX3NldFdpZHRoQW5kSGVpZ2h0KCk7XG4gICAgICAgIHRoaXMucHJlcGFyZU1vRGF0YUxpc3QodGhpcy5tb0RhdGFMaXN0KTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChtb250aDogQ2FsZW5kYXJNb250aEluZm8pID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEuZW1pdCh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbnRoLmRheXNbMF0uZGF0ZSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbnRoLmRheXNbbW9udGguZGF5cy5sZW5ndGggLSAxXS5kYXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGhpcy5zZXRUYXNrcyh0aGlzLmNhbGVuZGFycywgdGhpcy5tb0RhdGFMaXN0LCB0aGlzLmNhbGVuZGFyRmllbGRzKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgY29uc3QgeyBtb0RhdGFMaXN0LCBkZXZpY2VTaXplIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAobW9EYXRhTGlzdCAmJiAhbW9EYXRhTGlzdC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlTW9EYXRhTGlzdChjaGFuZ2VzLm1vRGF0YUxpc3QuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldmljZVNpemUgJiYgIWRldmljZVNpemUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFdpZHRoQW5kSGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJDaGVja0NoYW5nZShjYWxlbmRhcjogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVVc2VyQ2FsZW5kYXJzQ2hlY2tlZCgpO1xuICAgIH1cbiAgICBvbkRheUNsaWNrKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZXRNb2RlKCdkYXknLCBkYXkpO1xuICAgIH1cbiAgICBvblNob3dUYXNrKCk6IHZvaWQge31cbiAgICBvblNsaWRlQ2hhbmdlKHNlbGVjdGVkOiBDYWxlbmRhck1vbnRoSW5mbyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpO1xuICAgIH1cbiAgICBvbk1vbnRoQ2Fyb3VzZWxMb2FkZWQoeyBvYmplY3QgfSk6IHZvaWQge1xuICAgICAgICBvYmplY3Quc2VsZWN0ZWRQYWdlID0gMTtcbiAgICB9XG5cbiAgICBvblRvZGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuICAgIG9uTW9kZUNoYW5nZShtb2RlOiBDYWxlbmRhck1vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNldE1vZGUobW9kZSk7XG4gICAgfVxuICAgIG9uUmFuZ2VDaGFuZ2UoZTogeyBzdGFydERheTogRGF5OyBlbmREYXk6IERheTsgbW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbyB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5yYW5nZVNlbGVjdChlLnN0YXJ0RGF5LCBlLmVuZERheSwgZS5tb250aEluZm8pO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIC8vICAgdGhpcy5nb3RvUGFnZSh0aGlzLm1vbnRoQ2Fyb3VzZWxWaWV3Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRQYWdlIC0gMSk7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkUHJldmlvdXMoKTtcbiAgICB9XG5cbiAgICBvbk5leHRUYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICAvLyB0aGlzLmdvdG9QYWdlKHRoaXMubW9udGhDYXJvdXNlbFZpZXcubmF0aXZlRWxlbWVudC5zZWxlY3RlZFBhZ2UgKyAxKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGVkQ2hhbmdlKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXkgPSB7IC4uLmRheSB9O1xuICAgIH1cbiAgICBvblJhbmdlU2VsZWN0KHsgc3RhcnREYXRlLCBlbmREYXRlIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeCA9IHsgW3RoaXMuY2FsZW5kYXJGaWVsZHMuU3RhcnREYXRlXTogc3RhcnREYXRlLCBbdGhpcy5jYWxlbmRhckZpZWxkcy5FbmREYXRlXTogZW5kRGF0ZSB9O1xuICAgICAgICB0aGlzLnJhbmdlU2VsZWN0LmVtaXQoeCk7XG4gICAgfVxuXG4gICAgcHJlcGFyZU1vRGF0YUxpc3QobW9EYXRhTGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRNb0RhdGFMaXN0JC5uZXh0KFxuICAgICAgICAgICAgbW9EYXRhTGlzdC5tYXAoKGV2ZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgICAgIGlkOiBldmVudC5JZCwgLy8gYmVjYXVzZSBpbiBjb3JlLmpzIGNhbGVuZGFyIHNlbGVjdGlvbiBhZGFwdGVyIHJlYWQgaWQgd2l0aCBsb3dlcmNhc2VcbiAgICAgICAgICAgICAgICAkU3RhcnREYXRlSW5mbzogdGhpcy5fZGF0ZVNlcnZpY2UuZ2V0RGF0ZUluZm8oZXZlbnRbdGhpcy5jYWxlbmRhckZpZWxkcy5TdGFydERhdGVdKSxcbiAgICAgICAgICAgICAgICAkRW5kRGF0ZUluZm86IHRoaXMuX2RhdGVTZXJ2aWNlLmdldERhdGVJbmZvKGV2ZW50W3RoaXMuY2FsZW5kYXJGaWVsZHMuRW5kRGF0ZV0pXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhZGRUZCh0YWJsZTogYW55W10sIHRyOiBhbnlbXSwgZXZlbnQ6IENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbCwgY29sU3BhbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbFNwYW5Db3VudCA9IHRyLmxlbmd0aCA+IDAgPyB0ci5tYXAoKGMpID0+IGMuY29sU3BhbikucmVkdWNlKChhLCBiKSA9PiBhICsgYikgPiA2IDogMDtcbiAgICAgICAgaWYgKGNvbFNwYW5Db3VudCkge1xuICAgICAgICAgICAgdGFibGUucHVzaCh0cik7XG4gICAgICAgICAgICB0ciA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRyLnB1c2goeyB0eXBlOiAndGQnLCBjb2xTcGFuLCBldmVudCB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaGFuZGxlVXNlckNhbGVuZGFyc0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVzZXJDYWxlbmRhcnMgPSB0aGlzLnVzZXJDYWxlbmRhcnM/LkRhdGE/Lk1vRGF0YUxpc3Q7XG4gICAgICAgIGlmICghdXNlckNhbGVuZGFycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FsZW5kYXJzID0gdXNlckNhbGVuZGFycy5maWx0ZXIoKGMpID0+IGMuJElzQ2hlY2tlZCkubWFwKChjKSA9PiBjLklkKTtcbiAgICAgICAgbGV0IG1vTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcblxuICAgICAgICBpZiAoY2FsZW5kYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1vTGlzdCA9IHRoaXMubW9EYXRhTGlzdC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGMpID0+IGNbdGhpcy5jYWxlbmRhckZpZWxkcy5DYWxlbmRhcl0gJiYgY2FsZW5kYXJzLmluZGV4T2YoY1t0aGlzLmNhbGVuZGFyRmllbGRzLkNhbGVuZGFyXS5JZCkgPiAtMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXBhcmVNb0RhdGFMaXN0KG1vTGlzdCk7XG4gICAgfVxuICAgIHByaXZhdGUgcHJlcGFyZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53ZWVrRGF5c01pbiA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5c01pbigpO1xuICAgICAgICB0aGlzLndlZWtEYXlzID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aCQgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWQkO1xuICAgICAgICB0aGlzLmRheXMkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmRheXMkO1xuICAgICAgICB0aGlzLnRvZGF5ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnRvZGF5O1xuICAgICAgICB0aGlzLm1vZGUkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLm1vZGUkO1xuXG4gICAgICAgIHRoaXMubW9udGhXZWVrc0NvdW50JCA9IHRoaXMubW9kZSQucGlwZShcbiAgICAgICAgICAgIG1hcCgobW9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWRNb250aC53ZWVrc0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9kZVRpdGxlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF5cyQsIHRoaXMubW9kZSRdKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbLCBtb2RlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VzdG9tTW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihgJHt0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla3NDb3VudH0gICR7dGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnV2VlaycpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSh0aGlzLl90aXRsZUNhc2UudHJhbnNmb3JtKG1vZGUpKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMud2Vla01vZGVEYXlzJCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrTW9kZURheXMkO1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuY2FsZW5kYXJzJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChjYWxlbmRhcnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsZW5kYXJzID0gWy4uLmNhbGVuZGFyc107XG4gICAgICAgICAgICAvLyBldmVudENhbGVuZGFycyA9IGV2ZW50Q2FsZW5kYXJzLnNwbGljZSh0aGlzLnNlbGVjdGVkSW5kZXgsIDMpO1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhcnMgPSBldmVudENhbGVuZGFycztcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLm1vbnRoQ2Fyb3VzZWxWaWV3KSB7XG4gICAgICAgICAgICAvLyAgIHRoaXMubW9udGhDYXJvdXNlbFZpZXcubmF0aXZlRWxlbWVudC5zZWxlY3RlZFBhZ2UgPSAxO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpXG4gICAgICAgIC8vICAgLnN1YnNjcmliZSgodG9kYXlJbmRleCkgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy50b2RheUluZGV4ID0gdG9kYXlJbmRleDtcbiAgICAgICAgLy8gICAgIHRoaXMuZ290b1BhZ2UodGhpcy50b2RheUluZGV4KTtcbiAgICAgICAgLy8gICB9KTtcbiAgICAgICAgdGhpcy50aXRsZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndlZWtNb2RlRGF5cyQsIHRoaXMuc2VsZWN0ZWRNb250aCQsIHRoaXMuZGF5cyQsIHRoaXMubW9kZSRdKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbd2Vla01vZGVEYXlzLCBtb250aEluZm8sIGRheXMsIG1vZGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoTmFtZSA9IG1vbnRoSW5mby5kYXRlSW5mby5tb250aE5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgeWVhciA9IG1vbnRoSW5mby5kYXRlSW5mby5zdHJZZWFyO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgIT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0RGF5SW5mbzogRGF5O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdERheUluZm86IERheTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5c1RlbXAgPSBtb2RlID09PSAnY3VzdG9tTW9udGgnID8gZGF5cyA6IHdlZWtNb2RlRGF5cztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheXNUZW1wLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5SW5mbyA9IGRheXNUZW1wWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdERheUluZm8gPSBkYXlzVGVtcFtkYXlzVGVtcC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZSA9IGZpcnN0RGF5SW5mby5tb250aE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3REYXlJbmZvLm1vbnRoICE9PSBsYXN0RGF5SW5mby5tb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZSA9IGAke2ZpcnN0RGF5SW5mby5tb250aE5hbWV9IC1cbiAgICAgICAgICAgICAgJHtsYXN0RGF5SW5mby5tb250aE5hbWV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoYCR7bW9udGhOYW1lfSAgJHt5ZWFyfWApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRXaWR0aEFuZEhlaWdodCgpOiB2b2lkIHtcbiAgICAgICAgLy8gY29uc3QgZGl2UmVmPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBkaXZSZWYgPSB0aGlzLl9kaXZSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICB0aGlzLndpZHRoID0gZGl2UmVmLm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGRpdlJlZi5vZmZzZXRIZWlnaHQgLSA0NTtcbiAgICB9XG59XG5pbnRlcmZhY2UgVWlDYWxlbmRhclNldHRpbmcgZXh0ZW5kcyBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyB7XG4gICAgQ2FsZW5kYXJDb2xvckZpZWxkOiBzdHJpbmc7XG59XG4iLCI8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgZmxleC1kaXJlY3Rpb246IHJvd1wiPlxuICAgIEBpZiAoZGV2aWNlU2l6ZSAhPT0gJ3MnICYmIGRldmljZVNpemUgIT09ICdtJykge1xuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzIwcHg7IGhlaWdodDogMTAwJVwiPlxuICAgICAgICA8YmMtY2FsZW5kYXItc2VsZWN0aW9uLWRheXNcbiAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbW9udGhJbmZvXT1cIihzZWxlY3RlZE1vbnRoJCB8IGFzeW5jKSEhXCJcbiAgICAgICAgICAgIChyYW5nZUNoYW5nZSk9XCJvblJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9iYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5cz5cbiAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMXB4OyBiYWNrZ3JvdW5kOiAjY2NjXCI+PC9kaXY+XG4gICAgICAgIEBpZiAodXNlckNhbGVuZGFycz8uRGF0YT8uTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDQ+2KrZgtmI24zZheKAjNmH2KfbjOKAjNmF2YY8L2g0PlxuICAgICAgICAgICAgQGZvciAoY2FsZW5kYXIgb2YgdXNlckNhbGVuZGFycy5EYXRhLk1vRGF0YUxpc3Q7IHRyYWNrIGNhbGVuZGFyKSB7XG4gICAgICAgICAgICA8dWwgZmQtbGlzdD5cbiAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtIHN0eWxlPVwicGFkZGluZzogMFwiIGNsYXNzPVwidXNlci1jYWxlbmRhclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiY2FsZW5kYXIuQ29sb3IgPyBjYWxlbmRhci5Db2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNXB4OyBoZWlnaHQ6IDEwMCU7IHBvc2l0aW9uOiBhYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYWxlbmRhci4kSXNDaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DYWxlbmRhckNoZWNrQ2hhbmdlKGNhbGVuZGFyKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7IGNhbGVuZGFyLiRDYXB0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMVwiICNkaXZSZWY+XG4gICAgICAgIDxiYy1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICAgIFttb250aEluZm9dPVwiKHNlbGVjdGVkTW9udGgkIHwgYXN5bmMpISFcIlxuICAgICAgICAgICAgW3dlZWtNb2RlRGF5c109XCIod2Vla01vZGVEYXlzJCB8IGFzeW5jKSEhXCJcbiAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxuICAgICAgICAgICAgW21vZGVdPVwiKG1vZGUkIHwgYXN5bmMpISFcIlxuICAgICAgICAgICAgW21vZGVUaXRsZV09XCIobW9kZVRpdGxlJCB8IGFzeW5jKSEhXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCIodGl0bGUkIHwgYXN5bmMpISFcIlxuICAgICAgICAgICAgKG1vZGVDaGFuZ2UpPVwib25Nb2RlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKHByZXZUYXApPVwib25QcmV2VGFwKClcIlxuICAgICAgICAgICAgKG5leHRUYXApPVwib25OZXh0VGFwKClcIlxuICAgICAgICAgICAgKHRvZGF5KT1cIm9uVG9kYXkoKVwiXG4gICAgICAgICAgICAocmFuZ2VDaGFuZ2UpPVwib25SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L2JjLWNhbGVuZGFyLWhlYWRlcj5cbiAgICAgICAgQHN3aXRjaCAobW9kZSQgfCBhc3luYykgeyBAY2FzZSAoJ3dlZWsnKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgd2Vla0NhbGVuZGFyO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICBtb0RhdGFMaXN0OiBldmVudE1vRGF0YUxpc3QkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJ0bDogcnRsLFxuICAgICAgICAgICAgICAgICAgICBzaG93RXZlbnRzOiBzaG93RXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrTW9kZURheXM6IHdlZWtNb2RlRGF5cyQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VTaXplOiBkZXZpY2VTaXplLFxuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckZpZWxkczogY2FsZW5kYXJGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgIGFjY2VzczogYWNjZXNzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBjYXNlICgnZGF5Jykge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIHdlZWtDYWxlbmRhcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogc2VsZWN0ZWRNb250aCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgbW9EYXRhTGlzdDogZXZlbnRNb0RhdGFMaXN0JCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCxcbiAgICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50czogc2hvd0V2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla01vZGVEYXlzOiB3ZWVrTW9kZURheXMkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3M6IGFjY2Vzc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAY2FzZSAoJ2xpc3QnKSB7IH0gQGRlZmF1bHQge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoQ2FsZW5kYXI7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRheXMkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIG1vRGF0YUxpc3Q6IGV2ZW50TW9EYXRhTGlzdCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgcnRsOiBydGwsXG4gICAgICAgICAgICAgICAgICAgIHNob3dFdmVudHM6IHNob3dFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICBtb250aFdlZWtzQ291bnQ6IG1vbnRoV2Vla3NDb3VudCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzOiBhY2Nlc3NcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gfVxuICAgIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGVcbiAgICAjbW9udGhDYWxlbmRhclxuICAgIGxldC1kYXlzXG4gICAgbGV0LW1vRGF0YUxpc3Q9XCJtb0RhdGFMaXN0XCJcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LWNhbGVuZGFyRmllbGRzPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC10b2RheT1cInRvZGF5XCJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxuICAgIGxldC1kZXZpY2VTaXplPVwiZGV2aWNlU2l6ZVwiXG4gICAgbGV0LW1vbnRoV2Vla3NDb3VudD1cIm1vbnRoV2Vla3NDb3VudFwiXG4gICAgbGV0LWFjY2Vzcz1cImFjY2Vzc1wiXG4+XG4gICAgPGJjLWNhbGVuZGFyLW1vbnRoXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXG4gICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwicGFyZW50SGVpZ2h0ICE9PSAwID8gcGFyZW50SGVpZ2h0IDogaGVpZ2h0XCJcbiAgICAgICAgW2NvbnRhaW5lcldpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcbiAgICAgICAgW21vRGF0YUxpc3RdPVwibW9EYXRhTGlzdFwiXG4gICAgICAgIFttb250aFdlZWtzQ291bnRdPVwibW9udGhXZWVrc0NvdW50XCJcbiAgICAgICAgW3J0bF09XCJydGxcIlxuICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxuICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxuICAgICAgICBbc2hvd0V2ZW50c109XCJzaG93RXZlbnRzXCJcbiAgICAgICAgW2RheXNdPVwiZGF5c1wiXG4gICAgICAgIFtjYW5BZGRdPVwiYWNjZXNzLkFkZFwiXG4gICAgICAgIFtjYW5FZGl0XT1cImFjY2Vzcy5FZGl0XCJcbiAgICAgICAgW2NhbkRlbGV0ZV09XCJhY2Nlc3MuRGVsZXRlXCJcbiAgICAgICAgW2RldmljZVNpemVdPVwiZGV2aWNlU2l6ZVwiXG4gICAgICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgICAgICAoc2hvd0V2ZW50KT1cIm9uU2hvd1Rhc2soKVwiXG4gICAgICAgIChkZWxldGVFdmVudCk9XCJkZWxldGVUYXNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0RXZlbnQpPVwiZWRpdFRhc2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRheVNlbGVjdCk9XCJkYXlTZWxlY3QuZW1pdCgkZXZlbnQpXCJcbiAgICA+PC9iYy1jYWxlbmRhci1tb250aD5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZSAjbGlzdENhbGVuZGFyPlxuICAgIDxiYy1jYWxlbmRhci1saXN0LWNvbnRhaW5lclxuICAgICAgICBbc2hvd0V2ZW50c109XCJzaG93RXZlbnRzXCJcbiAgICAgICAgW3NlbGVjdGVkRGF5XT1cInNlbGVjdGVkRGF5XCJcbiAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcbiAgICAgICAgKHNob3dFdmVudHNUYXApPVwic2hvd0V2ZW50cyA9ICFzaG93RXZlbnRzXCJcbiAgICA+PC9iYy1jYWxlbmRhci1saXN0LWNvbnRhaW5lcj5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICN3ZWVrQ2FsZW5kYXJcbiAgICBsZXQtc2VsZWN0ZWRNb250aFxuICAgIGxldC1tb0RhdGFMaXN0PVwibW9EYXRhTGlzdFwiXG4gICAgbGV0LXdpZHRoPVwid2lkdGhcIlxuICAgIGxldC1oZWlnaHQ9XCJoZWlnaHRcIlxuICAgIGxldC1jYWxlbmRhckZpZWxkcz1cImNhbGVuZGFyRmllbGRzXCJcbiAgICBsZXQtcnRsPVwicnRsXCJcbiAgICBsZXQtdG9kYXk9XCJ0b2RheVwiXG4gICAgbGV0LXNob3dFdmVudHM9XCJzaG93RXZlbnRzXCJcbiAgICBsZXQtZGV2aWNlU2l6ZT1cImRldmljZVNpemVcIlxuICAgIGxldC13ZWVrTW9kZURheXM9XCJ3ZWVrTW9kZURheXNcIlxuICAgIGxldC1hY2Nlc3M9XCJhY2Nlc3NcIlxuPlxuICAgIDxiYy1jYWxlbmRhci13ZWVrXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXG4gICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwicGFyZW50SGVpZ2h0ICE9PSAwID8gcGFyZW50SGVpZ2h0IDogaGVpZ2h0XCJcbiAgICAgICAgW2NvbnRhaW5lcldpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgW2luRGlhbG9nXT1cImluRGlhbG9nXCJcbiAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcbiAgICAgICAgW21vRGF0YUxpc3RdPVwibW9EYXRhTGlzdFwiXG4gICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgW2NhbkFkZF09XCJhY2Nlc3MuQWRkXCJcbiAgICAgICAgW2NhbkVkaXRdPVwiYWNjZXNzLkVkaXRcIlxuICAgICAgICBbY2FuRGVsZXRlXT1cImFjY2Vzcy5EZWxldGVcIlxuICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxuICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxuICAgICAgICBbc2hvd0V2ZW50c109XCJzaG93RXZlbnRzXCJcbiAgICAgICAgW2RheXNdPVwid2Vla01vZGVEYXlzXCJcbiAgICAgICAgW2RldmljZVNpemVdPVwiZGV2aWNlU2l6ZVwiXG4gICAgICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKCRldmVudClcIlxuICAgICAgICAoc2hvd0V2ZW50KT1cIm9uU2hvd1Rhc2soKVwiXG4gICAgICAgIChkZWxldGVFdmVudCk9XCJkZWxldGVUYXNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChlZGl0RXZlbnQpPVwiZWRpdFRhc2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGRheVNlbGVjdCk9XCJkYXlTZWxlY3QuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKHJhbmdlU2VsZWN0KT1cIm9uUmFuZ2VTZWxlY3QoJGV2ZW50KVwiXG4gICAgPjwvYmMtY2FsZW5kYXItd2Vlaz5cbjwvbmctdGVtcGxhdGU+XG4iXX0=
230
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItY29udGFpbmVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2JhcnNhLWNhbGVuZGFyL3NyYy9saWIvY2FsZW5kYXItY29udGFpbmVyL2NhbGVuZGFyLWNvbnRhaW5lci5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLWNvbnRhaW5lci9jYWxlbmRhci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNILHVCQUF1QixFQUV2QixTQUFTLEVBRVQsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBR04sU0FBUyxFQUNaLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxlQUFlLEVBQUUsYUFBYSxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0RSxPQUFPLEVBQUUsR0FBRyxFQUFFLFNBQVMsRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzRCxPQUFPLEVBRUgsdUJBQXVCLEVBQ3ZCLFdBQVcsRUFDWCxVQUFVLEVBQ1YsY0FBYyxFQU9qQixNQUFNLHNCQUFzQixDQUFDOzs7Ozs7Ozs7Ozs7O0FBaUI5QixNQUFNLE9BQU8sMEJBQ1QsU0FBUSx1QkFBZ0Q7SUFpQ3hELFlBQ1ksVUFBeUIsRUFDekIsYUFBK0IsRUFDL0IsZ0JBQWlDLEVBQ2pDLFlBQXlCLEVBQ3ZCLEdBQWUsRUFDZixJQUF1QixFQUN2QixVQUFxQixFQUNyQixtQkFBMkMsRUFDM0MsZUFBK0IsRUFDL0IsY0FBNkI7UUFFdkMsS0FBSyxDQUFDLEdBQUcsRUFBRSxJQUFJLEVBQUUsVUFBVSxFQUFFLG1CQUFtQixFQUFFLGVBQWUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQVgzRSxlQUFVLEdBQVYsVUFBVSxDQUFlO1FBQ3pCLGtCQUFhLEdBQWIs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QUFDO3lCQUNyQjtxQkFDSjt3VkFNc0MsT0FBTztzQkFBN0MsU0FBUzt1QkFBQyxRQUFRLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUM1QixjQUFjO3NCQUF0QixLQUFLO2dCQUNHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBQ0csV0FBVztzQkFBbkIsS0FBSztnQkFDSSxVQUFVO3NCQUFuQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU07Z0JBQ0csV0FBVztzQkFBcEIsTUFBTTtnQkFDRyxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFFBQVE7c0JBQWpCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFbGVtZW50UmVmLFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT25Jbml0LFxuICAgIE91dHB1dCxcbiAgICBSZW5kZXJlcjIsXG4gICAgU2ltcGxlQ2hhbmdlcyxcbiAgICBWaWV3Q2hpbGRcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBUaXRsZUNhc2VQaXBlIH0gZnJvbSAnQGFuZ3VsYXIvY29tbW9uJztcblxuaW1wb3J0IHsgQmVoYXZpb3JTdWJqZWN0LCBjb21iaW5lTGF0ZXN0LCBPYnNlcnZhYmxlLCBvZiB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgbWFwLCBzd2l0Y2hNYXAsIHRha2VVbnRpbCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcblxuaW1wb3J0IHtcbiAgICBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyxcbiAgICBSZXBvcnRWaWV3QmFzZUNvbXBvbmVudCxcbiAgICBEYXRlU2VydmljZSxcbiAgICBMb2dTZXJ2aWNlLFxuICAgIGdldERhdGVTZXJ2aWNlLFxuICAgIE1ldGFvYmplY3REYXRhTW9kZWwsXG4gICAgQ2FsZW5kYXJNZXRhb2JqZWN0RGF0YU1vZGVsLFxuICAgIEJiYlRyYW5zbGF0ZVBpcGUsXG4gICAgRmluZENvbHVtbkJ5RGJOYW1lUGlwZSxcbiAgICBVbHZNYWluU2VydmljZSxcbiAgICBQb3J0YWxTZXJ2aWNlXG59IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IENhbGVuZGFyTW9kZSwgQ2FsZW5kYXJNb250aEluZm8sIERheSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBDYWxlbmRhclNlcnZpY2UgfSBmcm9tICcuLi9zZXJ2aWNlcy9jYWxlbmRhci5zZXJ2aWNlJztcblxuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6ICdiYy1jYWxlbmRhci1jb250YWluZXInLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1jb250YWluZXIuY29tcG9uZW50Lmh0bWwnLFxuICAgIHN0eWxlVXJsczogWycuL2NhbGVuZGFyLWNvbnRhaW5lci5jb21wb25lbnQuc2NzcyddLFxuICAgIGNoYW5nZURldGVjdGlvbjogQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3kuT25QdXNoLFxuICAgIHByb3ZpZGVyczogW1xuICAgICAgICB7XG4gICAgICAgICAgICBwcm92aWRlOiBEYXRlU2VydmljZSxcbiAgICAgICAgICAgIHVzZUZhY3Rvcnk6IGdldERhdGVTZXJ2aWNlLFxuICAgICAgICAgICAgZGVwczogW0xvZ1NlcnZpY2VdXG4gICAgICAgIH1cbiAgICBdXG59KVxuZXhwb3J0IGNsYXNzIENhbGVuZGFyQ29udGFpbmVyQ29tcG9uZW50XG4gICAgZXh0ZW5kcyBSZXBvcnRWaWV3QmFzZUNvbXBvbmVudDxVaVJlcG9ydFZpZXdCYXNlU2V0dGluZz5cbiAgICBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzXG57XG4gICAgQFZpZXdDaGlsZCgnZGl2UmVmJywgeyBzdGF0aWM6IHRydWUgfSkgX2RpdlJlZjogRWxlbWVudFJlZjtcbiAgICBASW5wdXQoKSBjYWxlbmRhckZpZWxkcztcbiAgICBASW5wdXQoKSB1c2VyQ2FsZW5kYXJzO1xuICAgIEBJbnB1dCgpIHZpZXdTZXR0aW5nOiBVaUNhbGVuZGFyU2V0dGluZztcbiAgICBAT3V0cHV0KCkgZGVsZXRlVGFzayA9IG5ldyBFdmVudEVtaXR0ZXI8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgZWRpdFRhc2sgPSBuZXcgRXZlbnRFbWl0dGVyPE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG4gICAgQE91dHB1dCgpIHJhbmdlU2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjx7IFtrZXk6IHN0cmluZ106IERhdGUgfT4oKTtcbiAgICBAT3V0cHV0KCkgZGF5U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxEYXRlPigpO1xuICAgIEBPdXRwdXQoKSBsb2FkRGF0YSA9IG5ldyBFdmVudEVtaXR0ZXI8eyBzdGFydDogRGF0ZTsgZW5kOiBhbnkgfT4oKTtcbiAgICBzZWxlY3RlZERheTogRGF5O1xuICAgIHRvZGF5SW5kZXggPSAtMTtcbiAgICBzZWxlY3RlZEluZGV4OiBhbnk7XG4gICAgY2FsZW5kYXJzOiBDYWxlbmRhck1vbnRoSW5mb1tdO1xuICAgIHNob3dFdmVudHM6IGJvb2xlYW47XG4gICAgd2lkdGg6IG51bWJlcjtcbiAgICBoZWlnaHQ6IG51bWJlcjtcbiAgICBzZWxlY3RlZE1vbnRoJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vbnRoSW5mbz47XG4gICAgdG9kYXk6IERhdGU7XG4gICAgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIHdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBtb2RlJDogT2JzZXJ2YWJsZTxDYWxlbmRhck1vZGU+O1xuICAgIHNlbGVjdGVkV2VlayQ6IE9ic2VydmFibGU8bnVtYmVyPjtcbiAgICB3ZWVrTW9kZURheXMkOiBPYnNlcnZhYmxlPERheVtdPjtcbiAgICBkYXlzJDogT2JzZXJ2YWJsZTxEYXlbXT47XG4gICAgd2Vla3NDb3VudDogbnVtYmVyO1xuICAgIGZpcnN0V2Vla0luZGV4OiBudW1iZXI7XG4gICAgbW9udGhXZWVrc0NvdW50JDogT2JzZXJ2YWJsZTxudW1iZXI+O1xuICAgIG1vZGVUaXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICB0aXRsZSQ6IE9ic2VydmFibGU8c3RyaW5nPjtcbiAgICBldmVudE1vRGF0YUxpc3QkID0gbmV3IEJlaGF2aW9yU3ViamVjdDxNZXRhb2JqZWN0RGF0YU1vZGVsW10+KFtdKTtcbiAgICBjb25zdHJ1Y3RvcihcbiAgICAgICAgcHJpdmF0ZSBfdGl0bGVDYXNlOiBUaXRsZUNhc2VQaXBlLFxuICAgICAgICBwcml2YXRlIF9iYmJUcmFuc2xhdGU6IEJiYlRyYW5zbGF0ZVBpcGUsXG4gICAgICAgIHByaXZhdGUgX2NhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlLFxuICAgICAgICBwcml2YXRlIF9kYXRlU2VydmljZTogRGF0ZVNlcnZpY2UsXG4gICAgICAgIHByb3RlY3RlZCBfZWw6IEVsZW1lbnRSZWYsXG4gICAgICAgIHByb3RlY3RlZCBfY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcbiAgICAgICAgcHJvdGVjdGVkIF9yZW5kZXJlcjI6IFJlbmRlcmVyMixcbiAgICAgICAgcHJvdGVjdGVkIF9maW5kQ29sdW1uQnlEYk5hbWU6IEZpbmRDb2x1bW5CeURiTmFtZVBpcGUsXG4gICAgICAgIHByb3RlY3RlZCBfdWx2TWFpblNlcnZpY2U6IFVsdk1haW5TZXJ2aWNlLFxuICAgICAgICBwcm90ZWN0ZWQgX3BvcnRhbFNlcnZpY2U6IFBvcnRhbFNlcnZpY2VcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2VsLCBfY2RyLCBfcmVuZGVyZXIyLCBfZmluZENvbHVtbkJ5RGJOYW1lLCBfdWx2TWFpblNlcnZpY2UsIF9wb3J0YWxTZXJ2aWNlKTtcbiAgICB9XG4gICAgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuY2FsZW5kYXJGaWVsZHMgPSB0aGlzLmNvbnRleHRTZXR0aW5nLlZpZXcuQ2FsZW5kYXJGaWVsZHM7XG4gICAgICAgIGlmICh0aGlzLnZpZXdTZXR0aW5nPy5DYWxlbmRhckNvbG9yRmllbGQpIHtcbiAgICAgICAgICAgIHRoaXMuY2FsZW5kYXJGaWVsZHMuQ29sb3IgPSB0aGlzLnZpZXdTZXR0aW5nLkNhbGVuZGFyQ29sb3JGaWVsZDtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnVzZXJDYWxlbmRhcnMgPSB0aGlzLmNvbnRleHRTZXR0aW5nLlZpZXcuVXNlckNhbGVuZGFycztcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlKCk7XG4gICAgICAgIHRoaXMuX3NldFdpZHRoQW5kSGVpZ2h0KCk7XG4gICAgICAgIHRoaXMucHJlcGFyZU1vRGF0YUxpc3QodGhpcy5tb0RhdGFMaXN0KTtcbiAgICAgICAgdGhpcy5zZWxlY3RlZE1vbnRoJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChtb250aDogQ2FsZW5kYXJNb250aEluZm8pID0+IHtcbiAgICAgICAgICAgIHRoaXMubG9hZERhdGEuZW1pdCh7XG4gICAgICAgICAgICAgICAgc3RhcnQ6IG1vbnRoLmRheXNbMF0uZGF0ZSxcbiAgICAgICAgICAgICAgICBlbmQ6IG1vbnRoLmRheXNbbW9udGguZGF5cy5sZW5ndGggLSAxXS5kYXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gdGhpcy5zZXRUYXNrcyh0aGlzLmNhbGVuZGFycywgdGhpcy5tb0RhdGFMaXN0LCB0aGlzLmNhbGVuZGFyRmllbGRzKTtcbiAgICB9XG4gICAgbmdPbkNoYW5nZXMoY2hhbmdlczogU2ltcGxlQ2hhbmdlcyk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uQ2hhbmdlcyhjaGFuZ2VzKTtcbiAgICAgICAgY29uc3QgeyBtb0RhdGFMaXN0LCBkZXZpY2VTaXplIH0gPSBjaGFuZ2VzO1xuICAgICAgICBpZiAobW9EYXRhTGlzdCAmJiAhbW9EYXRhTGlzdC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5wcmVwYXJlTW9EYXRhTGlzdChjaGFuZ2VzLm1vRGF0YUxpc3QuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldmljZVNpemUgJiYgIWRldmljZVNpemUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX3NldFdpZHRoQW5kSGVpZ2h0KCk7XG4gICAgICAgICAgICB0aGlzLl9jZHIuZGV0ZWN0Q2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuICAgIG9uQ2FsZW5kYXJDaGVja0NoYW5nZShjYWxlbmRhcjogTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9oYW5kbGVVc2VyQ2FsZW5kYXJzQ2hlY2tlZCgpO1xuICAgIH1cbiAgICBvbkRheUNsaWNrKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5zZXRNb2RlKCdkYXknLCBkYXkpO1xuICAgIH1cbiAgICBvblNob3dUYXNrKCk6IHZvaWQge31cbiAgICBvblNsaWRlQ2hhbmdlKHNlbGVjdGVkOiBDYWxlbmRhck1vbnRoSW5mbyk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2V0U2VsZWN0ZWQoc2VsZWN0ZWQpO1xuICAgIH1cbiAgICBvbk1vbnRoQ2Fyb3VzZWxMb2FkZWQoeyBvYmplY3QgfSk6IHZvaWQge1xuICAgICAgICBvYmplY3Quc2VsZWN0ZWRQYWdlID0gMTtcbiAgICB9XG5cbiAgICBvblRvZGF5KCk6IHZvaWQge1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZ290b1RvZGF5KCk7XG4gICAgfVxuICAgIG9uTW9kZUNoYW5nZShtb2RlOiBDYWxlbmRhck1vZGUpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnNldE1vZGUobW9kZSk7XG4gICAgfVxuICAgIG9uUmFuZ2VDaGFuZ2UoZTogeyBzdGFydERheTogRGF5OyBlbmREYXk6IERheTsgbW9udGhJbmZvOiBDYWxlbmRhck1vbnRoSW5mbyB9KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5yYW5nZVNlbGVjdChlLnN0YXJ0RGF5LCBlLmVuZERheSwgZS5tb250aEluZm8pO1xuICAgIH1cbiAgICBvblByZXZUYXAoKTogdm9pZCB7XG4gICAgICAgIC8vICAgdGhpcy5nb3RvUGFnZSh0aGlzLm1vbnRoQ2Fyb3VzZWxWaWV3Lm5hdGl2ZUVsZW1lbnQuc2VsZWN0ZWRQYWdlIC0gMSk7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkUHJldmlvdXMoKTtcbiAgICB9XG5cbiAgICBvbk5leHRUYXAoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2NhbGVuZGFyU2VydmljZS5sb2FkTmV4dCgpO1xuICAgICAgICAvLyB0aGlzLmdvdG9QYWdlKHRoaXMubW9udGhDYXJvdXNlbFZpZXcubmF0aXZlRWxlbWVudC5zZWxlY3RlZFBhZ2UgKyAxKTtcbiAgICB9XG5cbiAgICBvblNlbGVjdGVkQ2hhbmdlKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWREYXkgPSB7IC4uLmRheSB9O1xuICAgIH1cbiAgICBvblJhbmdlU2VsZWN0KHsgc3RhcnREYXRlLCBlbmREYXRlIH0pOiB2b2lkIHtcbiAgICAgICAgY29uc3QgeCA9IHsgW3RoaXMuY2FsZW5kYXJGaWVsZHMuU3RhcnREYXRlXTogc3RhcnREYXRlLCBbdGhpcy5jYWxlbmRhckZpZWxkcy5FbmREYXRlXTogZW5kRGF0ZSB9O1xuICAgICAgICB0aGlzLnJhbmdlU2VsZWN0LmVtaXQoeCk7XG4gICAgfVxuXG4gICAgcHJlcGFyZU1vRGF0YUxpc3QobW9EYXRhTGlzdDogTWV0YW9iamVjdERhdGFNb2RlbFtdKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZXZlbnRNb0RhdGFMaXN0JC5uZXh0KFxuICAgICAgICAgICAgbW9EYXRhTGlzdC5tYXAoKGV2ZW50KSA9PiAoe1xuICAgICAgICAgICAgICAgIC4uLmV2ZW50LFxuICAgICAgICAgICAgICAgIGlkOiBldmVudC5JZCwgLy8gYmVjYXVzZSBpbiBjb3JlLmpzIGNhbGVuZGFyIHNlbGVjdGlvbiBhZGFwdGVyIHJlYWQgaWQgd2l0aCBsb3dlcmNhc2VcbiAgICAgICAgICAgICAgICAkU3RhcnREYXRlSW5mbzogdGhpcy5fZGF0ZVNlcnZpY2UuZ2V0RGF0ZUluZm8oZXZlbnRbdGhpcy5jYWxlbmRhckZpZWxkcy5TdGFydERhdGVdKSxcbiAgICAgICAgICAgICAgICAkRW5kRGF0ZUluZm86IHRoaXMuX2RhdGVTZXJ2aWNlLmdldERhdGVJbmZvKGV2ZW50W3RoaXMuY2FsZW5kYXJGaWVsZHMuRW5kRGF0ZV0pXG4gICAgICAgICAgICB9KSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBhZGRUZCh0YWJsZTogYW55W10sIHRyOiBhbnlbXSwgZXZlbnQ6IENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbCwgY29sU3BhbjogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IGNvbFNwYW5Db3VudCA9IHRyLmxlbmd0aCA+IDAgPyB0ci5tYXAoKGMpID0+IGMuY29sU3BhbikucmVkdWNlKChhLCBiKSA9PiBhICsgYikgPiA2IDogMDtcbiAgICAgICAgaWYgKGNvbFNwYW5Db3VudCkge1xuICAgICAgICAgICAgdGFibGUucHVzaCh0cik7XG4gICAgICAgICAgICB0ciA9IFtdO1xuICAgICAgICB9XG4gICAgICAgIHRyLnB1c2goeyB0eXBlOiAndGQnLCBjb2xTcGFuLCBldmVudCB9KTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfaGFuZGxlVXNlckNhbGVuZGFyc0NoZWNrZWQoKTogdm9pZCB7XG4gICAgICAgIGNvbnN0IHVzZXJDYWxlbmRhcnMgPSB0aGlzLnVzZXJDYWxlbmRhcnM/LkRhdGE/Lk1vRGF0YUxpc3Q7XG4gICAgICAgIGlmICghdXNlckNhbGVuZGFycz8ubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgY29uc3QgY2FsZW5kYXJzID0gdXNlckNhbGVuZGFycy5maWx0ZXIoKGMpID0+IGMuJElzQ2hlY2tlZCkubWFwKChjKSA9PiBjLklkKTtcbiAgICAgICAgbGV0IG1vTGlzdCA9IHRoaXMubW9EYXRhTGlzdDtcblxuICAgICAgICBpZiAoY2FsZW5kYXJzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIG1vTGlzdCA9IHRoaXMubW9EYXRhTGlzdC5maWx0ZXIoXG4gICAgICAgICAgICAgICAgKGMpID0+IGNbdGhpcy5jYWxlbmRhckZpZWxkcy5DYWxlbmRhcl0gJiYgY2FsZW5kYXJzLmluZGV4T2YoY1t0aGlzLmNhbGVuZGFyRmllbGRzLkNhbGVuZGFyXS5JZCkgPiAtMVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnByZXBhcmVNb0RhdGFMaXN0KG1vTGlzdCk7XG4gICAgfVxuICAgIHByaXZhdGUgcHJlcGFyZSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy53ZWVrRGF5c01pbiA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrRGF5c01pbigpO1xuICAgICAgICB0aGlzLndlZWtEYXlzID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLndlZWtEYXlzKCk7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWRNb250aCQgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWQkO1xuICAgICAgICB0aGlzLmRheXMkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmRheXMkO1xuICAgICAgICB0aGlzLnRvZGF5ID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLnRvZGF5O1xuICAgICAgICB0aGlzLm1vZGUkID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLm1vZGUkO1xuXG4gICAgICAgIHRoaXMubW9udGhXZWVrc0NvdW50JCA9IHRoaXMubW9kZSQucGlwZShcbiAgICAgICAgICAgIG1hcCgobW9kZSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnbW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc2VsZWN0ZWRNb250aC53ZWVrc0NvdW50O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICk7XG4gICAgICAgIHRoaXMubW9kZVRpdGxlJCA9IGNvbWJpbmVMYXRlc3QoW3RoaXMuZGF5cyQsIHRoaXMubW9kZSRdKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbLCBtb2RlXSkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChtb2RlID09PSAnY3VzdG9tTW9udGgnKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvZihgJHt0aGlzLl9jYWxlbmRhclNlcnZpY2Uud2Vla3NDb3VudH0gICR7dGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSgnV2VlaycpfWApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YodGhpcy5fYmJiVHJhbnNsYXRlLnRyYW5zZm9ybSh0aGlzLl90aXRsZUNhc2UudHJhbnNmb3JtKG1vZGUpKSk7XG4gICAgICAgICAgICB9KVxuICAgICAgICApO1xuXG4gICAgICAgIHRoaXMud2Vla01vZGVEYXlzJCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS53ZWVrTW9kZURheXMkO1xuICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuY2FsZW5kYXJzJC5waXBlKHRha2VVbnRpbCh0aGlzLl9vbkRlc3Ryb3kkKSkuc3Vic2NyaWJlKChjYWxlbmRhcnMpID0+IHtcbiAgICAgICAgICAgIGNvbnN0IGV2ZW50Q2FsZW5kYXJzID0gWy4uLmNhbGVuZGFyc107XG4gICAgICAgICAgICAvLyBldmVudENhbGVuZGFycyA9IGV2ZW50Q2FsZW5kYXJzLnNwbGljZSh0aGlzLnNlbGVjdGVkSW5kZXgsIDMpO1xuICAgICAgICAgICAgdGhpcy5jYWxlbmRhcnMgPSBldmVudENhbGVuZGFycztcbiAgICAgICAgICAgIC8vIGlmICh0aGlzLm1vbnRoQ2Fyb3VzZWxWaWV3KSB7XG4gICAgICAgICAgICAvLyAgIHRoaXMubW9udGhDYXJvdXNlbFZpZXcubmF0aXZlRWxlbWVudC5zZWxlY3RlZFBhZ2UgPSAxO1xuICAgICAgICAgICAgLy8gfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyAucGlwZSh0YWtlVW50aWwodGhpcy5fb25EZXN0cm95JCkpXG4gICAgICAgIC8vICAgLnN1YnNjcmliZSgodG9kYXlJbmRleCkgPT4ge1xuICAgICAgICAvLyAgICAgdGhpcy5zZWxlY3RlZEluZGV4ID0gdGhpcy50b2RheUluZGV4ID0gdG9kYXlJbmRleDtcbiAgICAgICAgLy8gICAgIHRoaXMuZ290b1BhZ2UodGhpcy50b2RheUluZGV4KTtcbiAgICAgICAgLy8gICB9KTtcbiAgICAgICAgdGhpcy50aXRsZSQgPSBjb21iaW5lTGF0ZXN0KFt0aGlzLndlZWtNb2RlRGF5cyQsIHRoaXMuc2VsZWN0ZWRNb250aCQsIHRoaXMuZGF5cyQsIHRoaXMubW9kZSRdKS5waXBlKFxuICAgICAgICAgICAgdGFrZVVudGlsKHRoaXMuX29uRGVzdHJveSQpLFxuICAgICAgICAgICAgc3dpdGNoTWFwKChbd2Vla01vZGVEYXlzLCBtb250aEluZm8sIGRheXMsIG1vZGVdKSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IG1vbnRoTmFtZSA9IG1vbnRoSW5mby5kYXRlSW5mby5tb250aE5hbWU7XG4gICAgICAgICAgICAgICAgY29uc3QgeWVhciA9IG1vbnRoSW5mby5kYXRlSW5mby5zdHJZZWFyO1xuXG4gICAgICAgICAgICAgICAgaWYgKG1vZGUgIT09ICdtb250aCcpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZpcnN0RGF5SW5mbzogRGF5O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGFzdERheUluZm86IERheTtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF5c1RlbXAgPSBtb2RlID09PSAnY3VzdG9tTW9udGgnID8gZGF5cyA6IHdlZWtNb2RlRGF5cztcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRheXNUZW1wLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0RGF5SW5mbyA9IGRheXNUZW1wWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFzdERheUluZm8gPSBkYXlzVGVtcFtkYXlzVGVtcC5sZW5ndGggLSAxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZSA9IGZpcnN0RGF5SW5mby5tb250aE5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3REYXlJbmZvLm1vbnRoICE9PSBsYXN0RGF5SW5mby5tb250aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vbnRoTmFtZSA9IGAke2ZpcnN0RGF5SW5mby5tb250aE5hbWV9IC1cbiAgICAgICAgICAgICAgJHtsYXN0RGF5SW5mby5tb250aE5hbWV9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gb2YoYCR7bW9udGhOYW1lfSAgJHt5ZWFyfWApO1xuICAgICAgICAgICAgfSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIF9zZXRXaWR0aEFuZEhlaWdodCgpOiB2b2lkIHtcbiAgICAgICAgLy8gY29uc3QgZGl2UmVmPSB0aGlzLl9lbC5uYXRpdmVFbGVtZW50O1xuICAgICAgICBjb25zdCBkaXZSZWYgPSB0aGlzLl9kaXZSZWYubmF0aXZlRWxlbWVudDtcblxuICAgICAgICB0aGlzLndpZHRoID0gZGl2UmVmLm9mZnNldFdpZHRoO1xuICAgICAgICB0aGlzLmhlaWdodCA9IGRpdlJlZi5vZmZzZXRIZWlnaHQgLSA0NTtcbiAgICB9XG59XG5pbnRlcmZhY2UgVWlDYWxlbmRhclNldHRpbmcgZXh0ZW5kcyBVaVJlcG9ydFZpZXdCYXNlU2V0dGluZyB7XG4gICAgQ2FsZW5kYXJDb2xvckZpZWxkOiBzdHJpbmc7XG59XG4iLCI8ZGl2IHN0eWxlPVwiZGlzcGxheTogZmxleDsgd2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJTsgZmxleC1kaXJlY3Rpb246IHJvd1wiPlxuICAgIEBpZiAoZGV2aWNlU2l6ZSAhPT0gJ3MnICYmIGRldmljZVNpemUgIT09ICdtJykge1xuICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMzIwcHg7IGhlaWdodDogMTAwJVwiPlxuICAgICAgICA8YmMtY2FsZW5kYXItc2VsZWN0aW9uLWRheXNcbiAgICAgICAgICAgIFtpbmxpbmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICBbbW9udGhJbmZvXT1cIihzZWxlY3RlZE1vbnRoJCB8IGFzeW5jKSEhXCJcbiAgICAgICAgICAgIChyYW5nZUNoYW5nZSk9XCJvblJhbmdlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICA+PC9iYy1jYWxlbmRhci1zZWxlY3Rpb24tZGF5cz5cbiAgICAgICAgPGRpdiBzdHlsZT1cImhlaWdodDogMXB4OyBiYWNrZ3JvdW5kOiAjY2NjXCI+PC9kaXY+XG4gICAgICAgIEBpZiAodXNlckNhbGVuZGFycz8uRGF0YT8uTW9EYXRhTGlzdD8ubGVuZ3RoKSB7XG4gICAgICAgIDxkaXY+XG4gICAgICAgICAgICA8aDQ+2KrZgtmI24zZheKAjNmH2KfbjOKAjNmF2YY8L2g0PlxuICAgICAgICAgICAgQGZvciAoY2FsZW5kYXIgb2YgdXNlckNhbGVuZGFycy5EYXRhLk1vRGF0YUxpc3Q7IHRyYWNrIGNhbGVuZGFyKSB7XG4gICAgICAgICAgICA8dWwgZmQtbGlzdD5cbiAgICAgICAgICAgICAgICA8bGkgZmQtbGlzdC1pdGVtIHN0eWxlPVwicGFkZGluZzogMFwiIGNsYXNzPVwidXNlci1jYWxlbmRhclwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhblxuICAgICAgICAgICAgICAgICAgICAgICAgW3N0eWxlLmJhY2tncm91bmRdPVwiY2FsZW5kYXIuQ29sb3IgPyBjYWxlbmRhci5Db2xvciA6IG51bGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGU9XCJ3aWR0aDogNXB4OyBoZWlnaHQ6IDEwMCU7IHBvc2l0aW9uOiBhYnNvbHV0ZVwiXG4gICAgICAgICAgICAgICAgICAgID48L3NwYW4+XG4gICAgICAgICAgICAgICAgICAgIDxmZC1jaGVja2JveFxuICAgICAgICAgICAgICAgICAgICAgICAgWyhuZ01vZGVsKV09XCJjYWxlbmRhci4kSXNDaGVja2VkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjaGFuZ2UpPVwib25DYWxlbmRhckNoZWNrQ2hhbmdlKGNhbGVuZGFyKVwiXG4gICAgICAgICAgICAgICAgICAgID48L2ZkLWNoZWNrYm94PlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBmZC1saXN0LXRpdGxlPnt7IGNhbGVuZGFyLiRDYXB0aW9uIH19PC9zcGFuPlxuICAgICAgICAgICAgICAgIDwvbGk+XG4gICAgICAgICAgICA8L3VsPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L2Rpdj5cbiAgICAgICAgfVxuICAgIDwvZGl2PlxuICAgIH1cbiAgICA8ZGl2IHN0eWxlPVwiZmxleDogMVwiICNkaXZSZWY+XG4gICAgICAgIDxiYy1jYWxlbmRhci1oZWFkZXJcbiAgICAgICAgICAgIFttb250aEluZm9dPVwiKHNlbGVjdGVkTW9udGgkIHwgYXN5bmMpISFcIlxuICAgICAgICAgICAgW3dlZWtNb2RlRGF5c109XCIod2Vla01vZGVEYXlzJCB8IGFzeW5jKSEhXCJcbiAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxuICAgICAgICAgICAgW21vZGVdPVwiKG1vZGUkIHwgYXN5bmMpISFcIlxuICAgICAgICAgICAgW21vZGVUaXRsZV09XCIobW9kZVRpdGxlJCB8IGFzeW5jKSEhXCJcbiAgICAgICAgICAgIFt0aXRsZV09XCIodGl0bGUkIHwgYXN5bmMpISFcIlxuICAgICAgICAgICAgKG1vZGVDaGFuZ2UpPVwib25Nb2RlQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgKHByZXZUYXApPVwib25QcmV2VGFwKClcIlxuICAgICAgICAgICAgKG5leHRUYXApPVwib25OZXh0VGFwKClcIlxuICAgICAgICAgICAgKHRvZGF5KT1cIm9uVG9kYXkoKVwiXG4gICAgICAgICAgICAocmFuZ2VDaGFuZ2UpPVwib25SYW5nZUNoYW5nZSgkZXZlbnQpXCJcbiAgICAgICAgPlxuICAgICAgICA8L2JjLWNhbGVuZGFyLWhlYWRlcj5cbiAgICAgICAgQHN3aXRjaCAobW9kZSQgfCBhc3luYykgeyBAY2FzZSAoJ3dlZWsnKSB7XG4gICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgd2Vla0NhbGVuZGFyO1xuICAgICAgICAgICAgICAgIGNvbnRleHQ6IHtcbiAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBzZWxlY3RlZE1vbnRoJCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICBtb0RhdGFMaXN0OiBldmVudE1vRGF0YUxpc3QkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHdpZHRoOiB3aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBoZWlnaHQsXG4gICAgICAgICAgICAgICAgICAgIHJ0bDogcnRsLFxuICAgICAgICAgICAgICAgICAgICBzaG93RXZlbnRzOiBzaG93RXZlbnRzLFxuICAgICAgICAgICAgICAgICAgICB3ZWVrTW9kZURheXM6IHdlZWtNb2RlRGF5cyQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgdG9kYXk6IHRvZGF5LFxuICAgICAgICAgICAgICAgICAgICBkZXZpY2VTaXplOiBkZXZpY2VTaXplLFxuICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckZpZWxkczogY2FsZW5kYXJGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgIGFjY2VzczogYWNjZXNzXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICB9IEBjYXNlICgnZGF5Jykge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIHdlZWtDYWxlbmRhcjtcbiAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogc2VsZWN0ZWRNb250aCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgbW9EYXRhTGlzdDogZXZlbnRNb0RhdGFMaXN0JCB8IGFzeW5jLFxuICAgICAgICAgICAgICAgICAgICB3aWR0aDogd2lkdGgsXG4gICAgICAgICAgICAgICAgICAgIGhlaWdodDogaGVpZ2h0LFxuICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCxcbiAgICAgICAgICAgICAgICAgICAgc2hvd0V2ZW50czogc2hvd0V2ZW50cyxcbiAgICAgICAgICAgICAgICAgICAgd2Vla01vZGVEYXlzOiB3ZWVrTW9kZURheXMkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICBhY2Nlc3M6IGFjY2Vzc1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIFwiXG4gICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgfSBAY2FzZSAoJ2xpc3QnKSB7IH0gQGRlZmF1bHQge1xuICAgICAgICA8bmctY29udGFpbmVyXG4gICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgIG1vbnRoQ2FsZW5kYXI7XG4gICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IGRheXMkIHwgYXN5bmMsXG4gICAgICAgICAgICAgICAgICAgIG1vRGF0YUxpc3Q6IGV2ZW50TW9EYXRhTGlzdCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgd2lkdGg6IHdpZHRoLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQ6IGhlaWdodCxcbiAgICAgICAgICAgICAgICAgICAgcnRsOiBydGwsXG4gICAgICAgICAgICAgICAgICAgIHNob3dFdmVudHM6IHNob3dFdmVudHMsXG4gICAgICAgICAgICAgICAgICAgIHRvZGF5OiB0b2RheSxcbiAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICBtb250aFdlZWtzQ291bnQ6IG1vbnRoV2Vla3NDb3VudCQgfCBhc3luYyxcbiAgICAgICAgICAgICAgICAgICAgYWNjZXNzOiBhY2Nlc3NcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICBcIlxuICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgIH0gfVxuICAgIDwvZGl2PlxuPC9kaXY+XG48bmctdGVtcGxhdGVcbiAgICAjbW9udGhDYWxlbmRhclxuICAgIGxldC1kYXlzXG4gICAgbGV0LW1vRGF0YUxpc3Q9XCJtb0RhdGFMaXN0XCJcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LWNhbGVuZGFyRmllbGRzPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC10b2RheT1cInRvZGF5XCJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxuICAgIGxldC1kZXZpY2VTaXplPVwiZGV2aWNlU2l6ZVwiXG4gICAgbGV0LW1vbnRoV2Vla3NDb3VudD1cIm1vbnRoV2Vla3NDb3VudFwiXG4gICAgbGV0LWFjY2Vzcz1cImFjY2Vzc1wiXG4+XG4gICAgPGJjLWNhbGVuZGFyLW1vbnRoXG4gICAgICAgIFtzdHlsZS53aWR0aF09XCJ3aWR0aFwiXG4gICAgICAgIFtjb250YWluZXJIZWlnaHRdPVwicGFyZW50SGVpZ2h0ICE9PSAwID8gcGFyZW50SGVpZ2h0IDogaGVpZ2h0XCJcbiAgICAgICAgW2NvbnRhaW5lcldpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcbiAgICAgICAgW21vRGF0YUxpc3RdPVwibW9EYXRhTGlzdFwiXG4gICAgICAgIFttb250aFdlZWtzQ291bnRdPVwibW9udGhXZWVrc0NvdW50XCJcbiAgICAgICAgW3J0bF09XCJydGxcIlxuICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxuICAgICAgICBbd2Vla0RheXNNaW5dPVwid2Vla0RheXNNaW5cIlxuICAgICAgICBbdG9kYXldPVwidG9kYXlcIlxuICAgICAgICBbc2hvd0V2ZW50c109XCJzaG93RXZlbnRzXCJcbiAgICAgICAgW2RheXNdPVwiZGF5c1wiXG4gICAgICAgIFtjYW5WaWV3XT1cImFjY2Vzcy5WaWV3XCJcbiAgICAgICAgW2NhbkFkZF09XCJhY2Nlc3MuQWRkXCJcbiAgICAgICAgW2NhbkVkaXRdPVwiYWNjZXNzLkVkaXRcIlxuICAgICAgICBbY2FuRGVsZXRlXT1cImFjY2Vzcy5EZWxldGVcIlxuICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgKGRheUNsaWNrKT1cIm9uRGF5Q2xpY2soJGV2ZW50KVwiXG4gICAgICAgIChzaG93RXZlbnQpPVwib25TaG93VGFzaygpXCJcbiAgICAgICAgKGRlbGV0ZUV2ZW50KT1cImRlbGV0ZVRhc2suZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgKGVkaXRFdmVudCk9XCJlZGl0VGFzay5lbWl0KCRldmVudClcIlxuICAgICAgICAoZGF5U2VsZWN0KT1cImRheVNlbGVjdC5lbWl0KCRldmVudClcIlxuICAgID48L2JjLWNhbGVuZGFyLW1vbnRoPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlICNsaXN0Q2FsZW5kYXI+XG4gICAgPGJjLWNhbGVuZGFyLWxpc3QtY29udGFpbmVyXG4gICAgICAgIFtzaG93RXZlbnRzXT1cInNob3dFdmVudHNcIlxuICAgICAgICBbc2VsZWN0ZWREYXldPVwic2VsZWN0ZWREYXlcIlxuICAgICAgICBbY2FsZW5kYXJGaWVsZHNdPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgICAgICAoc2hvd0V2ZW50c1RhcCk9XCJzaG93RXZlbnRzID0gIXNob3dFdmVudHNcIlxuICAgID48L2JjLWNhbGVuZGFyLWxpc3QtY29udGFpbmVyPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICAgI3dlZWtDYWxlbmRhclxuICAgIGxldC1zZWxlY3RlZE1vbnRoXG4gICAgbGV0LW1vRGF0YUxpc3Q9XCJtb0RhdGFMaXN0XCJcbiAgICBsZXQtd2lkdGg9XCJ3aWR0aFwiXG4gICAgbGV0LWhlaWdodD1cImhlaWdodFwiXG4gICAgbGV0LWNhbGVuZGFyRmllbGRzPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC10b2RheT1cInRvZGF5XCJcbiAgICBsZXQtc2hvd0V2ZW50cz1cInNob3dFdmVudHNcIlxuICAgIGxldC1kZXZpY2VTaXplPVwiZGV2aWNlU2l6ZVwiXG4gICAgbGV0LXdlZWtNb2RlRGF5cz1cIndlZWtNb2RlRGF5c1wiXG4gICAgbGV0LWFjY2Vzcz1cImFjY2Vzc1wiXG4+XG4gICAgPGJjLWNhbGVuZGFyLXdlZWtcbiAgICAgICAgW3N0eWxlLndpZHRoXT1cIndpZHRoXCJcbiAgICAgICAgW2NvbnRhaW5lckhlaWdodF09XCJwYXJlbnRIZWlnaHQgIT09IDAgPyBwYXJlbnRIZWlnaHQgOiBoZWlnaHRcIlxuICAgICAgICBbY29udGFpbmVyV2lkdGhdPVwid2lkdGhcIlxuICAgICAgICBbaW5EaWFsb2ddPVwiaW5EaWFsb2dcIlxuICAgICAgICBbY2FsZW5kYXJGaWVsZHNdPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgICAgICBbbW9EYXRhTGlzdF09XCJtb0RhdGFMaXN0XCJcbiAgICAgICAgW3J0bF09XCJydGxcIlxuICAgICAgICBbY2FuQWRkXT1cImFjY2Vzcy5BZGRcIlxuICAgICAgICBbY2FuVmlld109XCJhY2Nlc3MuVmlld1wiXG4gICAgICAgIFtjYW5FZGl0XT1cImFjY2Vzcy5FZGl0XCJcbiAgICAgICAgW2NhbkRlbGV0ZV09XCJhY2Nlc3MuRGVsZXRlXCJcbiAgICAgICAgW3dlZWtEYXlzXT1cIndlZWtEYXlzXCJcbiAgICAgICAgW3dlZWtEYXlzTWluXT1cIndlZWtEYXlzTWluXCJcbiAgICAgICAgW3RvZGF5XT1cInRvZGF5XCJcbiAgICAgICAgW3Nob3dFdmVudHNdPVwic2hvd0V2ZW50c1wiXG4gICAgICAgIFtkYXlzXT1cIndlZWtNb2RlRGF5c1wiXG4gICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxuICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljaygkZXZlbnQpXCJcbiAgICAgICAgKHNob3dFdmVudCk9XCJvblNob3dUYXNrKClcIlxuICAgICAgICAoZGVsZXRlRXZlbnQpPVwiZGVsZXRlVGFzay5lbWl0KCRldmVudClcIlxuICAgICAgICAoZWRpdEV2ZW50KT1cImVkaXRUYXNrLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChkYXlTZWxlY3QpPVwiZGF5U2VsZWN0LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgIChyYW5nZVNlbGVjdCk9XCJvblJhbmdlU2VsZWN0KCRldmVudClcIlxuICAgID48L2JjLWNhbGVuZGFyLXdlZWs+XG48L25nLXRlbXBsYXRlPlxuIl19
@@ -24,6 +24,7 @@ export class CalendarMonthComponent extends BaseComponent {
24
24
  this.canDelete = false;
25
25
  this.canAdd = false;
26
26
  this.canEdit = false;
27
+ this.canView = false;
27
28
  this.editEvent = new EventEmitter();
28
29
  this.deleteEvent = new EventEmitter();
29
30
  this.daySelect = new EventEmitter();
@@ -185,11 +186,11 @@ export class CalendarMonthComponent extends BaseComponent {
185
186
  this.weekTasksArray = weekTasksArray;
186
187
  }
187
188
  static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: CalendarMonthComponent, deps: [{ token: i1.DaysInWeekPipe }, { token: i0.ChangeDetectorRef }, { token: i2.CalendarService }], target: i0.ɵɵFactoryTarget.Component }); }
188
- static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", 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\" [fdCompact] [attr.picker]=\"datePicker\">\n <thead fd-table-header>\n <tr fd-table-row>\n @for (weekDay of selectedWeekDays; track weekDay) {\n <th class=\"weekday-header\" fd-table-cell [class.noborder]=\"isPickerMode\">\n {{ weekDay | slice: 0:1 }}\n </th>\n }\n </tr>\n </thead>\n <tbody fd-table-body>\n @for (weekDay of numberOfWeek; track weekDay) {\n <tr fd-table-row>\n <td [style.height.px]=\"dayHeight\" fd-table-cell colspan=\"7\" [style.border]=\"isPickerMode ? 'none' : null\">\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 deviceSize: deviceSize,\n rtl: rtl,\n isPickerMode: isPickerMode\n }\n \"\n ></ng-container>\n </td>\n </tr>\n }\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 @for (day of days; track day) {\n <td fd-table-cell [class.noborder]=\"isPickerMode\">\n <bc-day-number-box\n [ngClass]=\"{\n 'fd-calendar__item': isPickerMode,\n '!tw-border !tw-rounded-md tw-transition-all tw-cursor-pointer':\n isPickerMode && day.isInMonth,\n '!tw-bg-transparent tw-border-gray-100 hover:!tw-border-gray-300':\n isPickerMode && day.isInMonth && !day.isToday,\n 'fd-calendar__item--other-month': isPickerMode && !day.isInMonth,\n 'fd-calendar__item--weekend': isPickerMode && day.isWeekend,\n '!tw-bg-blue-500 hover:!tw-bg-blue-600': day.isToday\n }\"\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 }\n </tr>\n @if (!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 @for (day of days; track day) {\n <td fd-table-cell class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\n @if (maxRowTasks?.length < day.tasks.length) {\n <button fd-button (click)=\"onMoreButton($event, popover)\" [fdType]=\"'transparent'\" [compact]=\"true\">\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 }\n </td>\n }\n </tr>\n }\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 @for (rowTask of maxRowTasks; track rowTask; let i = $index) {\n <tr fd-table-row>\n @if (!weekTasks[i] || weekTasks[i].length === 0) { @for (day of weekDays; track day) {\n <td fd-table-cell></td>\n } } @for (task of weekTasks[i]; track task; let dayIndex = $index) { @if (task.colSpan) {\n <td fd-table-cell [attr.colspan]=\"task.colSpan\">\n @if (task.event) {\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 } @else {\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\n }\n </td>\n } }\n </tr>\n }\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;overflow:hidden;position:relative;height:2.5rem;margin:.125rem;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;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.fd-calendar__item--range{border:.0625rem solid var(--sapList_SelectionBorderColor, #0854a0);background-color:var(--sapList_SelectionBackgroundColor, #e5f0fa)}table[picker=true] thead,table[picker=true] tbody{border:none}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.MobileDirective, selector: "[mobile]" }, { kind: "directive", type: i5.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i8.TableComponent, selector: "table[fd-table]", inputs: ["noBorderX", "noBorderY", "noOuterBorder", "topBorder", "popIn", "responsive", "keys", "allCellsFocusable"], exportAs: ["fd-table"] }, { kind: "directive", type: i8.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i8.TableBodyDirective, selector: "[fdTableBody], [fd-table-body]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i8.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i8.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "key"] }, { kind: "component", type: i9.DayNumberBoxComponent, selector: "bc-day-number-box", inputs: ["isWeekMode", "isSingleDay", "day", "isPickerMode", "itemInRange", "isActive"], outputs: ["dayClick", "dayMouseDown", "dayMouseUp", "dayMouseMove"] }, { kind: "component", type: i10.EventButtonComponent, selector: "bc-event-button", inputs: ["buttonTemplate", "calendarFields", "task", "rtl", "canDelete", "canEdit", "index", "deviceSize"], outputs: ["deleteEvent", "editEvent", "openPopoverChange"] }, { kind: "component", type: i11.DayEventListComponent, selector: "bc-day-event-list", inputs: ["day", "deviceSize", "weekDays", "calendarFields", "rtl", "canDelete", "canEdit", "popover"], outputs: ["deleteEvent", "editEvent", "openPopOver"] }, { kind: "pipe", type: i3.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i1.DaysInWeekPipe, name: "daysInWeek" }, { kind: "pipe", type: i12.EqualDatePipe, name: "equalDate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
189
+ static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "17.0.0", version: "17.3.5", 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", canView: "canView", 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\" [fdCompact] [attr.picker]=\"datePicker\">\n <thead fd-table-header>\n <tr fd-table-row>\n @for (weekDay of selectedWeekDays; track weekDay) {\n <th class=\"weekday-header\" fd-table-cell [class.noborder]=\"isPickerMode\">\n {{ weekDay | slice: 0:1 }}\n </th>\n }\n </tr>\n </thead>\n <tbody fd-table-body>\n @for (weekDay of numberOfWeek; track weekDay) {\n <tr fd-table-row>\n <td [style.height.px]=\"dayHeight\" fd-table-cell colspan=\"7\" [style.border]=\"isPickerMode ? 'none' : null\">\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 deviceSize: deviceSize,\n rtl: rtl,\n isPickerMode: isPickerMode\n }\n \"\n ></ng-container>\n </td>\n </tr>\n }\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 @for (day of days; track day) {\n <td fd-table-cell [class.noborder]=\"isPickerMode\">\n <bc-day-number-box\n [ngClass]=\"{\n 'fd-calendar__item': isPickerMode,\n '!tw-border !tw-rounded-md tw-transition-all tw-cursor-pointer':\n isPickerMode && day.isInMonth,\n '!tw-bg-transparent tw-border-gray-100 hover:!tw-border-gray-300':\n isPickerMode && day.isInMonth && !day.isToday,\n 'fd-calendar__item--other-month': isPickerMode && !day.isInMonth,\n 'fd-calendar__item--weekend': isPickerMode && day.isWeekend,\n '!tw-bg-blue-500 hover:!tw-bg-blue-600': day.isToday\n }\"\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 }\n </tr>\n @if (!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 @for (day of days; track day) {\n <td fd-table-cell class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\n @if (maxRowTasks?.length < day.tasks.length) {\n <button fd-button (click)=\"onMoreButton($event, popover)\" [fdType]=\"'transparent'\" [compact]=\"true\">\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 [canView]=\"canView\"\n [popover]=\"popover\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n ></bc-day-event-list>\n </fd-popover>\n }\n </td>\n }\n </tr>\n }\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 @for (rowTask of maxRowTasks; track rowTask; let i = $index) {\n <tr fd-table-row>\n @if (!weekTasks[i] || weekTasks[i].length === 0) { @for (day of weekDays; track day) {\n <td fd-table-cell></td>\n } } @for (task of weekTasks[i]; track task; let dayIndex = $index) { @if (task.colSpan) {\n <td fd-table-cell [attr.colspan]=\"task.colSpan\">\n @if (task.event) {\n <bc-event-button\n [task]=\"task\"\n [calendarFields]=\"calendarFields\"\n [deviceSize]=\"deviceSize\"\n [rtl]=\"rtl\"\n [canDelete]=\"canDelete\"\n [canEdit]=\"canEdit\"\n [canView]=\"canView\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n (openPopoverChange)=\"onOpenPopoverChange($event)\"\n ></bc-event-button>\n } @else {\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\n }\n </td>\n } }\n </tr>\n }\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;overflow:hidden;position:relative;height:2.5rem;margin:.125rem;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;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.fd-calendar__item--range{border:.0625rem solid var(--sapList_SelectionBorderColor, #0854a0);background-color:var(--sapList_SelectionBackgroundColor, #e5f0fa)}table[picker=true] thead,table[picker=true] tbody{border:none}\n"], dependencies: [{ kind: "directive", type: i3.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.MobileDirective, selector: "[mobile]" }, { kind: "directive", type: i5.ContentDensityDirective, selector: "[fdContentDensity]:not([fdCompact]):not([fdCondensed]):not([fdCozy]), [fdCompact]:not([fdContentDensity]):not([fdCondensed]):not([fdCozy]), [fdCondensed]:not([fdContentDensity]):not([fdCompact]):not([fdCozy]), [fdCozy]:not([fdContentDensity]):not([fdCompact]):not([fdCondensed])", inputs: ["fdContentDensity", "fdCompact", "fdCondensed", "fdCozy"], exportAs: ["fdContentDensity"] }, { kind: "component", type: i6.ButtonComponent, selector: "button[fd-button], a[fd-button]", inputs: ["class"], exportAs: ["fd-button"] }, { kind: "component", type: i7.PopoverComponent, selector: "fd-popover", inputs: ["title", "trigger", "fixedPosition", "id", "mobile", "mobileConfig", "preventSpaceKeyScroll"] }, { kind: "component", type: i8.TableComponent, selector: "table[fd-table]", inputs: ["noBorderX", "noBorderY", "noOuterBorder", "topBorder", "popIn", "responsive", "keys", "allCellsFocusable"], exportAs: ["fd-table"] }, { kind: "directive", type: i8.TableHeaderDirective, selector: "[fdTableHeader], [fd-table-header]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i8.TableBodyDirective, selector: "[fdTableBody], [fd-table-body]", inputs: ["noBorderX", "noBorderY"] }, { kind: "directive", type: i8.TableRowDirective, selector: "[fdTableRow], [fd-table-row]", inputs: ["activable", "highlightActive", "hoverable", "focusable", "main", "secondary", "active"] }, { kind: "directive", type: i8.TableCellDirective, selector: "[fdTableCell], [fd-table-cell]", inputs: ["noBorderX", "noBorderY", "activable", "focusable", "hoverable", "fitContent", "noPadding", "noData", "key"] }, { kind: "component", type: i9.DayNumberBoxComponent, selector: "bc-day-number-box", inputs: ["isWeekMode", "isSingleDay", "day", "isPickerMode", "itemInRange", "isActive"], outputs: ["dayClick", "dayMouseDown", "dayMouseUp", "dayMouseMove"] }, { kind: "component", type: i10.EventButtonComponent, selector: "bc-event-button", inputs: ["buttonTemplate", "calendarFields", "task", "rtl", "canDelete", "canEdit", "canView", "index", "deviceSize"], outputs: ["deleteEvent", "editEvent", "openPopoverChange"] }, { kind: "component", type: i11.DayEventListComponent, selector: "bc-day-event-list", inputs: ["day", "deviceSize", "weekDays", "calendarFields", "rtl", "canDelete", "canEdit", "canView", "popover"], outputs: ["deleteEvent", "editEvent", "openPopOver"] }, { kind: "pipe", type: i3.SlicePipe, name: "slice" }, { kind: "pipe", type: i4.BbbTranslatePipe, name: "bbbTranslate" }, { kind: "pipe", type: i1.DaysInWeekPipe, name: "daysInWeek" }, { kind: "pipe", type: i12.EqualDatePipe, name: "equalDate" }], changeDetection: i0.ChangeDetectionStrategy.OnPush }); }
189
190
  }
190
191
  i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImport: i0, type: CalendarMonthComponent, decorators: [{
191
192
  type: Component,
192
- args: [{ selector: 'bc-calendar-month', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table fd-table class=\"table-header\" [fdCompact] [attr.picker]=\"datePicker\">\n <thead fd-table-header>\n <tr fd-table-row>\n @for (weekDay of selectedWeekDays; track weekDay) {\n <th class=\"weekday-header\" fd-table-cell [class.noborder]=\"isPickerMode\">\n {{ weekDay | slice: 0:1 }}\n </th>\n }\n </tr>\n </thead>\n <tbody fd-table-body>\n @for (weekDay of numberOfWeek; track weekDay) {\n <tr fd-table-row>\n <td [style.height.px]=\"dayHeight\" fd-table-cell colspan=\"7\" [style.border]=\"isPickerMode ? 'none' : null\">\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 deviceSize: deviceSize,\n rtl: rtl,\n isPickerMode: isPickerMode\n }\n \"\n ></ng-container>\n </td>\n </tr>\n }\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 @for (day of days; track day) {\n <td fd-table-cell [class.noborder]=\"isPickerMode\">\n <bc-day-number-box\n [ngClass]=\"{\n 'fd-calendar__item': isPickerMode,\n '!tw-border !tw-rounded-md tw-transition-all tw-cursor-pointer':\n isPickerMode && day.isInMonth,\n '!tw-bg-transparent tw-border-gray-100 hover:!tw-border-gray-300':\n isPickerMode && day.isInMonth && !day.isToday,\n 'fd-calendar__item--other-month': isPickerMode && !day.isInMonth,\n 'fd-calendar__item--weekend': isPickerMode && day.isWeekend,\n '!tw-bg-blue-500 hover:!tw-bg-blue-600': day.isToday\n }\"\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 }\n </tr>\n @if (!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 @for (day of days; track day) {\n <td fd-table-cell class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\n @if (maxRowTasks?.length < day.tasks.length) {\n <button fd-button (click)=\"onMoreButton($event, popover)\" [fdType]=\"'transparent'\" [compact]=\"true\">\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 }\n </td>\n }\n </tr>\n }\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 @for (rowTask of maxRowTasks; track rowTask; let i = $index) {\n <tr fd-table-row>\n @if (!weekTasks[i] || weekTasks[i].length === 0) { @for (day of weekDays; track day) {\n <td fd-table-cell></td>\n } } @for (task of weekTasks[i]; track task; let dayIndex = $index) { @if (task.colSpan) {\n <td fd-table-cell [attr.colspan]=\"task.colSpan\">\n @if (task.event) {\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 } @else {\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\n }\n </td>\n } }\n </tr>\n }\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;overflow:hidden;position:relative;height:2.5rem;margin:.125rem;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;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.fd-calendar__item--range{border:.0625rem solid var(--sapList_SelectionBorderColor, #0854a0);background-color:var(--sapList_SelectionBackgroundColor, #e5f0fa)}table[picker=true] thead,table[picker=true] tbody{border:none}\n"] }]
193
+ args: [{ selector: 'bc-calendar-month', changeDetection: ChangeDetectionStrategy.OnPush, template: "<table fd-table class=\"table-header\" [fdCompact] [attr.picker]=\"datePicker\">\n <thead fd-table-header>\n <tr fd-table-row>\n @for (weekDay of selectedWeekDays; track weekDay) {\n <th class=\"weekday-header\" fd-table-cell [class.noborder]=\"isPickerMode\">\n {{ weekDay | slice: 0:1 }}\n </th>\n }\n </tr>\n </thead>\n <tbody fd-table-body>\n @for (weekDay of numberOfWeek; track weekDay) {\n <tr fd-table-row>\n <td [style.height.px]=\"dayHeight\" fd-table-cell colspan=\"7\" [style.border]=\"isPickerMode ? 'none' : null\">\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 deviceSize: deviceSize,\n rtl: rtl,\n isPickerMode: isPickerMode\n }\n \"\n ></ng-container>\n </td>\n </tr>\n }\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 @for (day of days; track day) {\n <td fd-table-cell [class.noborder]=\"isPickerMode\">\n <bc-day-number-box\n [ngClass]=\"{\n 'fd-calendar__item': isPickerMode,\n '!tw-border !tw-rounded-md tw-transition-all tw-cursor-pointer':\n isPickerMode && day.isInMonth,\n '!tw-bg-transparent tw-border-gray-100 hover:!tw-border-gray-300':\n isPickerMode && day.isInMonth && !day.isToday,\n 'fd-calendar__item--other-month': isPickerMode && !day.isInMonth,\n 'fd-calendar__item--weekend': isPickerMode && day.isWeekend,\n '!tw-bg-blue-500 hover:!tw-bg-blue-600': day.isToday\n }\"\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 }\n </tr>\n @if (!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 @for (day of days; track day) {\n <td fd-table-cell class=\"more-fd\" (click)=\"onDayBoxSelect(day)\">\n @if (maxRowTasks?.length < day.tasks.length) {\n <button fd-button (click)=\"onMoreButton($event, popover)\" [fdType]=\"'transparent'\" [compact]=\"true\">\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 [canView]=\"canView\"\n [popover]=\"popover\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n ></bc-day-event-list>\n </fd-popover>\n }\n </td>\n }\n </tr>\n }\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 @for (rowTask of maxRowTasks; track rowTask; let i = $index) {\n <tr fd-table-row>\n @if (!weekTasks[i] || weekTasks[i].length === 0) { @for (day of weekDays; track day) {\n <td fd-table-cell></td>\n } } @for (task of weekTasks[i]; track task; let dayIndex = $index) { @if (task.colSpan) {\n <td fd-table-cell [attr.colspan]=\"task.colSpan\">\n @if (task.event) {\n <bc-event-button\n [task]=\"task\"\n [calendarFields]=\"calendarFields\"\n [deviceSize]=\"deviceSize\"\n [rtl]=\"rtl\"\n [canDelete]=\"canDelete\"\n [canEdit]=\"canEdit\"\n [canView]=\"canView\"\n (deleteEvent)=\"deleteEvent.emit($event)\"\n (editEvent)=\"editEvent.emit($event)\"\n (openPopoverChange)=\"onOpenPopoverChange($event)\"\n ></bc-event-button>\n } @else {\n <div style=\"width: 100%; height: 100%\" (click)=\"onDaySelect(weekIndex, dayIndex)\"></div>\n }\n </td>\n } }\n </tr>\n }\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;overflow:hidden;position:relative;height:2.5rem;margin:.125rem;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;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.fd-calendar__item--range{border:.0625rem solid var(--sapList_SelectionBorderColor, #0854a0);background-color:var(--sapList_SelectionBackgroundColor, #e5f0fa)}table[picker=true] thead,table[picker=true] tbody{border:none}\n"] }]
193
194
  }], ctorParameters: () => [{ type: i1.DaysInWeekPipe }, { type: i0.ChangeDetectorRef }, { type: i2.CalendarService }], propDecorators: { monthWeeksCount: [{
194
195
  type: Input
195
196
  }], weekDays: [{
@@ -220,6 +221,8 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
220
221
  type: Input
221
222
  }], canEdit: [{
222
223
  type: Input
224
+ }], canView: [{
225
+ type: Input
223
226
  }], selectedDate: [{
224
227
  type: Input
225
228
  }], startSelectedDayIndex: [{
@@ -243,4 +246,4 @@ i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.5", ngImpor
243
246
  }], showEvent: [{
244
247
  type: Output
245
248
  }] } });
246
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQW9FLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBWXZILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxhQUFhO0lBMkNyRCxZQUNZLFVBQTBCLEVBQzFCLElBQXVCLEVBQ3ZCLGdCQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQUpBLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQzFCLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFuQ3BDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUlmLGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBdUIsQ0FBQztRQUNwRCxnQkFBVyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3RELGNBQVMsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ3BDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBTyxDQUFDO1FBQ25DLGlCQUFZLEdB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USxDQUFDLElBQUksQ0FBQyxDQUFDO1FBQ3pDLENBQUMsQ0FBQyxDQUFDO1FBQ0gsSUFBSSxDQUFDLGNBQWMsR0FBRyxjQUFjLENBQUM7SUFDekMsQ0FBQzs4R0FyTlEsc0JBQXNCO2tHQUF0QixzQkFBc0Isc3pCQ3hCbkMsc3hPQTBLQTs7MkZEbEphLHNCQUFzQjtrQkFObEMsU0FBUzsrQkFDSSxtQkFBbUIsbUJBR1osdUJBQXVCLENBQUMsTUFBTTtpSkFHdEMsZUFBZTtzQkFBdkIsS0FBSztnQkFDRyxRQUFRO3NCQUFoQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csS0FBSztzQkFBYixLQUFLO2dCQUNHLGVBQWU7c0JBQXZCLEtBQUs7Z0JBQ0csSUFBSTtzQkFBWixLQUFLO2dCQUNHLGNBQWM7c0JBQXRCLEtBQUs7Z0JBQ0csR0FBRztzQkFBWCxLQUFLO2dCQUNHLFVBQVU7c0JBQWxCLEtBQUs7Z0JBQ0csVUFBVTtzQkFBbEIsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBQ0csU0FBUztzQkFBakIsS0FBSztnQkFDRyxNQUFNO3NCQUFkLEtBQUs7Z0JBQ0csT0FBTztzQkFBZixLQUFLO2dCQUNHLFlBQVk7c0JBQXBCLEtBQUs7Z0JBQ0cscUJBQXFCO3NCQUE3QixLQUFLO2dCQUNHLG1CQUFtQjtzQkFBM0IsS0FBSztnQkFDSSxTQUFTO3NCQUFsQixNQUFNO2dCQUNHLFdBQVc7c0JBQXBCLE1BQU07Z0JBQ0csU0FBUztzQkFBbEIsTUFBTTtnQkFDRyxRQUFRO3NCQUFqQixNQUFNO2dCQUNHLFlBQVk7c0JBQXJCLE1BQU07Z0JBQ0csVUFBVTtzQkFBbkIsTUFBTTtnQkFDRyxZQUFZO3NCQUFyQixNQUFNO2dCQUNHLFNBQVM7c0JBQWxCLE1BQU0iLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuICAgIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgQ2FsZW5kYXJGaWVsZHMsIENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbCwgTWV0YW9iamVjdERhdGFNb2RlbCB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IERheSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBEYXlzSW5XZWVrUGlwZSB9IGZyb20gJy4uL2RheXMtaW4td2Vlay5waXBlJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYmMtY2FsZW5kYXItbW9udGgnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItbW9udGguY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhck1vbnRoQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgICBASW5wdXQoKSBtb250aFdlZWtzQ291bnQ6IG51bWJlcjtcbiAgICBASW5wdXQoKSB3ZWVrRGF5czogc3RyaW5nW107XG4gICAgQElucHV0KCkgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHRvZGF5OiBEYXRlO1xuICAgIEBJbnB1dCgpIGNvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGRheXM6IERheVtdO1xuICAgIEBJbnB1dCgpIGNhbGVuZGFyRmllbGRzOiBDYWxlbmRhckZpZWxkcztcbiAgICBASW5wdXQoKSBydGw6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGV2aWNlU2l6ZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXTtcbiAgICBASW5wdXQoKSBkYXRlUGlja2VyID0gZmFsc2U7XG4gICAgQElucHV0KCkgcmFuZ2VQaWNrZXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjYW5EZWxldGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjYW5BZGQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjYW5FZGl0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgc2VsZWN0ZWREYXRlOiBEYXRlIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIHN0YXJ0U2VsZWN0ZWREYXlJbmRleDogbnVtYmVyIHwgdW5kZWZpbmVkO1xuICAgIEBJbnB1dCgpIGVuZFNlbGVjdGVkRGF5SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBAT3V0cHV0KCkgZWRpdEV2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxNZXRhb2JqZWN0RGF0YU1vZGVsPigpO1xuICAgIEBPdXRwdXQoKSBkZWxldGVFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgZGF5U2VsZWN0ID0gbmV3IEV2ZW50RW1pdHRlcjxhbnk+KCk7XG4gICAgQE91dHB1dCgpIGRheUNsaWNrID0gbmV3IEV2ZW50RW1pdHRlcjxEYXk+KCk7XG4gICAgQE91dHB1dCgpIGRheU1vdXNlTW92ZSA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5PigpO1xuICAgIEBPdXRwdXQoKSBkYXlNb3VzZVVwID0gbmV3IEV2ZW50RW1pdHRlcjxEYXk+KCk7XG4gICAgQE91dHB1dCgpIGRheU1vdXNlRG93biA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5PigpO1xuICAgIEBPdXRwdXQoKSBzaG93RXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbD4oKTtcblxuICAgIGRlZmF1bHRXZWVrc0NvdW50RDogbnVtYmVyO1xuICAgIGRlZmF1bHRGaXJzdFdlZWtJbmRleDogbnVtYmVyO1xuICAgIHNlbGVjdGVkV2Vla0RheXM6IHN0cmluZ1tdO1xuICAgIHNlbGVjdGVkOiBEYXk7XG4gICAgbnVtYmVyT2ZXZWVrOiBudW1iZXJbXTtcbiAgICBkYXlIZWlnaHQ6IG51bWJlcjtcbiAgICB0YXNrSGVpZ2h0ID0gMzA7XG4gICAgbWF4VGFza0NvdW50OiBudW1iZXI7XG4gICAgbWF4Um93VGFza3M6IG51bWJlcltdO1xuICAgIHdlZWtUYXNrc0FycmF5OiBhbnk7XG4gICAgZXh0cmFSb3c6IG51bWJlcltdO1xuICAgIGlzUGlja2VyTW9kZTogYm9vbGVhbjtcblxuICAgIHByaXZhdGUgX2hhc1BvcG92ZXJPcGVuZWQ6IGJvb2xlYW5bXSA9IFtdO1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgZGF5c0luV2VlazogRGF5c0luV2Vla1BpcGUsXG4gICAgICAgIHByaXZhdGUgX2NkcjogQ2hhbmdlRGV0ZWN0b3JSZWYsXG4gICAgICAgIHByaXZhdGUgX2NhbGVuZGFyU2VydmljZTogQ2FsZW5kYXJTZXJ2aWNlXG4gICAgKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgfVxuICAgIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkNoYW5nZXMoY2hhbmdlcyk7XG4gICAgICAgIGxldCBuZWVkVG9EZXRlY3RDaGFuZ2UgPSBmYWxzZTtcbiAgICAgICAgY29uc3Qge1xuICAgICAgICAgICAgY29udGFpbmVySGVpZ2h0LFxuICAgICAgICAgICAgZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgIG1vRGF0YUxpc3QsXG4gICAgICAgICAgICBkYXlzLFxuICAgICAgICAgICAgbW9udGhXZWVrc0NvdW50LFxuICAgICAgICAgICAgc3RhcnRTZWxlY3RlZERheUluZGV4LFxuICAgICAgICAgICAgZW5kU2VsZWN0ZWREYXlJbmRleFxuICAgICAgICB9ID0gY2hhbmdlcztcbiAgICAgICAgaWYgKGNvbnRhaW5lckhlaWdodCAmJiAhY29udGFpbmVySGVpZ2h0LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLmZpdFRvQ29udGFpbmVyKGNoYW5nZXMuY29udGFpbmVySGVpZ2h0LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRldmljZVNpemUgJiYgIWRldmljZVNpemUuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMucHJlcGFyZVdlZWtEYXlzKGNoYW5nZXMuZGV2aWNlU2l6ZS5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb0RhdGFMaXN0ICYmICFtb0RhdGFMaXN0LmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKGNoYW5nZXMubW9EYXRhTGlzdC5jdXJyZW50VmFsdWUpO1xuICAgICAgICAgICAgbmVlZFRvRGV0ZWN0Q2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoZGF5cyAmJiAhZGF5cy5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5maXRUb0NvbnRhaW5lcih0aGlzLmNvbnRhaW5lckhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKHRoaXMubW9EYXRhTGlzdCk7XG4gICAgICAgICAgICBuZWVkVG9EZXRlY3RDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChtb250aFdlZWtzQ291bnQgJiYgIW1vbnRoV2Vla3NDb3VudC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5maXRUb0NvbnRhaW5lcih0aGlzLmNvbnRhaW5lckhlaWdodCk7XG4gICAgICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKHRoaXMubW9EYXRhTGlzdCk7XG4gICAgICAgICAgICBuZWVkVG9EZXRlY3RDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChcbiAgICAgICAgICAgIChzdGFydFNlbGVjdGVkRGF5SW5kZXggJiYgIXN0YXJ0U2VsZWN0ZWREYXlJbmRleC5maXJzdENoYW5nZSkgfHxcbiAgICAgICAgICAgIChlbmRTZWxlY3RlZERheUluZGV4ICYmICFlbmRTZWxlY3RlZERheUluZGV4LmZpcnN0Q2hhbmdlKVxuICAgICAgICApIHtcbiAgICAgICAgICAgIG5lZWRUb0RldGVjdENoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKG5lZWRUb0RldGVjdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fY2RyLmRldGVjdENoYW5nZXMoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIG5nT25Jbml0KCk6IHZvaWQge1xuICAgICAgICBzdXBlci5uZ09uSW5pdCgpO1xuICAgICAgICB0aGlzLmlzUGlja2VyTW9kZSA9IHRoaXMuZGF0ZVBpY2tlciB8fCB0aGlzLnJhbmdlUGlja2VyO1xuICAgICAgICB0aGlzLnByZXBhcmVXZWVrRGF5cyh0aGlzLmRldmljZVNpemUpO1xuICAgICAgICB0aGlzLl9wcmVwYXJlRGF5c1Rhc2tzKHRoaXMubW9EYXRhTGlzdCk7XG4gICAgICAgIHRoaXMuZml0VG9Db250YWluZXIodGhpcy5jb250YWluZXJIZWlnaHQpO1xuICAgIH1cblxuICAgIG9uRGF5Qm94U2VsZWN0KGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZpcmVEYXlTZWxlY3QoZGF5KTtcbiAgICB9XG4gICAgb25EYXlTZWxlY3Qod2Vla0luZGV4OiBudW1iZXIsIGRheUluZGV4OiBudW1iZXIpOiB2b2lkIHtcbiAgICAgICAgaWYgKCF0aGlzLmNhbkFkZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIGNvbnN0IGRheSA9IHRoaXMuZGF5c1t3ZWVrSW5kZXggKiA3ICsgZGF5SW5kZXhdO1xuICAgICAgICB0aGlzLl9maXJlRGF5U2VsZWN0KGRheSk7XG4gICAgfVxuXG4gICAgb25PcGVuUG9wb3ZlckNoYW5nZShpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fb3BlblBvcG92ZXIoaXNPcGVuKTtcbiAgICB9XG4gICAgb25Nb3JlQnV0dG9uKGUsIHBvcG92ZXIpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fcHJldmVudEV2ZW50KGUpO1xuICAgICAgICBwb3BvdmVyLm9wZW4oKTtcbiAgICB9XG4gICAgb25UYXNrKGUsIHRhc2s6IENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbCk6IHZvaWQge1xuICAgICAgICB0aGlzLnNob3dFdmVudC5lbWl0KHRhc2spO1xuICAgIH1cbiAgICBvbkRheUNsaWNrKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuc2VsZWN0ZWQgPSBkYXk7XG4gICAgICAgIHRoaXMuZGF5Q2xpY2suZW1pdChkYXkpO1xuICAgIH1cbiAgICBvbkRheU1vdXNlTW92ZShkYXk6IERheSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRheU1vdXNlTW92ZS5lbWl0KGRheSk7XG4gICAgfVxuICAgIG9uRGF5TW91c2VEb3duKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF5TW91c2VEb3duLmVtaXQoZGF5KTtcbiAgICB9XG4gICAgb25EYXlNb3VzZVVwKGRheTogRGF5KTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF5TW91c2VVcC5lbWl0KGRheSk7XG4gICAgfVxuICAgIHByaXZhdGUgX3ByZXZlbnRFdmVudChlKTogdm9pZCB7XG4gICAgICAgIGUuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG4gICAgcHJpdmF0ZSBfZmlyZURheVNlbGVjdChkYXk6IERheSk6IHZvaWQge1xuICAgICAgICBpZiAodGhpcy5faGFzUG9wb3Zlck9wZW5lZC5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHRoaXMuZGF5U2VsZWN0LmVtaXQoe1xuICAgICAgICAgICAgICAgIGRhdGU6IGRheS5kYXRlXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9vcGVuUG9wb3Zlcihpc09wZW46IGJvb2xlYW4pOiB2b2lkIHtcbiAgICAgICAgaWYgKGlzT3Blbikge1xuICAgICAgICAgICAgdGhpcy5faGFzUG9wb3Zlck9wZW5lZC5wdXNoKHRydWUpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5faGFzUG9wb3Zlck9wZW5lZCA9IFtdO1xuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBwcmVwYXJlV2Vla0RheXMoZGV2aWNlU2l6ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgICAgIGlmIChkZXZpY2VTaXplICE9PSAncycgJiYgZGV2aWNlU2l6ZSAhPT0gJ20nKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGVkV2Vla0RheXMgPSB0aGlzLndlZWtEYXlzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdlZWtEYXlzID0gdGhpcy53ZWVrRGF5c01pbjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIGZpdFRvQ29udGFpbmVyKGNvbnRhaW5lckhlaWdodCk6IHZvaWQge1xuICAgICAgICBsZXQgX3dlZWtzQ291bnQ7XG5cbiAgICAgICAgaWYgKHRoaXMubW9udGhXZWVrc0NvdW50ID4gMCkge1xuICAgICAgICAgICAgY29uc3Qgd2Vla3NDb3VudCA9IHRoaXMubW9udGhXZWVrc0NvdW50O1xuICAgICAgICAgICAgX3dlZWtzQ291bnQgPSB3ZWVrc0NvdW50O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgX3dlZWtzQ291bnQgPSB0aGlzLmRheXMubGVuZ3RoIC8gNztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLm51bWJlck9mV2VlayA9IEFycmF5LmZyb20oQXJyYXkoX3dlZWtzQ291bnQpLmtleXMoKSk7XG4gICAgICAgIHRoaXMubnVtYmVyT2ZXZWVrID0gdGhpcy5udW1iZXJPZldlZWsubWFwKCh2YWx1ZSkgPT4gdmFsdWUpO1xuICAgICAgICBpZiAodGhpcy5pc1BpY2tlck1vZGUpIHtcbiAgICAgICAgICAgIHRoaXMuZGF5SGVpZ2h0ID0gNDA7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kYXlIZWlnaHQgPSBNYXRoLmZsb29yKGNvbnRhaW5lckhlaWdodCAvIChfd2Vla3NDb3VudCArIDEpKTtcblxuICAgICAgICB0aGlzLm1heFRhc2tDb3VudCA9IE1hdGguZmxvb3IoKHRoaXMuZGF5SGVpZ2h0IC0gdGhpcy50YXNrSGVpZ2h0KSAvIHRoaXMudGFza0hlaWdodCk7XG4gICAgICAgIGlmICh0aGlzLm1heFRhc2tDb3VudCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMubWF4Um93VGFza3MgPSBuZXcgQXJyYXkodGhpcy5tYXhUYXNrQ291bnQpLmZpbGwoMCkubWFwKCh4LCBpKSA9PiBpKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICBwcml2YXRlIF9wcmVwYXJlRGF5c1Rhc2tzKGNhbGVuZGFyVGFza3MpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuaXNQaWNrZXJNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLndlZWtUYXNrc0FycmF5ID0ge307XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCBjYWxlbmRhckZpZWxkcyA9IHRoaXMuY2FsZW5kYXJGaWVsZHM7XG5cbiAgICAgICAgLy8gU29ydCBhbGwgVGFza3NcbiAgICAgICAgY29uc3QgbW9EYXRhTGlzdCA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5zb3J0VGFza3MoY2FsZW5kYXJUYXNrcywgY2FsZW5kYXJGaWVsZHMpO1xuICAgICAgICB0aGlzLmRheXMuZm9yRWFjaCgoZGF5KSA9PiAoZGF5LnRhc2tzID0gW10pKTtcbiAgICAgICAgY29uc3Qgd2Vla1Rhc2tzQXJyYXk6IGFueSA9IFtdO1xuICAgICAgICBmb3IgKGxldCBqID0gMDsgaiA8IHRoaXMuZGF5cy5sZW5ndGggLyA3OyBqKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGRheXMgPSB0aGlzLmRheXNJbldlZWsudHJhbnNmb3JtKHRoaXMuZGF5cywgaik7XG4gICAgICAgICAgICBjb25zdCB3ZWVrID0gdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmNyZWF0ZVdlZWtUYXNrKGRheXMsIG1vRGF0YUxpc3QsIGNhbGVuZGFyRmllbGRzLCAwKTtcbiAgICAgICAgICAgIHdlZWtUYXNrc0FycmF5LnB1c2god2Vlayk7XG4gICAgICAgIH1cblxuICAgICAgICB3ZWVrVGFza3NBcnJheS5mb3JFYWNoKCh3ZWVrKSA9PiB7XG4gICAgICAgICAgICBjb25zdCBhcnI6IGFueVtdID0gT2JqZWN0LnZhbHVlcyh3ZWVrKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSBhcnIubGVuZ3RoOyBpIDwgdGhpcy5tYXhUYXNrQ291bnQ7IGkrKykge1xuICAgICAgICAgICAgICAgIHdlZWtbaS50b1N0cmluZygpXSA9IFtdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgLy8g2KjZhyDYp9iy2KfbjCDZh9ixINix2K/bjNmBINiq2LPaqSDYqNin24zYryDYqti52K/Yp9ivIDcg2LPYqtmI2YYg2KfYttin2YHZhyDar9ix2K/YryDZiCDYqNix2KfbjCDYs9iq2YjZhtuMINqp2Ycg2KrYs9qp24wg2YbYr9in2LHYryDbjNqpINis2KfbjCDYrtin2YTbjCBjb2xzcGFuIDEg2YXbjNqv2LDYp9ix24zZhVxuICAgICAgICB3ZWVrVGFza3NBcnJheS5mb3JFYWNoKCh3ZWVrKSA9PiB7XG4gICAgICAgICAgICB0aGlzLl9jYWxlbmRhclNlcnZpY2UuZmlsbFdlZWsod2Vlayk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLndlZWtUYXNrc0FycmF5ID0gd2Vla1Rhc2tzQXJyYXk7XG4gICAgfVxufVxuIiwiPHRhYmxlIGZkLXRhYmxlIGNsYXNzPVwidGFibGUtaGVhZGVyXCIgW2ZkQ29tcGFjdF0gW2F0dHIucGlja2VyXT1cImRhdGVQaWNrZXJcIj5cbiAgICA8dGhlYWQgZmQtdGFibGUtaGVhZGVyPlxuICAgICAgICA8dHIgZmQtdGFibGUtcm93PlxuICAgICAgICAgICAgQGZvciAod2Vla0RheSBvZiBzZWxlY3RlZFdlZWtEYXlzOyB0cmFjayB3ZWVrRGF5KSB7XG4gICAgICAgICAgICA8dGggY2xhc3M9XCJ3ZWVrZGF5LWhlYWRlclwiIGZkLXRhYmxlLWNlbGwgW2NsYXNzLm5vYm9yZGVyXT1cImlzUGlja2VyTW9kZVwiPlxuICAgICAgICAgICAgICAgIHt7IHdlZWtEYXkgfCBzbGljZTogMDoxIH19XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgfVxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5IGZkLXRhYmxlLWJvZHk+XG4gICAgICAgIEBmb3IgKHdlZWtEYXkgb2YgbnVtYmVyT2ZXZWVrOyB0cmFjayB3ZWVrRGF5KSB7XG4gICAgICAgIDx0ciBmZC10YWJsZS1yb3c+XG4gICAgICAgICAgICA8dGQgW3N0eWxlLmhlaWdodC5weF09XCJkYXlIZWlnaHRcIiBmZC10YWJsZS1jZWxsIGNvbHNwYW49XCI3XCIgW3N0eWxlLmJvcmRlcl09XCJpc1BpY2tlck1vZGUgPyAnbm9uZScgOiBudWxsXCI+XG4gICAgICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyVGFza3M7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiBpc1BpY2tlck1vZGUgPyBudWxsIDogbW9EYXRhTGlzdFt3ZWVrRGF5XSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrSW5kZXg6IHdlZWtEYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5czogZGF5cyB8IGRheXNJbldlZWs6IHdlZWtEYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93VGFza3M6IG1heFJvd1Rhc2tzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlZWtEYXlzOiB3ZWVrRGF5cyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckZpZWxkczogY2FsZW5kYXJGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlU2l6ZTogZGV2aWNlU2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBydGw6IHJ0bCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BpY2tlck1vZGU6IGlzUGlja2VyTW9kZVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgICAgID48L25nLWNvbnRhaW5lcj5cbiAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgIDwvdHI+XG4gICAgICAgIH1cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cbjxuZy10ZW1wbGF0ZVxuICAgICNyZW5kZXJUYXNrc1xuICAgIGxldC10YXNrXG4gICAgbGV0LXdlZWtJbmRleD1cIndlZWtJbmRleFwiXG4gICAgbGV0LXdlZWtEYXlzPVwid2Vla0RheXNcIlxuICAgIGxldC1kYXlzPVwiZGF5c1wiXG4gICAgbGV0LW1heFJvd1Rhc2tzPVwibWF4Um93VGFza3NcIlxuICAgIGxldC1jYWxlbmRhckZpZWxkcz1cImNhbGVuZGFyRmllbGRzXCJcbiAgICBsZXQtZGV2aWNlU2l6ZT1cImRldmljZVNpemVcIlxuICAgIGxldC1ydGw9XCJydGxcIlxuICAgIGxldC1pc1BpY2tlck1vZGU9XCJpc1BpY2tlck1vZGVcIlxuPlxuICAgIDx0YWJsZSBmZC10YWJsZS1ib2R5IGNsYXNzPVwidGFibGUtY29udGVudFwiIFtjb21wYWN0XT1cInRydWVcIj5cbiAgICAgICAgPHRib2R5PlxuICAgICAgICAgICAgPHRyIGZkLXRhYmxlLXJvdyBjbGFzcz1cInJvdy1kYXktbnVtYmVyXCIgW2F0dHIucnRsXT1cInJ0bFwiPlxuICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiBkYXlzOyB0cmFjayBkYXkpIHtcbiAgICAgICAgICAgICAgICA8dGQgZmQtdGFibGUtY2VsbCBbY2xhc3Mubm9ib3JkZXJdPVwiaXNQaWNrZXJNb2RlXCI+XG4gICAgICAgICAgICAgICAgICAgIDxiYy1kYXktbnVtYmVyLWJveFxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZC1jYWxlbmRhcl9faXRlbSc6IGlzUGlja2VyTW9kZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIXR3LWJvcmRlciAhdHctcm91bmRlZC1tZCB0dy10cmFuc2l0aW9uLWFsbCB0dy1jdXJzb3ItcG9pbnRlcic6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzUGlja2VyTW9kZSAmJiBkYXkuaXNJbk1vbnRoLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICchdHctYmctdHJhbnNwYXJlbnQgdHctYm9yZGVyLWdyYXktMTAwIGhvdmVyOiF0dy1ib3JkZXItZ3JheS0zMDAnOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BpY2tlck1vZGUgJiYgZGF5LmlzSW5Nb250aCAmJiAhZGF5LmlzVG9kYXksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZkLWNhbGVuZGFyX19pdGVtLS1vdGhlci1tb250aCc6IGlzUGlja2VyTW9kZSAmJiAhZGF5LmlzSW5Nb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmQtY2FsZW5kYXJfX2l0ZW0tLXdlZWtlbmQnOiBpc1BpY2tlck1vZGUgJiYgZGF5LmlzV2Vla2VuZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIXR3LWJnLWJsdWUtNTAwIGhvdmVyOiF0dy1iZy1ibHVlLTYwMCc6IGRheS5pc1RvZGF5XG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc1BpY2tlck1vZGVdPVwiaXNQaWNrZXJNb2RlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkYXldPVwiZGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpc0FjdGl2ZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaW5kZXggPT09IHN0YXJ0U2VsZWN0ZWREYXlJbmRleCB8fCBkYXkuaW5kZXggPT09IGVuZFNlbGVjdGVkRGF5SW5kZXggfHwgZGF5LmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBlcXVhbERhdGU6IHNlbGVjdGVkRGF0ZVxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtpdGVtSW5SYW5nZV09XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFydFNlbGVjdGVkRGF5SW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZFNlbGVjdGVkRGF5SW5kZXggIT09IHVuZGVmaW5lZCAmJlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheS5pbmRleCA+PSBzdGFydFNlbGVjdGVkRGF5SW5kZXggJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaW5kZXggPD0gZW5kU2VsZWN0ZWREYXlJbmRleFxuICAgICAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlDbGljayk9XCJvbkRheUNsaWNrKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRheU1vdXNlTW92ZSk9XCJvbkRheU1vdXNlTW92ZShkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlNb3VzZURvd24pPVwib25EYXlNb3VzZURvd24oZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF5TW91c2VVcCk9XCJvbkRheU1vdXNlVXAoZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgID48L2JjLWRheS1udW1iZXItYm94PlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIEBpZiAoIWlzUGlja2VyTW9kZSkge1xuICAgICAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgICAgICpuZ1RlbXBsYXRlT3V0bGV0PVwiXG4gICAgICAgICAgICAgICAgICAgIHJlbmRlckRheVRhc2tzO1xuICAgICAgICAgICAgICAgICAgICBjb250ZXh0OiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkaW1wbGljaXQ6IHdlZWtUYXNrc0FycmF5W3dlZWtJbmRleF0sXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXhSb3dUYXNrczogbWF4Um93VGFza3MsXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWVrSW5kZXg6IHdlZWtJbmRleCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjYWxlbmRhckZpZWxkczogY2FsZW5kYXJGaWVsZHMsXG4gICAgICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5czogd2Vla0RheXNcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8dHIgZmQtdGFibGUtcm93PlxuICAgICAgICAgICAgICAgIEBmb3IgKGRheSBvZiBkYXlzOyB0cmFjayBkYXkpIHtcbiAgICAgICAgICAgICAgICA8dGQgZmQtdGFibGUtY2VsbCBjbGFzcz1cIm1vcmUtZmRcIiAoY2xpY2spPVwib25EYXlCb3hTZWxlY3QoZGF5KVwiPlxuICAgICAgICAgICAgICAgICAgICBAaWYgKG1heFJvd1Rhc2tzPy5sZW5ndGggPCBkYXkudGFza3MubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgIDxidXR0b24gZmQtYnV0dG9uIChjbGljayk9XCJvbk1vcmVCdXR0b24oJGV2ZW50LCBwb3BvdmVyKVwiIFtmZFR5cGVdPVwiJ3RyYW5zcGFyZW50J1wiIFtjb21wYWN0XT1cInRydWVcIj5cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7IGRheS50YXNrcz8ubGVuZ3RoIC0gbWF4Um93VGFza3M/Lmxlbmd0aCB9fVxuICAgICAgICAgICAgICAgICAgICAgICAge3sgJ01vcmUnIHwgYmJiVHJhbnNsYXRlIH19XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgICAgICA8ZmQtcG9wb3ZlclxuICAgICAgICAgICAgICAgICAgICAgICAgI3BvcG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgIFttb2JpbGVdPVwiZGV2aWNlU2l6ZSA9PT0gJ3MnXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlbWVudD1cImJvdHRvbVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZm9jdXNUcmFwcGVkXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvY3VzQXV0b0NhcHR1cmVdPVwidHJ1ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoaXNPcGVuQ2hhbmdlKT1cIm9uT3BlblBvcG92ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxiYy1kYXktZXZlbnQtbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkYXldPVwiZGF5XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FsZW5kYXJGaWVsZHNdPVwiY2FsZW5kYXJGaWVsZHNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtkZXZpY2VTaXplXT1cImRldmljZVNpemVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFt3ZWVrRGF5c109XCJ3ZWVrRGF5c1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3J0bF09XCJydGxcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtjYW5EZWxldGVdPVwiY2FuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuRWRpdF09XCJjYW5FZGl0XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbcG9wb3Zlcl09XCJwb3BvdmVyXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZGVsZXRlRXZlbnQpPVwiZGVsZXRlRXZlbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZWRpdEV2ZW50KT1cImVkaXRFdmVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgPjwvYmMtZGF5LWV2ZW50LWxpc3Q+XG4gICAgICAgICAgICAgICAgICAgIDwvZmQtcG9wb3Zlcj5cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgPC90cj5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC90Ym9keT5cbiAgICA8L3RhYmxlPlxuPC9uZy10ZW1wbGF0ZT5cblxuPG5nLXRlbXBsYXRlXG4gICAgI3JlbmRlckRheVRhc2tzXG4gICAgbGV0LXdlZWtUYXNrc1xuICAgIGxldC1tYXhSb3dUYXNrcz1cIm1heFJvd1Rhc2tzXCJcbiAgICBsZXQtd2Vla0luZGV4PVwid2Vla0luZGV4XCJcbiAgICBsZXQtZGV2aWNlU2l6ZT1cImRldmljZVNpemVcIlxuICAgIGxldC1jYWxlbmRhckZpZWxkcz1cImNhbGVuZGFyRmllbGRzXCJcbiAgICBsZXQtd2Vla0RheXM9XCJ3ZWVrRGF5c1wiXG4+XG4gICAgQGZvciAocm93VGFzayBvZiBtYXhSb3dUYXNrczsgdHJhY2sgcm93VGFzazsgbGV0IGkgPSAkaW5kZXgpIHtcbiAgICA8dHIgZmQtdGFibGUtcm93PlxuICAgICAgICBAaWYgKCF3ZWVrVGFza3NbaV0gfHwgd2Vla1Rhc2tzW2ldLmxlbmd0aCA9PT0gMCkgeyBAZm9yIChkYXkgb2Ygd2Vla0RheXM7IHRyYWNrIGRheSkge1xuICAgICAgICA8dGQgZmQtdGFibGUtY2VsbD48L3RkPlxuICAgICAgICB9IH0gQGZvciAodGFzayBvZiB3ZWVrVGFza3NbaV07IHRyYWNrIHRhc2s7IGxldCBkYXlJbmRleCA9ICRpbmRleCkgeyBAaWYgKHRhc2suY29sU3Bhbikge1xuICAgICAgICA8dGQgZmQtdGFibGUtY2VsbCBbYXR0ci5jb2xzcGFuXT1cInRhc2suY29sU3BhblwiPlxuICAgICAgICAgICAgQGlmICh0YXNrLmV2ZW50KSB7XG4gICAgICAgICAgICA8YmMtZXZlbnQtYnV0dG9uXG4gICAgICAgICAgICAgICAgW3Rhc2tdPVwidGFza1wiXG4gICAgICAgICAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcbiAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICBbcnRsXT1cInJ0bFwiXG4gICAgICAgICAgICAgICAgW2NhbkRlbGV0ZV09XCJjYW5EZWxldGVcIlxuICAgICAgICAgICAgICAgIFtjYW5FZGl0XT1cImNhbkVkaXRcIlxuICAgICAgICAgICAgICAgIChkZWxldGVFdmVudCk9XCJkZWxldGVFdmVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChlZGl0RXZlbnQpPVwiZWRpdEV2ZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgKG9wZW5Qb3BvdmVyQ2hhbmdlKT1cIm9uT3BlblBvcG92ZXJDaGFuZ2UoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9iYy1ldmVudC1idXR0b24+XG4gICAgICAgICAgICB9IEBlbHNlIHtcbiAgICAgICAgICAgIDxkaXYgc3R5bGU9XCJ3aWR0aDogMTAwJTsgaGVpZ2h0OiAxMDAlXCIgKGNsaWNrKT1cIm9uRGF5U2VsZWN0KHdlZWtJbmRleCwgZGF5SW5kZXgpXCI+PC9kaXY+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvdGQ+XG4gICAgICAgIH0gfVxuICAgIDwvdHI+XG4gICAgfVxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==
249
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FsZW5kYXItbW9udGguY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvYmFyc2EtY2FsZW5kYXIvc3JjL2xpYi9jYWxlbmRhci1tb250aC9jYWxlbmRhci1tb250aC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9iYXJzYS1jYWxlbmRhci9zcmMvbGliL2NhbGVuZGFyLW1vbnRoL2NhbGVuZGFyLW1vbnRoLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBR0wsTUFBTSxFQUVULE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxhQUFhLEVBQW9FLE1BQU0sc0JBQXNCLENBQUM7Ozs7Ozs7Ozs7Ozs7O0FBWXZILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxhQUFhO0lBNENyRCxZQUNZLFVBQTBCLEVBQzFCLElBQXVCLEVBQ3ZCLGdCQUFpQztRQUV6QyxLQUFLLEVBQUUsQ0FBQztRQUpBLGVBQVUsR0FBVixVQUFVLENBQWdCO1FBQzFCLFNBQUksR0FBSixJQUFJLENBQW1CO1FBQ3ZCLHFCQUFnQixHQUFoQixnQkFBZ0IsQ0FBaUI7UUFwQ3BDLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsZ0JBQVcsR0FBRyxLQUFLLENBQUM7UUFDcEIsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixXQUFNLEdBQUcsS0FBSyxDQUFDO1FBQ2YsWUFBTyxHQUFHLEtBQUssQ0FBQztRQUNoQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBSWYsY0FBUyxHQUFHLElBQUksWUFBWSxFQUF1QixDQUFDO1FBQ3BELGdCQUFXLEdBQUcsSUFBSSxZQUFZLEVBQXVCLENBQUM7UUFDdEQsY0FBUyxHQUFHLElBQUksWUFBWSxFQUFPLENBQUM7UUFDcEMsYUFBUSxHQUFHLElBQUksWUFB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LFxuICAgIENoYW5nZURldGVjdG9yUmVmLFxuICAgIENvbXBvbmVudCxcbiAgICBFdmVudEVtaXR0ZXIsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uSW5pdCxcbiAgICBPdXRwdXQsXG4gICAgU2ltcGxlQ2hhbmdlc1xufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQmFzZUNvbXBvbmVudCwgQ2FsZW5kYXJGaWVsZHMsIENhbGVuZGFyTWV0YW9iamVjdERhdGFNb2RlbCwgTWV0YW9iamVjdERhdGFNb2RlbCB9IGZyb20gJ2JhcnNhLW5vdmluLXJheS1jb3JlJztcbmltcG9ydCB7IERheSB9IGZyb20gJy4uL21vZGVscyc7XG5pbXBvcnQgeyBEYXlzSW5XZWVrUGlwZSB9IGZyb20gJy4uL2RheXMtaW4td2Vlay5waXBlJztcblxuaW1wb3J0IHsgQ2FsZW5kYXJTZXJ2aWNlIH0gZnJvbSAnLi4vc2VydmljZXMvY2FsZW5kYXIuc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYmMtY2FsZW5kYXItbW9udGgnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jYWxlbmRhci1tb250aC5jb21wb25lbnQuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vY2FsZW5kYXItbW9udGguY29tcG9uZW50LnNjc3MnXSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBDYWxlbmRhck1vbnRoQ29tcG9uZW50IGV4dGVuZHMgQmFzZUNvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcywgT25Jbml0IHtcbiAgICBASW5wdXQoKSBtb250aFdlZWtzQ291bnQ6IG51bWJlcjtcbiAgICBASW5wdXQoKSB3ZWVrRGF5czogc3RyaW5nW107XG4gICAgQElucHV0KCkgd2Vla0RheXNNaW46IHN0cmluZ1tdO1xuICAgIEBJbnB1dCgpIHRvZGF5OiBEYXRlO1xuICAgIEBJbnB1dCgpIGNvbnRhaW5lckhlaWdodDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIGRheXM6IERheVtdO1xuICAgIEBJbnB1dCgpIGNhbGVuZGFyRmllbGRzOiBDYWxlbmRhckZpZWxkcztcbiAgICBASW5wdXQoKSBydGw6IGJvb2xlYW47XG4gICAgQElucHV0KCkgZGV2aWNlU2l6ZTogc3RyaW5nO1xuICAgIEBJbnB1dCgpIG1vRGF0YUxpc3Q6IE1ldGFvYmplY3REYXRhTW9kZWxbXTtcbiAgICBASW5wdXQoKSBkYXRlUGlja2VyID0gZmFsc2U7XG4gICAgQElucHV0KCkgcmFuZ2VQaWNrZXIgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjYW5EZWxldGUgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjYW5BZGQgPSBmYWxzZTtcbiAgICBASW5wdXQoKSBjYW5FZGl0ID0gZmFsc2U7XG4gICAgQElucHV0KCkgY2FuVmlldyA9IGZhbHNlO1xuICAgIEBJbnB1dCgpIHNlbGVjdGVkRGF0ZTogRGF0ZSB8IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSBzdGFydFNlbGVjdGVkRGF5SW5kZXg6IG51bWJlciB8IHVuZGVmaW5lZDtcbiAgICBASW5wdXQoKSBlbmRTZWxlY3RlZERheUluZGV4OiBudW1iZXIgfCB1bmRlZmluZWQ7XG4gICAgQE91dHB1dCgpIGVkaXRFdmVudCA9IG5ldyBFdmVudEVtaXR0ZXI8TWV0YW9iamVjdERhdGFNb2RlbD4oKTtcbiAgICBAT3V0cHV0KCkgZGVsZXRlRXZlbnQgPSBuZXcgRXZlbnRFbWl0dGVyPE1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG4gICAgQE91dHB1dCgpIGRheVNlbGVjdCA9IG5ldyBFdmVudEVtaXR0ZXI8YW55PigpO1xuICAgIEBPdXRwdXQoKSBkYXlDbGljayA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5PigpO1xuICAgIEBPdXRwdXQoKSBkYXlNb3VzZU1vdmUgPSBuZXcgRXZlbnRFbWl0dGVyPERheT4oKTtcbiAgICBAT3V0cHV0KCkgZGF5TW91c2VVcCA9IG5ldyBFdmVudEVtaXR0ZXI8RGF5PigpO1xuICAgIEBPdXRwdXQoKSBkYXlNb3VzZURvd24gPSBuZXcgRXZlbnRFbWl0dGVyPERheT4oKTtcbiAgICBAT3V0cHV0KCkgc2hvd0V2ZW50ID0gbmV3IEV2ZW50RW1pdHRlcjxDYWxlbmRhck1ldGFvYmplY3REYXRhTW9kZWw+KCk7XG5cbiAgICBkZWZhdWx0V2Vla3NDb3VudEQ6IG51bWJlcjtcbiAgICBkZWZhdWx0Rmlyc3RXZWVrSW5kZXg6IG51bWJlcjtcbiAgICBzZWxlY3RlZFdlZWtEYXlzOiBzdHJpbmdbXTtcbiAgICBzZWxlY3RlZDogRGF5O1xuICAgIG51bWJlck9mV2VlazogbnVtYmVyW107XG4gICAgZGF5SGVpZ2h0OiBudW1iZXI7XG4gICAgdGFza0hlaWdodCA9IDMwO1xuICAgIG1heFRhc2tDb3VudDogbnVtYmVyO1xuICAgIG1heFJvd1Rhc2tzOiBudW1iZXJbXTtcbiAgICB3ZWVrVGFza3NBcnJheTogYW55O1xuICAgIGV4dHJhUm93OiBudW1iZXJbXTtcbiAgICBpc1BpY2tlck1vZGU6IGJvb2xlYW47XG5cbiAgICBwcml2YXRlIF9oYXNQb3BvdmVyT3BlbmVkOiBib29sZWFuW10gPSBbXTtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwcml2YXRlIGRheXNJbldlZWs6IERheXNJbldlZWtQaXBlLFxuICAgICAgICBwcml2YXRlIF9jZHI6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBwcml2YXRlIF9jYWxlbmRhclNlcnZpY2U6IENhbGVuZGFyU2VydmljZVxuICAgICkge1xuICAgICAgICBzdXBlcigpO1xuICAgIH1cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgICAgIHN1cGVyLm5nT25DaGFuZ2VzKGNoYW5nZXMpO1xuICAgICAgICBsZXQgbmVlZFRvRGV0ZWN0Q2hhbmdlID0gZmFsc2U7XG4gICAgICAgIGNvbnN0IHtcbiAgICAgICAgICAgIGNvbnRhaW5lckhlaWdodCxcbiAgICAgICAgICAgIGRldmljZVNpemUsXG4gICAgICAgICAgICBtb0RhdGFMaXN0LFxuICAgICAgICAgICAgZGF5cyxcbiAgICAgICAgICAgIG1vbnRoV2Vla3NDb3VudCxcbiAgICAgICAgICAgIHN0YXJ0U2VsZWN0ZWREYXlJbmRleCxcbiAgICAgICAgICAgIGVuZFNlbGVjdGVkRGF5SW5kZXhcbiAgICAgICAgfSA9IGNoYW5nZXM7XG4gICAgICAgIGlmIChjb250YWluZXJIZWlnaHQgJiYgIWNvbnRhaW5lckhlaWdodC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5maXRUb0NvbnRhaW5lcihjaGFuZ2VzLmNvbnRhaW5lckhlaWdodC5jdXJyZW50VmFsdWUpO1xuICAgICAgICB9XG4gICAgICAgIGlmIChkZXZpY2VTaXplICYmICFkZXZpY2VTaXplLmZpcnN0Q2hhbmdlKSB7XG4gICAgICAgICAgICB0aGlzLnByZXBhcmVXZWVrRGF5cyhjaGFuZ2VzLmRldmljZVNpemUuY3VycmVudFZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9EYXRhTGlzdCAmJiAhbW9EYXRhTGlzdC5maXJzdENoYW5nZSkge1xuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURheXNUYXNrcyhjaGFuZ2VzLm1vRGF0YUxpc3QuY3VycmVudFZhbHVlKTtcbiAgICAgICAgICAgIG5lZWRUb0RldGVjdENoYW5nZSA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGRheXMgJiYgIWRheXMuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZml0VG9Db250YWluZXIodGhpcy5jb250YWluZXJIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURheXNUYXNrcyh0aGlzLm1vRGF0YUxpc3QpO1xuICAgICAgICAgICAgbmVlZFRvRGV0ZWN0Q2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAobW9udGhXZWVrc0NvdW50ICYmICFtb250aFdlZWtzQ291bnQuZmlyc3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuZml0VG9Db250YWluZXIodGhpcy5jb250YWluZXJIZWlnaHQpO1xuICAgICAgICAgICAgdGhpcy5fcHJlcGFyZURheXNUYXNrcyh0aGlzLm1vRGF0YUxpc3QpO1xuICAgICAgICAgICAgbmVlZFRvRGV0ZWN0Q2hhbmdlID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoXG4gICAgICAgICAgICAoc3RhcnRTZWxlY3RlZERheUluZGV4ICYmICFzdGFydFNlbGVjdGVkRGF5SW5kZXguZmlyc3RDaGFuZ2UpIHx8XG4gICAgICAgICAgICAoZW5kU2VsZWN0ZWREYXlJbmRleCAmJiAhZW5kU2VsZWN0ZWREYXlJbmRleC5maXJzdENoYW5nZSlcbiAgICAgICAgKSB7XG4gICAgICAgICAgICBuZWVkVG9EZXRlY3RDaGFuZ2UgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChuZWVkVG9EZXRlY3RDaGFuZ2UpIHtcbiAgICAgICAgICAgIHRoaXMuX2Nkci5kZXRlY3RDaGFuZ2VzKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBuZ09uSW5pdCgpOiB2b2lkIHtcbiAgICAgICAgc3VwZXIubmdPbkluaXQoKTtcbiAgICAgICAgdGhpcy5pc1BpY2tlck1vZGUgPSB0aGlzLmRhdGVQaWNrZXIgfHwgdGhpcy5yYW5nZVBpY2tlcjtcbiAgICAgICAgdGhpcy5wcmVwYXJlV2Vla0RheXModGhpcy5kZXZpY2VTaXplKTtcbiAgICAgICAgdGhpcy5fcHJlcGFyZURheXNUYXNrcyh0aGlzLm1vRGF0YUxpc3QpO1xuICAgICAgICB0aGlzLmZpdFRvQ29udGFpbmVyKHRoaXMuY29udGFpbmVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICBvbkRheUJveFNlbGVjdChkYXk6IERheSk6IHZvaWQge1xuICAgICAgICB0aGlzLl9maXJlRGF5U2VsZWN0KGRheSk7XG4gICAgfVxuICAgIG9uRGF5U2VsZWN0KHdlZWtJbmRleDogbnVtYmVyLCBkYXlJbmRleDogbnVtYmVyKTogdm9pZCB7XG4gICAgICAgIGlmICghdGhpcy5jYW5BZGQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICBjb25zdCBkYXkgPSB0aGlzLmRheXNbd2Vla0luZGV4ICogNyArIGRheUluZGV4XTtcbiAgICAgICAgdGhpcy5fZmlyZURheVNlbGVjdChkYXkpO1xuICAgIH1cblxuICAgIG9uT3BlblBvcG92ZXJDaGFuZ2UoaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX29wZW5Qb3BvdmVyKGlzT3Blbik7XG4gICAgfVxuICAgIG9uTW9yZUJ1dHRvbihlLCBwb3BvdmVyKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX3ByZXZlbnRFdmVudChlKTtcbiAgICAgICAgcG9wb3Zlci5vcGVuKCk7XG4gICAgfVxuICAgIG9uVGFzayhlLCB0YXNrOiBDYWxlbmRhck1ldGFvYmplY3REYXRhTW9kZWwpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5zaG93RXZlbnQuZW1pdCh0YXNrKTtcbiAgICB9XG4gICAgb25EYXlDbGljayhkYXk6IERheSk6IHZvaWQge1xuICAgICAgICB0aGlzLnNlbGVjdGVkID0gZGF5O1xuICAgICAgICB0aGlzLmRheUNsaWNrLmVtaXQoZGF5KTtcbiAgICB9XG4gICAgb25EYXlNb3VzZU1vdmUoZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5kYXlNb3VzZU1vdmUuZW1pdChkYXkpO1xuICAgIH1cbiAgICBvbkRheU1vdXNlRG93bihkYXk6IERheSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRheU1vdXNlRG93bi5lbWl0KGRheSk7XG4gICAgfVxuICAgIG9uRGF5TW91c2VVcChkYXk6IERheSk6IHZvaWQge1xuICAgICAgICB0aGlzLmRheU1vdXNlVXAuZW1pdChkYXkpO1xuICAgIH1cbiAgICBwcml2YXRlIF9wcmV2ZW50RXZlbnQoZSk6IHZvaWQge1xuICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgfVxuICAgIHByaXZhdGUgX2ZpcmVEYXlTZWxlY3QoZGF5OiBEYXkpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuX2hhc1BvcG92ZXJPcGVuZWQubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmRheVNlbGVjdC5lbWl0KHtcbiAgICAgICAgICAgICAgICBkYXRlOiBkYXkuZGF0ZVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfb3BlblBvcG92ZXIoaXNPcGVuOiBib29sZWFuKTogdm9pZCB7XG4gICAgICAgIGlmIChpc09wZW4pIHtcbiAgICAgICAgICAgIHRoaXMuX2hhc1BvcG92ZXJPcGVuZWQucHVzaCh0cnVlKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuX2hhc1BvcG92ZXJPcGVuZWQgPSBbXTtcbiAgICAgICAgICAgIH0sIDApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHByaXZhdGUgcHJlcGFyZVdlZWtEYXlzKGRldmljZVNpemU6IHN0cmluZyk6IHZvaWQge1xuICAgICAgICBpZiAoZGV2aWNlU2l6ZSAhPT0gJ3MnICYmIGRldmljZVNpemUgIT09ICdtJykge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3RlZFdlZWtEYXlzID0gdGhpcy53ZWVrRGF5cztcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0ZWRXZWVrRGF5cyA9IHRoaXMud2Vla0RheXNNaW47XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBmaXRUb0NvbnRhaW5lcihjb250YWluZXJIZWlnaHQpOiB2b2lkIHtcbiAgICAgICAgbGV0IF93ZWVrc0NvdW50O1xuXG4gICAgICAgIGlmICh0aGlzLm1vbnRoV2Vla3NDb3VudCA+IDApIHtcbiAgICAgICAgICAgIGNvbnN0IHdlZWtzQ291bnQgPSB0aGlzLm1vbnRoV2Vla3NDb3VudDtcbiAgICAgICAgICAgIF93ZWVrc0NvdW50ID0gd2Vla3NDb3VudDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIF93ZWVrc0NvdW50ID0gdGhpcy5kYXlzLmxlbmd0aCAvIDc7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5udW1iZXJPZldlZWsgPSBBcnJheS5mcm9tKEFycmF5KF93ZWVrc0NvdW50KS5rZXlzKCkpO1xuICAgICAgICB0aGlzLm51bWJlck9mV2VlayA9IHRoaXMubnVtYmVyT2ZXZWVrLm1hcCgodmFsdWUpID0+IHZhbHVlKTtcbiAgICAgICAgaWYgKHRoaXMuaXNQaWNrZXJNb2RlKSB7XG4gICAgICAgICAgICB0aGlzLmRheUhlaWdodCA9IDQwO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGF5SGVpZ2h0ID0gTWF0aC5mbG9vcihjb250YWluZXJIZWlnaHQgLyAoX3dlZWtzQ291bnQgKyAxKSk7XG5cbiAgICAgICAgdGhpcy5tYXhUYXNrQ291bnQgPSBNYXRoLmZsb29yKCh0aGlzLmRheUhlaWdodCAtIHRoaXMudGFza0hlaWdodCkgLyB0aGlzLnRhc2tIZWlnaHQpO1xuICAgICAgICBpZiAodGhpcy5tYXhUYXNrQ291bnQgPiAwKSB7XG4gICAgICAgICAgICB0aGlzLm1heFJvd1Rhc2tzID0gbmV3IEFycmF5KHRoaXMubWF4VGFza0NvdW50KS5maWxsKDApLm1hcCgoeCwgaSkgPT4gaSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcHJpdmF0ZSBfcHJlcGFyZURheXNUYXNrcyhjYWxlbmRhclRhc2tzKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLmlzUGlja2VyTW9kZSkge1xuICAgICAgICAgICAgdGhpcy53ZWVrVGFza3NBcnJheSA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsZW5kYXJGaWVsZHMgPSB0aGlzLmNhbGVuZGFyRmllbGRzO1xuXG4gICAgICAgIC8vIFNvcnQgYWxsIFRhc2tzXG4gICAgICAgIGNvbnN0IG1vRGF0YUxpc3QgPSB0aGlzLl9jYWxlbmRhclNlcnZpY2Uuc29ydFRhc2tzKGNhbGVuZGFyVGFza3MsIGNhbGVuZGFyRmllbGRzKTtcbiAgICAgICAgdGhpcy5kYXlzLmZvckVhY2goKGRheSkgPT4gKGRheS50YXNrcyA9IFtdKSk7XG4gICAgICAgIGNvbnN0IHdlZWtUYXNrc0FycmF5OiBhbnkgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCB0aGlzLmRheXMubGVuZ3RoIC8gNzsgaisrKSB7XG4gICAgICAgICAgICBjb25zdCBkYXlzID0gdGhpcy5kYXlzSW5XZWVrLnRyYW5zZm9ybSh0aGlzLmRheXMsIGopO1xuICAgICAgICAgICAgY29uc3Qgd2VlayA9IHRoaXMuX2NhbGVuZGFyU2VydmljZS5jcmVhdGVXZWVrVGFzayhkYXlzLCBtb0RhdGFMaXN0LCBjYWxlbmRhckZpZWxkcywgMCk7XG4gICAgICAgICAgICB3ZWVrVGFza3NBcnJheS5wdXNoKHdlZWspO1xuICAgICAgICB9XG5cbiAgICAgICAgd2Vla1Rhc2tzQXJyYXkuZm9yRWFjaCgod2VlaykgPT4ge1xuICAgICAgICAgICAgY29uc3QgYXJyOiBhbnlbXSA9IE9iamVjdC52YWx1ZXMod2Vlayk7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gYXJyLmxlbmd0aDsgaSA8IHRoaXMubWF4VGFza0NvdW50OyBpKyspIHtcbiAgICAgICAgICAgICAgICB3ZWVrW2kudG9TdHJpbmcoKV0gPSBbXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgICAgIC8vINio2Ycg2KfYstin24wg2YfYsSDYsdiv24zZgSDYqtiz2qkg2KjYp9uM2K8g2KrYudiv2KfYryA3INiz2KrZiNmGINin2LbYp9mB2Ycg2q/Ysdiv2K8g2Ygg2KjYsdin24wg2LPYqtmI2YbbjCDaqdmHINiq2LPaqduMINmG2K/Yp9ix2K8g24zaqSDYrNin24wg2K7Yp9mE24wgY29sc3BhbiAxINmF24zar9iw2KfYsduM2YVcbiAgICAgICAgd2Vla1Rhc2tzQXJyYXkuZm9yRWFjaCgod2VlaykgPT4ge1xuICAgICAgICAgICAgdGhpcy5fY2FsZW5kYXJTZXJ2aWNlLmZpbGxXZWVrKHdlZWspO1xuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy53ZWVrVGFza3NBcnJheSA9IHdlZWtUYXNrc0FycmF5O1xuICAgIH1cbn1cbiIsIjx0YWJsZSBmZC10YWJsZSBjbGFzcz1cInRhYmxlLWhlYWRlclwiIFtmZENvbXBhY3RdIFthdHRyLnBpY2tlcl09XCJkYXRlUGlja2VyXCI+XG4gICAgPHRoZWFkIGZkLXRhYmxlLWhlYWRlcj5cbiAgICAgICAgPHRyIGZkLXRhYmxlLXJvdz5cbiAgICAgICAgICAgIEBmb3IgKHdlZWtEYXkgb2Ygc2VsZWN0ZWRXZWVrRGF5czsgdHJhY2sgd2Vla0RheSkge1xuICAgICAgICAgICAgPHRoIGNsYXNzPVwid2Vla2RheS1oZWFkZXJcIiBmZC10YWJsZS1jZWxsIFtjbGFzcy5ub2JvcmRlcl09XCJpc1BpY2tlck1vZGVcIj5cbiAgICAgICAgICAgICAgICB7eyB3ZWVrRGF5IHwgc2xpY2U6IDA6MSB9fVxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIH1cbiAgICAgICAgPC90cj5cbiAgICA8L3RoZWFkPlxuICAgIDx0Ym9keSBmZC10YWJsZS1ib2R5PlxuICAgICAgICBAZm9yICh3ZWVrRGF5IG9mIG51bWJlck9mV2VlazsgdHJhY2sgd2Vla0RheSkge1xuICAgICAgICA8dHIgZmQtdGFibGUtcm93PlxuICAgICAgICAgICAgPHRkIFtzdHlsZS5oZWlnaHQucHhdPVwiZGF5SGVpZ2h0XCIgZmQtdGFibGUtY2VsbCBjb2xzcGFuPVwiN1wiIFtzdHlsZS5ib3JkZXJdPVwiaXNQaWNrZXJNb2RlID8gJ25vbmUnIDogbnVsbFwiPlxuICAgICAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAgICAgKm5nVGVtcGxhdGVPdXRsZXQ9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlclRhc2tzO1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRpbXBsaWNpdDogaXNQaWNrZXJNb2RlID8gbnVsbCA6IG1vRGF0YUxpc3Rbd2Vla0RheV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0luZGV4OiB3ZWVrRGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRheXM6IGRheXMgfCBkYXlzSW5XZWVrOiB3ZWVrRGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFJvd1Rhc2tzOiBtYXhSb3dUYXNrcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWVrRGF5czogd2Vla0RheXMsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldmljZVNpemU6IGRldmljZVNpemUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcnRsOiBydGwsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQaWNrZXJNb2RlOiBpc1BpY2tlck1vZGVcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICA+PC9uZy1jb250YWluZXI+XG4gICAgICAgICAgICA8L3RkPlxuICAgICAgICA8L3RyPlxuICAgICAgICB9XG4gICAgPC90Ym9keT5cbjwvdGFibGU+XG48bmctdGVtcGxhdGVcbiAgICAjcmVuZGVyVGFza3NcbiAgICBsZXQtdGFza1xuICAgIGxldC13ZWVrSW5kZXg9XCJ3ZWVrSW5kZXhcIlxuICAgIGxldC13ZWVrRGF5cz1cIndlZWtEYXlzXCJcbiAgICBsZXQtZGF5cz1cImRheXNcIlxuICAgIGxldC1tYXhSb3dUYXNrcz1cIm1heFJvd1Rhc2tzXCJcbiAgICBsZXQtY2FsZW5kYXJGaWVsZHM9XCJjYWxlbmRhckZpZWxkc1wiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtcnRsPVwicnRsXCJcbiAgICBsZXQtaXNQaWNrZXJNb2RlPVwiaXNQaWNrZXJNb2RlXCJcbj5cbiAgICA8dGFibGUgZmQtdGFibGUtYm9keSBjbGFzcz1cInRhYmxlLWNvbnRlbnRcIiBbY29tcGFjdF09XCJ0cnVlXCI+XG4gICAgICAgIDx0Ym9keT5cbiAgICAgICAgICAgIDx0ciBmZC10YWJsZS1yb3cgY2xhc3M9XCJyb3ctZGF5LW51bWJlclwiIFthdHRyLnJ0bF09XCJydGxcIj5cbiAgICAgICAgICAgICAgICBAZm9yIChkYXkgb2YgZGF5czsgdHJhY2sgZGF5KSB7XG4gICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgW2NsYXNzLm5vYm9yZGVyXT1cImlzUGlja2VyTW9kZVwiPlxuICAgICAgICAgICAgICAgICAgICA8YmMtZGF5LW51bWJlci1ib3hcbiAgICAgICAgICAgICAgICAgICAgICAgIFtuZ0NsYXNzXT1cIntcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZmQtY2FsZW5kYXJfX2l0ZW0nOiBpc1BpY2tlck1vZGUsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyF0dy1ib3JkZXIgIXR3LXJvdW5kZWQtbWQgdHctdHJhbnNpdGlvbi1hbGwgdHctY3Vyc29yLXBvaW50ZXInOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1BpY2tlck1vZGUgJiYgZGF5LmlzSW5Nb250aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIXR3LWJnLXRyYW5zcGFyZW50IHR3LWJvcmRlci1ncmF5LTEwMCBob3ZlcjohdHctYm9yZGVyLWdyYXktMzAwJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNQaWNrZXJNb2RlICYmIGRheS5pc0luTW9udGggJiYgIWRheS5pc1RvZGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICdmZC1jYWxlbmRhcl9faXRlbS0tb3RoZXItbW9udGgnOiBpc1BpY2tlck1vZGUgJiYgIWRheS5pc0luTW9udGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2ZkLWNhbGVuZGFyX19pdGVtLS13ZWVrZW5kJzogaXNQaWNrZXJNb2RlICYmIGRheS5pc1dlZWtlbmQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJyF0dy1iZy1ibHVlLTUwMCBob3ZlcjohdHctYmctYmx1ZS02MDAnOiBkYXkuaXNUb2RheVxuICAgICAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNQaWNrZXJNb2RlXT1cImlzUGlja2VyTW9kZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbZGF5XT1cImRheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXNBY3RpdmVdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmluZGV4ID09PSBzdGFydFNlbGVjdGVkRGF5SW5kZXggfHwgZGF5LmluZGV4ID09PSBlbmRTZWxlY3RlZERheUluZGV4IHx8IGRheS5kYXRlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgZXF1YWxEYXRlOiBzZWxlY3RlZERhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICBbaXRlbUluUmFuZ2VdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRTZWxlY3RlZERheUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRTZWxlY3RlZERheUluZGV4ICE9PSB1bmRlZmluZWQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXkuaW5kZXggPj0gc3RhcnRTZWxlY3RlZERheUluZGV4ICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF5LmluZGV4IDw9IGVuZFNlbGVjdGVkRGF5SW5kZXhcbiAgICAgICAgICAgICAgICAgICAgICAgIFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF5Q2xpY2spPVwib25EYXlDbGljayhkYXkpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChkYXlNb3VzZU1vdmUpPVwib25EYXlNb3VzZU1vdmUoZGF5KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAoZGF5TW91c2VEb3duKT1cIm9uRGF5TW91c2VEb3duKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGRheU1vdXNlVXApPVwib25EYXlNb3VzZVVwKGRheSlcIlxuICAgICAgICAgICAgICAgICAgICA+PC9iYy1kYXktbnVtYmVyLWJveD5cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICBAaWYgKCFpc1BpY2tlck1vZGUpIHtcbiAgICAgICAgICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgICAgICAgICAqbmdUZW1wbGF0ZU91dGxldD1cIlxuICAgICAgICAgICAgICAgICAgICByZW5kZXJEYXlUYXNrcztcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dDoge1xuICAgICAgICAgICAgICAgICAgICAgICAgJGltcGxpY2l0OiB3ZWVrVGFza3NBcnJheVt3ZWVrSW5kZXhdLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWF4Um93VGFza3M6IG1heFJvd1Rhc2tzLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0luZGV4OiB3ZWVrSW5kZXgsXG4gICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VTaXplOiBkZXZpY2VTaXplLFxuICAgICAgICAgICAgICAgICAgICAgICAgY2FsZW5kYXJGaWVsZHM6IGNhbGVuZGFyRmllbGRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgd2Vla0RheXM6IHdlZWtEYXlzXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBcIlxuICAgICAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgICAgICAgICAgPHRyIGZkLXRhYmxlLXJvdz5cbiAgICAgICAgICAgICAgICBAZm9yIChkYXkgb2YgZGF5czsgdHJhY2sgZGF5KSB7XG4gICAgICAgICAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgY2xhc3M9XCJtb3JlLWZkXCIgKGNsaWNrKT1cIm9uRGF5Qm94U2VsZWN0KGRheSlcIj5cbiAgICAgICAgICAgICAgICAgICAgQGlmIChtYXhSb3dUYXNrcz8ubGVuZ3RoIDwgZGF5LnRhc2tzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIGZkLWJ1dHRvbiAoY2xpY2spPVwib25Nb3JlQnV0dG9uKCRldmVudCwgcG9wb3ZlcilcIiBbZmRUeXBlXT1cIid0cmFuc3BhcmVudCdcIiBbY29tcGFjdF09XCJ0cnVlXCI+XG4gICAgICAgICAgICAgICAgICAgICAgICB7eyBkYXkudGFza3M/Lmxlbmd0aCAtIG1heFJvd1Rhc2tzPy5sZW5ndGggfX1cbiAgICAgICAgICAgICAgICAgICAgICAgIHt7ICdNb3JlJyB8IGJiYlRyYW5zbGF0ZSB9fVxuICAgICAgICAgICAgICAgICAgICA8L2J1dHRvbj5cbiAgICAgICAgICAgICAgICAgICAgPGZkLXBvcG92ZXJcbiAgICAgICAgICAgICAgICAgICAgICAgICNwb3BvdmVyXG4gICAgICAgICAgICAgICAgICAgICAgICBbbW9iaWxlXT1cImRldmljZVNpemUgPT09ICdzJ1wiXG4gICAgICAgICAgICAgICAgICAgICAgICBwbGFjZW1lbnQ9XCJib3R0b21cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW2ZvY3VzVHJhcHBlZF09XCJ0cnVlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtmb2N1c0F1dG9DYXB0dXJlXT1cInRydWVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgKGlzT3BlbkNoYW5nZSk9XCJvbk9wZW5Qb3BvdmVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgICAgICA8YmMtZGF5LWV2ZW50LWxpc3RcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGF5XT1cImRheVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbGVuZGFyRmllbGRzXT1cImNhbGVuZGFyRmllbGRzXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbZGV2aWNlU2l6ZV09XCJkZXZpY2VTaXplXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbd2Vla0RheXNdPVwid2Vla0RheXNcIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtydGxdPVwicnRsXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBbY2FuRGVsZXRlXT1cImNhbkRlbGV0ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhbkVkaXRdPVwiY2FuRWRpdFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW2NhblZpZXddPVwiY2FuVmlld1wiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW3BvcG92ZXJdPVwicG9wb3ZlclwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGRlbGV0ZUV2ZW50KT1cImRlbGV0ZUV2ZW50LmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGVkaXRFdmVudCk9XCJlZGl0RXZlbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgICAgID48L2JjLWRheS1ldmVudC1saXN0PlxuICAgICAgICAgICAgICAgICAgICA8L2ZkLXBvcG92ZXI+XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICA8L3RkPlxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIDwvdHI+XG4gICAgICAgICAgICB9XG4gICAgICAgIDwvdGJvZHk+XG4gICAgPC90YWJsZT5cbjwvbmctdGVtcGxhdGU+XG5cbjxuZy10ZW1wbGF0ZVxuICAgICNyZW5kZXJEYXlUYXNrc1xuICAgIGxldC13ZWVrVGFza3NcbiAgICBsZXQtbWF4Um93VGFza3M9XCJtYXhSb3dUYXNrc1wiXG4gICAgbGV0LXdlZWtJbmRleD1cIndlZWtJbmRleFwiXG4gICAgbGV0LWRldmljZVNpemU9XCJkZXZpY2VTaXplXCJcbiAgICBsZXQtY2FsZW5kYXJGaWVsZHM9XCJjYWxlbmRhckZpZWxkc1wiXG4gICAgbGV0LXdlZWtEYXlzPVwid2Vla0RheXNcIlxuPlxuICAgIEBmb3IgKHJvd1Rhc2sgb2YgbWF4Um93VGFza3M7IHRyYWNrIHJvd1Rhc2s7IGxldCBpID0gJGluZGV4KSB7XG4gICAgPHRyIGZkLXRhYmxlLXJvdz5cbiAgICAgICAgQGlmICghd2Vla1Rhc2tzW2ldIHx8IHdlZWtUYXNrc1tpXS5sZW5ndGggPT09IDApIHsgQGZvciAoZGF5IG9mIHdlZWtEYXlzOyB0cmFjayBkYXkpIHtcbiAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGw+PC90ZD5cbiAgICAgICAgfSB9IEBmb3IgKHRhc2sgb2Ygd2Vla1Rhc2tzW2ldOyB0cmFjayB0YXNrOyBsZXQgZGF5SW5kZXggPSAkaW5kZXgpIHsgQGlmICh0YXNrLmNvbFNwYW4pIHtcbiAgICAgICAgPHRkIGZkLXRhYmxlLWNlbGwgW2F0dHIuY29sc3Bhbl09XCJ0YXNrLmNvbFNwYW5cIj5cbiAgICAgICAgICAgIEBpZiAodGFzay5ldmVudCkge1xuICAgICAgICAgICAgPGJjLWV2ZW50LWJ1dHRvblxuICAgICAgICAgICAgICAgIFt0YXNrXT1cInRhc2tcIlxuICAgICAgICAgICAgICAgIFtjYWxlbmRhckZpZWxkc109XCJjYWxlbmRhckZpZWxkc1wiXG4gICAgICAgICAgICAgICAgW2RldmljZVNpemVdPVwiZGV2aWNlU2l6ZVwiXG4gICAgICAgICAgICAgICAgW3J0bF09XCJydGxcIlxuICAgICAgICAgICAgICAgIFtjYW5EZWxldGVdPVwiY2FuRGVsZXRlXCJcbiAgICAgICAgICAgICAgICBbY2FuRWRpdF09XCJjYW5FZGl0XCJcbiAgICAgICAgICAgICAgICBbY2FuVmlld109XCJjYW5WaWV3XCJcbiAgICAgICAgICAgICAgICAoZGVsZXRlRXZlbnQpPVwiZGVsZXRlRXZlbnQuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAoZWRpdEV2ZW50KT1cImVkaXRFdmVudC5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAgIChvcGVuUG9wb3ZlckNoYW5nZSk9XCJvbk9wZW5Qb3BvdmVyQ2hhbmdlKCRldmVudClcIlxuICAgICAgICAgICAgPjwvYmMtZXZlbnQtYnV0dG9uPlxuICAgICAgICAgICAgfSBAZWxzZSB7XG4gICAgICAgICAgICA8ZGl2IHN0eWxlPVwid2lkdGg6IDEwMCU7IGhlaWdodDogMTAwJVwiIChjbGljayk9XCJvbkRheVNlbGVjdCh3ZWVrSW5kZXgsIGRheUluZGV4KVwiPjwvZGl2PlxuICAgICAgICAgICAgfVxuICAgICAgICA8L3RkPlxuICAgICAgICB9IH1cbiAgICA8L3RyPlxuICAgIH1cbjwvbmctdGVtcGxhdGU+XG4iXX0=