UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

131 lines 35.4 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { Component, ViewEncapsulation } from "@angular/core"; import moment from "moment/moment"; import { DatePickerInnerComponent } from "./date-picker-inner.component"; import * as i0 from "@angular/core"; import * as i1 from "./date-picker-inner.component"; import * as i2 from "@angular/common"; import * as i3 from "../button/button.component"; /** @ignore */ export class DayPickerComponent { constructor(datePicker) { this.datePicker = datePicker; this.labels = []; this.rows = []; this.weekNumbers = []; /* * TODO: Check the default value, Added variable * to avoid build prod crash */ this.todayDate = moment().toString(); this.datePicker = datePicker; } ngOnInit() { this.datePicker.stepDay = { months: 1 }; this.datePicker.setRefreshViewHandler(() => { const picker = this.datePicker; const value = picker.value && picker.value.isValid() ? picker.value.clone() : moment(); const month = value.month(); const firstDateOfMonthDayOfWeek = value .clone() .set("date", 1) .day(); const difference = picker.startingDay - firstDateOfMonthDayOfWeek; const numDisplayedFromPreviousMonth = difference > 0 ? 7 - difference : -difference; const firstDateOfMonth = numDisplayedFromPreviousMonth > 0 ? value .clone() .set("date", -numDisplayedFromPreviousMonth + 1) : value.clone().set("date", 1); // 42 is the number of days on a six-week calendar const _days = this.getDates(firstDateOfMonth, 42); const days = []; for (let i = 0; i < 42; i++) { const handler = this.datePicker.handleTimezone ? moment.parseZone : moment; const _dateObject = picker.createDateObject(handler(_days[i].date), picker.formatDay); _dateObject.secondary = _days[i].month !== month; _dateObject.uid = picker.uniqueId + "-" + i; _dateObject.isCellVisible = !(picker.onlyCurrentMonth && _dateObject.secondary); days[i] = _dateObject; } this.labels = []; for (let j = 0; j < 7; j++) { this.labels[j] = { abbr: picker.formatDate(days[j].date, picker.formatDayHeader), full: picker.formatDate(days[j].date, "EEEE"), }; } this.title = picker.formatDate(value, picker.formatDayTitle); this.rows = picker.split(days, 7).map((row) => ({ days: row, isRowVisible: !(picker.onlyCurrentMonth && row[0].secondary && row[6].secondary), })); if (picker.showWeeks) { const thursdayIndex = (4 + 7 - picker.startingDay) % 7; const numWeeks = this.rows.length; this.weekNumbers = []; for (let curWeek = 0; curWeek < numWeeks; curWeek++) { this.weekNumbers.push(moment(this.rows[curWeek].days[thursdayIndex].date).isoWeek()); } } }, "day"); this.datePicker.setCompareHandler((date1, date2) => { const d1 = moment({ year: date1.year(), month: date1.month(), date: date1.date(), }); const d2 = moment({ year: date2.year(), month: date2.month(), date: date2.date(), }); return d1.valueOf() - d2.valueOf(); }, "day"); } getDates(startDate, n) { const dates = new Array(n); let current = startDate.clone(); let i = 0; while (i < n) { dates[i++] = { date: current.toISOString(this.datePicker.handleTimezone), day: current.day(), month: current.month(), }; current = current.clone().date(current.date() + 1); } return dates; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayPickerComponent, deps: [{ token: i1.DatePickerInnerComponent }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: DayPickerComponent, selector: "nui-day-picker", ngImport: i0, template: "<table\n *ngIf=\"datePicker.datepickerMode === 'day'\"\n role=\"grid\"\n [attr.aria-labelledby]=\"datePicker.uniqueId + '-title'\"\n aria-activedescendant=\"activeDateId\"\n>\n <thead>\n <tr>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-left\"\n (click)=\"datePicker.move(-1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n <th [attr.colspan]=\"5 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n [id]=\"datePicker.uniqueId + '-title'\"\n displayStyle=\"action\"\n [disabled]=\"\n datePicker.datepickerMode === datePicker.maxMode\n \"\n class=\"change-mode-button\"\n [ngClass]=\"{\n disabled:\n datePicker.datepickerMode === datePicker.maxMode\n }\"\n (click)=\"datePicker.toggleMode($event)\"\n tabindex=\"-1\"\n >\n <span>{{ title }}</span>\n </button>\n </th>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-right\"\n (click)=\"datePicker.move(1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n </tr>\n <tr>\n <th *ngIf=\"datePicker.showWeeks\"></th>\n <th *ngFor=\"let label of labels\" class=\"text-center\">\n <div class=\"day-label\">\n <span aria-label=\"label.full\">{{ label.abbr }}</span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-template\n ngFor\n [ngForOf]=\"rows\"\n let-row=\"$implicit\"\n let-index=\"index\"\n >\n <tr *ngIf=\"row.isRowVisible\">\n <td *ngIf=\"datePicker.showWeeks\" class=\"h6 text-center\">\n <em>{{ weekNumbers[index] }}</em>\n </td>\n <td\n *ngFor=\"let cell of row.days\"\n class=\"text-center day\"\n [id]=\"cell.uid\"\n >\n <button\n *ngIf=\"cell.isCellVisible\"\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n [ngClass]=\"{\n selected: cell.selected,\n disabled: cell.disabled\n }\"\n [disabled]=\"cell.disabled\"\n (click)=\"datePicker.select(cell.date, $event)\"\n tabindex=\"-1\"\n >\n <span\n [ngClass]=\"{\n 'text-muted': cell.secondary,\n 'text-info': cell.current,\n today: cell.today\n }\"\n >{{ cell.label }}</span\n >\n </button>\n </td>\n </tr>\n </ng-template>\n <tr>\n <td [attr.colspan]=\"7 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n class=\"today-button\"\n displayStyle=\"action\"\n [disabled]=\"datePicker.isTodayButtonDisabled\"\n (click)=\"datePicker.select(todayDate, $event)\"\n i18n\n >\n Today\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n", dependencies: [{ kind: "directive", type: i2.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i2.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i3.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }], encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: DayPickerComponent, decorators: [{ type: Component, args: [{ selector: "nui-day-picker", encapsulation: ViewEncapsulation.None, template: "<table\n *ngIf=\"datePicker.datepickerMode === 'day'\"\n role=\"grid\"\n [attr.aria-labelledby]=\"datePicker.uniqueId + '-title'\"\n aria-activedescendant=\"activeDateId\"\n>\n <thead>\n <tr>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-left\"\n (click)=\"datePicker.move(-1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n <th [attr.colspan]=\"5 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n [id]=\"datePicker.uniqueId + '-title'\"\n displayStyle=\"action\"\n [disabled]=\"\n datePicker.datepickerMode === datePicker.maxMode\n \"\n class=\"change-mode-button\"\n [ngClass]=\"{\n disabled:\n datePicker.datepickerMode === datePicker.maxMode\n }\"\n (click)=\"datePicker.toggleMode($event)\"\n tabindex=\"-1\"\n >\n <span>{{ title }}</span>\n </button>\n </th>\n <th>\n <button\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n icon=\"caret-right\"\n (click)=\"datePicker.move(1, $event)\"\n tabindex=\"-1\"\n ></button>\n </th>\n </tr>\n <tr>\n <th *ngIf=\"datePicker.showWeeks\"></th>\n <th *ngFor=\"let label of labels\" class=\"text-center\">\n <div class=\"day-label\">\n <span aria-label=\"label.full\">{{ label.abbr }}</span>\n </div>\n </th>\n </tr>\n </thead>\n <tbody>\n <ng-template\n ngFor\n [ngForOf]=\"rows\"\n let-row=\"$implicit\"\n let-index=\"index\"\n >\n <tr *ngIf=\"row.isRowVisible\">\n <td *ngIf=\"datePicker.showWeeks\" class=\"h6 text-center\">\n <em>{{ weekNumbers[index] }}</em>\n </td>\n <td\n *ngFor=\"let cell of row.days\"\n class=\"text-center day\"\n [id]=\"cell.uid\"\n >\n <button\n *ngIf=\"cell.isCellVisible\"\n nui-button\n type=\"button\"\n displayStyle=\"action\"\n [ngClass]=\"{\n selected: cell.selected,\n disabled: cell.disabled\n }\"\n [disabled]=\"cell.disabled\"\n (click)=\"datePicker.select(cell.date, $event)\"\n tabindex=\"-1\"\n >\n <span\n [ngClass]=\"{\n 'text-muted': cell.secondary,\n 'text-info': cell.current,\n today: cell.today\n }\"\n >{{ cell.label }}</span\n >\n </button>\n </td>\n </tr>\n </ng-template>\n <tr>\n <td [attr.colspan]=\"7 + (datePicker.showWeeks ? 1 : 0)\">\n <button\n nui-button\n type=\"button\"\n class=\"today-button\"\n displayStyle=\"action\"\n [disabled]=\"datePicker.isTodayButtonDisabled\"\n (click)=\"datePicker.select(todayDate, $event)\"\n i18n\n >\n Today\n </button>\n </td>\n </tr>\n </tbody>\n</table>\n" }] }], ctorParameters: () => [{ type: i1.DatePickerInnerComponent }] }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1waWNrZXItZGF5LXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi9zcmMvbGliL2RhdGUtcGlja2VyL2RhdGUtcGlja2VyLWRheS1waWNrZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vc3JjL2xpYi9kYXRlLXBpY2tlci9kYXRlLXBpY2tlci1kYXktcGlja2VyLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQUUsU0FBUyxFQUFVLGlCQUFpQixFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ3JFLE9BQU8sTUFBa0IsTUFBTSxlQUFlLENBQUM7QUFFL0MsT0FBTyxFQUFFLHdCQUF3QixFQUFFLE1BQU0sK0JBQStCLENBQUM7Ozs7O0FBRXpFLGNBQWM7QUFNZCxNQUFNLE9BQU8sa0JBQWtCO0lBWTNCLFlBQW1CLFVBQW9DO1FBQXBDLGVBQVUsR0FBVixVQUFVLENBQTBCO1FBWGhELFdBQU0sR0FBVSxFQUFFLENBQUM7UUFFbkIsU0FBSSxHQUFVLEVBQUUsQ0FBQztRQUNqQixnQkFBVyxHQUFhLEVBQUUsQ0FBQztRQUVsQzs7O1dBR0c7UUFDSSxjQUFTLEdBQVcsTUFBTSxFQUFFLENBQUMsUUFBUSxFQUFFLENBQUM7UUFHM0MsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7SUFDakMsQ0FBQztJQUVNLFFBQVE7UUFDWCxJ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QU8sS0FBSyxDQUFDO0lBQ2pCLENBQUM7K0dBdklRLGtCQUFrQjttR0FBbEIsa0JBQWtCLHNEQy9CL0Isd29JQW9IQTs7NEZEckZhLGtCQUFrQjtrQkFMOUIsU0FBUzsrQkFDSSxnQkFBZ0IsaUJBRVgsaUJBQWlCLENBQUMsSUFBSSIsInNvdXJjZXNDb250ZW50IjpbIi8vIMKpIDIwMjIgU29sYXJXaW5kcyBXb3JsZHdpZGUsIExMQy4gQWxsIHJpZ2h0cyByZXNlcnZlZC5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyAgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgXCJTb2Z0d2FyZVwiKSwgdG9cbi8vICBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmcgd2l0aG91dCBsaW1pdGF0aW9uIHRoZVxuLy8gIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzXG4vLyAgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpblxuLy8gIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vICBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSxcbi8vICBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTiBOTyBFVkVOVCBTSEFMTCBUSEVcbi8vICBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyAgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSxcbi8vICBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEUgVVNFIE9SIE9USEVSIERFQUxJTkdTIElOXG4vLyAgVEhFIFNPRlRXQVJFLlxuXG5pbXBvcnQgeyBDb21wb25lbnQsIE9uSW5pdCwgVmlld0VuY2Fwc3VsYXRpb24gfSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IG1vbWVudCwgeyBNb21lbnQgfSBmcm9tIFwibW9tZW50L21vbWVudFwiO1xuXG5pbXBvcnQgeyBEYXRlUGlja2VySW5uZXJDb21wb25lbnQgfSBmcm9tIFwiLi9kYXRlLXBpY2tlci1pbm5lci5jb21wb25lbnRcIjtcblxuLyoqIEBpZ25vcmUgKi9cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiBcIm51aS1kYXktcGlja2VyXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9kYXRlLXBpY2tlci1kYXktcGlja2VyLmNvbXBvbmVudC5odG1sXCIsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbn0pXG5leHBvcnQgY2xhc3MgRGF5UGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0IHtcbiAgICBwdWJsaWMgbGFiZWxzOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyB0aXRsZTogc3RyaW5nO1xuICAgIHB1YmxpYyByb3dzOiBhbnlbXSA9IFtdO1xuICAgIHB1YmxpYyB3ZWVrTnVtYmVyczogbnVtYmVyW10gPSBbXTtcblxuICAgIC8qXG4gICAgICogIFRPRE86IENoZWNrIHRoZSBkZWZhdWx0IHZhbHVlLCBBZGRlZCB2YXJpYWJsZVxuICAgICAqICB0byBhdm9pZCBidWlsZCBwcm9kIGNyYXNoXG4gICAgICovXG4gICAgcHVibGljIHRvZGF5RGF0ZTogc3RyaW5nID0gbW9tZW50KCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0cnVjdG9yKHB1YmxpYyBkYXRlUGlja2VyOiBEYXRlUGlja2VySW5uZXJDb21wb25lbnQpIHtcbiAgICAgICAgdGhpcy5kYXRlUGlja2VyID0gZGF0ZVBpY2tlcjtcbiAgICB9XG5cbiAgICBwdWJsaWMgbmdPbkluaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuZGF0ZVBpY2tlci5zdGVwRGF5ID0geyBtb250aHM6IDEgfTtcblxuICAgICAgICB0aGlzLmRhdGVQaWNrZXIuc2V0UmVmcmVzaFZpZXdIYW5kbGVyKCgpOiB2b2lkID0+IHtcbiAgICAgICAgICAgIGNvbnN0IHBpY2tlciA9IHRoaXMuZGF0ZVBpY2tlcjtcbiAgICAgICAgICAgIGNvbnN0IHZhbHVlID1cbiAgICAgICAgICAgICAgICBwaWNrZXIudmFsdWUgJiYgcGlja2VyLnZhbHVlLmlzVmFsaWQoKVxuICAgICAgICAgICAgICAgICAgICA/IHBpY2tlci52YWx1ZS5jbG9uZSgpXG4gICAgICAgICAgICAgICAgICAgIDogbW9tZW50KCk7XG5cbiAgICAgICAgICAgIGNvbnN0IG1vbnRoID0gdmFsdWUubW9udGgoKTtcbiAgICAgICAgICAgIGNvbnN0IGZpcnN0RGF0ZU9mTW9udGhEYXlPZldlZWsgPSB2YWx1ZVxuICAgICAgICAgICAgICAgIC5jbG9uZSgpXG4gICAgICAgICAgICAgICAgLnNldChcImRhdGVcIiwgMSlcbiAgICAgICAgICAgICAgICAuZGF5KCk7XG4gICAgICAgICAgICBjb25zdCBkaWZmZXJlbmNlID0gcGlja2VyLnN0YXJ0aW5nRGF5IC0gZmlyc3REYXRlT2ZNb250aERheU9mV2VlaztcbiAgICAgICAgICAgIGNvbnN0IG51bURpc3BsYXllZEZyb21QcmV2aW91c01vbnRoID1cbiAgICAgICAgICAgICAgICBkaWZmZXJlbmNlID4gMCA/IDcgLSBkaWZmZXJlbmNlIDogLWRpZmZlcmVuY2U7XG4gICAgICAgICAgICBjb25zdCBmaXJzdERhdGVPZk1vbnRoID1cbiAgICAgICAgICAgICAgICBudW1EaXNwbGF5ZWRGcm9tUHJldmlvdXNNb250aCA+IDBcbiAgICAgICAgICAgICAgICAgICAgPyB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuY2xvbmUoKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAuc2V0KFwiZGF0ZVwiLCAtbnVtRGlzcGxheWVkRnJvbVByZXZpb3VzTW9udGggKyAxKVxuICAgICAgICAgICAgICAgICAgICA6IHZhbHVlLmNsb25lKCkuc2V0KFwiZGF0ZVwiLCAxKTtcblxuICAgICAgICAgICAgLy8gNDIgaXMgdGhlIG51bWJlciBvZiBkYXlzIG9uIGEgc2l4LXdlZWsgY2FsZW5kYXJcbiAgICAgICAgICAgIGNvbnN0IF9kYXlzOiBhbnlbXSA9IHRoaXMuZ2V0RGF0ZXMoZmlyc3REYXRlT2ZNb250aCwgNDIpO1xuICAgICAgICAgICAgY29uc3QgZGF5czogYW55W10gPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCA0MjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgaGFuZGxlciA9IHRoaXMuZGF0ZVBpY2tlci5oYW5kbGVUaW1lem9uZVxuICAgICAgICAgICAgICAgICAgICA/IG1vbWVudC5wYXJzZVpvbmVcbiAgICAgICAgICAgICAgICAgICAgOiBtb21lbnQ7XG4gICAgICAgICAgICAgICAgY29uc3QgX2RhdGVPYmplY3QgPSBwaWNrZXIuY3JlYXRlRGF0ZU9iamVjdChcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlcihfZGF5c1tpXS5kYXRlKSxcbiAgICAgICAgICAgICAgICAgICAgcGlja2VyLmZvcm1hdERheVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICBfZGF0ZU9iamVjdC5zZWNvbmRhcnkgPSBfZGF5c1tpXS5tb250aCAhPT0gbW9udGg7XG4gICAgICAgICAgICAgICAgX2RhdGVPYmplY3QudWlkID0gcGlja2VyLnVuaXF1ZUlkICsgXCItXCIgKyBpO1xuICAgICAgICAgICAgICAgIF9kYXRlT2JqZWN0LmlzQ2VsbFZpc2libGUgPSAhKFxuICAgICAgICAgICAgICAgICAgICBwaWNrZXIub25seUN1cnJlbnRNb250aCAmJiBfZGF0ZU9iamVjdC5zZWNvbmRhcnlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgIGRheXNbaV0gPSBfZGF0ZU9iamVjdDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5sYWJlbHMgPSBbXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgaiA9IDA7IGogPCA3OyBqKyspIHtcbiAgICAgICAgICAgICAgICB0aGlzLmxhYmVsc1tqXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgYWJicjogcGlja2VyLmZvcm1hdERhdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXlzW2pdLmRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBwaWNrZXIuZm9ybWF0RGF5SGVhZGVyXG4gICAgICAgICAgICAgICAgICAgICksXG4gICAgICAgICAgICAgICAgICAgIGZ1bGw6IHBpY2tlci5mb3JtYXREYXRlKGRheXNbal0uZGF0ZSwgXCJFRUVFXCIpLFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudGl0bGUgPSBwaWNrZXIuZm9ybWF0RGF0ZSh2YWx1ZSwgcGlja2VyLmZvcm1hdERheVRpdGxlKTtcbiAgICAgICAgICAgIHRoaXMucm93cyA9IHBpY2tlci5zcGxpdChkYXlzLCA3KS5tYXAoKHJvdykgPT4gKHtcbiAgICAgICAgICAgICAgICBkYXlzOiByb3csXG4gICAgICAgICAgICAgICAgaXNSb3dWaXNpYmxlOiAhKFxuICAgICAgICAgICAgICAgICAgICBwaWNrZXIub25seUN1cnJlbnRNb250aCAmJlxuICAgICAgICAgICAgICAgICAgICByb3dbMF0uc2Vjb25kYXJ5ICYmXG4gICAgICAgICAgICAgICAgICAgIHJvd1s2XS5zZWNvbmRhcnlcbiAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgfSkpO1xuXG4gICAgICAgICAgICBpZiAocGlja2VyLnNob3dXZWVrcykge1xuICAgICAgICAgICAgICAgIGNvbnN0IHRodXJzZGF5SW5kZXggPSAoNCArIDcgLSBwaWNrZXIuc3RhcnRpbmdEYXkpICUgNztcbiAgICAgICAgICAgICAgICBjb25zdCBudW1XZWVrcyA9IHRoaXMucm93cy5sZW5ndGg7XG5cbiAgICAgICAgICAgICAgICB0aGlzLndlZWtOdW1iZXJzID0gW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBjdXJXZWVrID0gMDsgY3VyV2VlayA8IG51bVdlZWtzOyBjdXJXZWVrKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy53ZWVrTnVtYmVycy5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAgICAgbW9tZW50KFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucm93c1tjdXJXZWVrXS5kYXlzW3RodXJzZGF5SW5kZXhdLmRhdGVcbiAgICAgICAgICAgICAgICAgICAgICAgICkuaXNvV2VlaygpXG4gICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBcImRheVwiKTtcblxuICAgICAgICB0aGlzLmRhdGVQaWNrZXIuc2V0Q29tcGFyZUhhbmRsZXIoXG4gICAgICAgICAgICAoZGF0ZTE6IE1vbWVudCwgZGF0ZTI6IE1vbWVudCk6IG51bWJlciA9PiB7XG4gICAgICAgICAgICAgICAgY29uc3QgZDEgPSBtb21lbnQoe1xuICAgICAgICAgICAgICAgICAgICB5ZWFyOiBkYXRlMS55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiBkYXRlMS5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiBkYXRlMS5kYXRlKCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgY29uc3QgZDIgPSBtb21lbnQoe1xuICAgICAgICAgICAgICAgICAgICB5ZWFyOiBkYXRlMi55ZWFyKCksXG4gICAgICAgICAgICAgICAgICAgIG1vbnRoOiBkYXRlMi5tb250aCgpLFxuICAgICAgICAgICAgICAgICAgICBkYXRlOiBkYXRlMi5kYXRlKCksXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGQxLnZhbHVlT2YoKSAtIGQyLnZhbHVlT2YoKTtcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcImRheVwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJvdGVjdGVkIGdldERhdGVzKHN0YXJ0RGF0ZTogTW9tZW50LCBuOiBudW1iZXIpOiBNb21lbnRbXSB7XG4gICAgICAgIGNvbnN0IGRhdGVzOiBhbnlbXSA9IG5ldyBBcnJheShuKTtcblxuICAgICAgICBsZXQgY3VycmVudCA9IHN0YXJ0RGF0ZS5jbG9uZSgpO1xuICAgICAgICBsZXQgaSA9IDA7XG5cbiAgICAgICAgd2hpbGUgKGkgPCBuKSB7XG4gICAgICAgICAgICBkYXRlc1tpKytdID0ge1xuICAgICAgICAgICAgICAgIGRhdGU6IGN1cnJlbnQudG9JU09TdHJpbmcodGhpcy5kYXRlUGlja2VyLmhhbmRsZVRpbWV6b25lKSxcbiAgICAgICAgICAgICAgICBkYXk6IGN1cnJlbnQuZGF5KCksXG4gICAgICAgICAgICAgICAgbW9udGg6IGN1cnJlbnQubW9udGgoKSxcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGN1cnJlbnQgPSBjdXJyZW50LmNsb25lKCkuZGF0ZShjdXJyZW50LmRhdGUoKSArIDEpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGRhdGVzO1xuICAgIH1cbn1cbiIsIjx0YWJsZVxuICAgICpuZ0lmPVwiZGF0ZVBpY2tlci5kYXRlcGlja2VyTW9kZSA9PT0gJ2RheSdcIlxuICAgIHJvbGU9XCJncmlkXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsbGVkYnldPVwiZGF0ZVBpY2tlci51bmlxdWVJZCArICctdGl0bGUnXCJcbiAgICBhcmlhLWFjdGl2ZWRlc2NlbmRhbnQ9XCJhY3RpdmVEYXRlSWRcIlxuPlxuICAgIDx0aGVhZD5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0eWxlPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNhcmV0LWxlZnRcIlxuICAgICAgICAgICAgICAgICAgICAoY2xpY2spPVwiZGF0ZVBpY2tlci5tb3ZlKC0xLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgICAgIDx0aCBbYXR0ci5jb2xzcGFuXT1cIjUgKyAoZGF0ZVBpY2tlci5zaG93V2Vla3MgPyAxIDogMClcIj5cbiAgICAgICAgICAgICAgICA8YnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIG51aS1idXR0b25cbiAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIFtpZF09XCJkYXRlUGlja2VyLnVuaXF1ZUlkICsgJy10aXRsZSdcIlxuICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICBbZGlzYWJsZWRdPVwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlID09PSBkYXRlUGlja2VyLm1heE1vZGVcbiAgICAgICAgICAgICAgICAgICAgXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJjaGFuZ2UtbW9kZS1idXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBbbmdDbGFzc109XCJ7XG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNhYmxlZDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRlUGlja2VyLmRhdGVwaWNrZXJNb2RlID09PSBkYXRlUGlja2VyLm1heE1vZGVcbiAgICAgICAgICAgICAgICAgICAgfVwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnRvZ2dsZU1vZGUoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgICAgIHRhYmluZGV4PVwiLTFcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPHNwYW4+e3sgdGl0bGUgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9idXR0b24+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICAgICAgPHRoPlxuICAgICAgICAgICAgICAgIDxidXR0b25cbiAgICAgICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICAgICAgICAgICAgICAgICAgZGlzcGxheVN0eWxlPVwiYWN0aW9uXCJcbiAgICAgICAgICAgICAgICAgICAgaWNvbj1cImNhcmV0LXJpZ2h0XCJcbiAgICAgICAgICAgICAgICAgICAgKGNsaWNrKT1cImRhdGVQaWNrZXIubW92ZSgxLCAkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgPjwvYnV0dG9uPlxuICAgICAgICAgICAgPC90aD5cbiAgICAgICAgPC90cj5cbiAgICAgICAgPHRyPlxuICAgICAgICAgICAgPHRoICpuZ0lmPVwiZGF0ZVBpY2tlci5zaG93V2Vla3NcIj48L3RoPlxuICAgICAgICAgICAgPHRoICpuZ0Zvcj1cImxldCBsYWJlbCBvZiBsYWJlbHNcIiBjbGFzcz1cInRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgPGRpdiBjbGFzcz1cImRheS1sYWJlbFwiPlxuICAgICAgICAgICAgICAgICAgICA8c3BhbiBhcmlhLWxhYmVsPVwibGFiZWwuZnVsbFwiPnt7IGxhYmVsLmFiYnIgfX08L3NwYW4+XG4gICAgICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgICA8L3RoPlxuICAgICAgICA8L3RyPlxuICAgIDwvdGhlYWQ+XG4gICAgPHRib2R5PlxuICAgICAgICA8bmctdGVtcGxhdGVcbiAgICAgICAgICAgIG5nRm9yXG4gICAgICAgICAgICBbbmdGb3JPZl09XCJyb3dzXCJcbiAgICAgICAgICAgIGxldC1yb3c9XCIkaW1wbGljaXRcIlxuICAgICAgICAgICAgbGV0LWluZGV4PVwiaW5kZXhcIlxuICAgICAgICA+XG4gICAgICAgICAgICA8dHIgKm5nSWY9XCJyb3cuaXNSb3dWaXNpYmxlXCI+XG4gICAgICAgICAgICAgICAgPHRkICpuZ0lmPVwiZGF0ZVBpY2tlci5zaG93V2Vla3NcIiBjbGFzcz1cImg2IHRleHQtY2VudGVyXCI+XG4gICAgICAgICAgICAgICAgICAgIDxlbT57eyB3ZWVrTnVtYmVyc1tpbmRleF0gfX08L2VtPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICAgICAgPHRkXG4gICAgICAgICAgICAgICAgICAgICpuZ0Zvcj1cImxldCBjZWxsIG9mIHJvdy5kYXlzXCJcbiAgICAgICAgICAgICAgICAgICAgY2xhc3M9XCJ0ZXh0LWNlbnRlciBkYXlcIlxuICAgICAgICAgICAgICAgICAgICBbaWRdPVwiY2VsbC51aWRcIlxuICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgKm5nSWY9XCJjZWxsLmlzQ2VsbFZpc2libGVcIlxuICAgICAgICAgICAgICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkOiBjZWxsLnNlbGVjdGVkLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVkOiBjZWxsLmRpc2FibGVkXG4gICAgICAgICAgICAgICAgICAgICAgICB9XCJcbiAgICAgICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJjZWxsLmRpc2FibGVkXCJcbiAgICAgICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnNlbGVjdChjZWxsLmRhdGUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICAgICAgdGFiaW5kZXg9XCItMVwiXG4gICAgICAgICAgICAgICAgICAgID5cbiAgICAgICAgICAgICAgICAgICAgICAgIDxzcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1tdXRlZCc6IGNlbGwuc2Vjb25kYXJ5LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndGV4dC1pbmZvJzogY2VsbC5jdXJyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RheTogY2VsbC50b2RheVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgID57eyBjZWxsLmxhYmVsIH19PC9zcGFuXG4gICAgICAgICAgICAgICAgICAgICAgICA+XG4gICAgICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgICAgIDwvdGQ+XG4gICAgICAgICAgICA8L3RyPlxuICAgICAgICA8L25nLXRlbXBsYXRlPlxuICAgICAgICA8dHI+XG4gICAgICAgICAgICA8dGQgW2F0dHIuY29sc3Bhbl09XCI3ICsgKGRhdGVQaWNrZXIuc2hvd1dlZWtzID8gMSA6IDApXCI+XG4gICAgICAgICAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgICAgICAgICBudWktYnV0dG9uXG4gICAgICAgICAgICAgICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICAgICAgICAgICAgICBjbGFzcz1cInRvZGF5LWJ1dHRvblwiXG4gICAgICAgICAgICAgICAgICAgIGRpc3BsYXlTdHlsZT1cImFjdGlvblwiXG4gICAgICAgICAgICAgICAgICAgIFtkaXNhYmxlZF09XCJkYXRlUGlja2VyLmlzVG9kYXlCdXR0b25EaXNhYmxlZFwiXG4gICAgICAgICAgICAgICAgICAgIChjbGljayk9XCJkYXRlUGlja2VyLnNlbGVjdCh0b2RheURhdGUsICRldmVudClcIlxuICAgICAgICAgICAgICAgICAgICBpMThuXG4gICAgICAgICAgICAgICAgPlxuICAgICAgICAgICAgICAgICAgICBUb2RheVxuICAgICAgICAgICAgICAgIDwvYnV0dG9uPlxuICAgICAgICAgICAgPC90ZD5cbiAgICAgICAgPC90cj5cbiAgICA8L3Rib2R5PlxuPC90YWJsZT5cbiJdfQ==