@hxui/angular
Version:
This README includes the steps that are necessary to import the HxUi-angular into a project or to contribute with development.
203 lines (202 loc) • 23.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* @suppress {checkTypes} checked by tsc
*/
import { Component, EventEmitter, Output, Input, ElementRef } from '@angular/core';
import { PositioningService } from '../positioning/positioning.service';
var DatepickerComponent = /** @class */ (function () {
function DatepickerComponent(hostElement, positioningService) {
this.hostElement = hostElement;
this.positioningService = positioningService;
this.onDateSelected = new EventEmitter();
this.days = new Array();
this.week = ['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'];
this.cellCount = 41;
}
/**
* @return {?}
*/
DatepickerComponent.prototype.renderCalendar = /**
* @return {?}
*/
function () {
for (var /** @type {?} */ i = 0; i <= this.cellCount; i++) {
// date will be set to the first day of the month set in this.viewDate
var /** @type {?} */ date = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth());
// Shifts the week to start from Monday, rather than Sunday, this causes the index to start at 1
var /** @type {?} */ dayOffset = date.getDay() === 0 ? 7 : date.getDay();
this.days[i] = new Date(date.setDate(2 - dayOffset + i));
}
};
/**
* @return {?}
*/
DatepickerComponent.prototype.positionCalendar = /**
* @return {?}
*/
function () {
var /** @type {?} */ rect = this.hostElement.nativeElement.getBoundingClientRect();
var /** @type {?} */ buffer = 10;
if (this.positioningService.isElementBelowTheFold(this.hostElement.nativeElement)) {
this.hostElement.nativeElement.style.top = (rect.top - (rect.top + rect.height + buffer)) + 'px';
}
};
/**
* @return {?}
*/
DatepickerComponent.prototype.previousMonth = /**
* @return {?}
*/
function () {
this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() - 1);
this.renderCalendar();
};
/**
* @return {?}
*/
DatepickerComponent.prototype.nextMonth = /**
* @return {?}
*/
function () {
this.viewDate = new Date(this.viewDate.getFullYear(), this.viewDate.getMonth() + 1);
this.renderCalendar();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isCurrentMonth = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
return inputDate.getMonth() === this.viewDate.getMonth();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isCurrentDay = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
return inputDate.getTime() === this.presentDate.getTime();
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isSelectedDay = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
if (this.selectedDate) {
return inputDate.getTime() === this.selectedDate.getTime();
}
return false;
};
/**
* @param {?} inputDate
* @return {?}
*/
DatepickerComponent.prototype.isInvalidDay = /**
* @param {?} inputDate
* @return {?}
*/
function (inputDate) {
return this.validators.map(function (fn) { return fn(inputDate); }).reduce(function (prev, next) { return prev || next; }, false);
};
/**
* @param {?} date
* @return {?}
*/
DatepickerComponent.prototype.setSelectedDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
if (!this.isInvalidDay(date)) {
this.selectedDate = date;
this.onDateSelected.emit(date);
}
};
/**
* @param {?} changes
* @return {?}
*/
DatepickerComponent.prototype.ngOnChanges = /**
* @param {?} changes
* @return {?}
*/
function (changes) {
if (!!changes["selectedDate"].currentValue) {
this.viewDate = new Date(this.selectedDate.getFullYear(), this.selectedDate.getMonth());
}
};
/**
* @return {?}
*/
DatepickerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
var /** @type {?} */ date = new Date();
this.presentDate = new Date(date.getFullYear(), date.getMonth(), date.getDate());
this.viewDate = this.viewDate || new Date(date.getFullYear(), date.getMonth());
this.renderCalendar();
this.positionCalendar();
};
DatepickerComponent.decorators = [
{ type: Component, args: [{
selector: 'hxa-datepicker',
template: "<div class=\"hxui-reset\">\n <div class=\"hx-card hxa-datepicker-container\">\n <div class=\"hx-card-header hxa-datepicker-header\">\n <div class=\"hxa-datepicker-month\">\n <div class=\"hxa-datepicker-icon\" title=\"Previous Month\" (click)=\"previousMonth()\">\n <a class=\"hx-button is-transparent\"><i class=\"hx-icon icon-angle-left\"></i></a>\n </div>\n <div class=\"hxa-datepicker-month-title\">\n <span>{{viewDate.toLocaleString(\"en-au\", { month: \"long\", year: \"numeric\" })}}</span></div>\n <div class=\"hxa-datepicker-icon\" title=\"Next Month\" (click)=\"nextMonth()\">\n <a class=\"hx-button is-transparent\"><i class=\"hx-icon icon-angle-right\"></i></a>\n </div>\n </div>\n <div class=\"hxa-datepicker-week\">\n <div class=\"hxa-datepicker-weekday\" *ngFor=\"let weekday of week\">\n {{weekday | slice:0:3}}\n </div>\n </div>\n </div>\n <div class=\"hxa-datepicker-contents\">\n <div class=\"hxa-datepicker-day\" *ngFor=\"let day of days\" \n [ngClass]=\"{'hxa-datepicker-day-siblingmonth': !isCurrentMonth(day), \n 'hxa-datepicker-day-currentday': isCurrentDay(day),\n 'hxa-datepicker-day-selectedday': isSelectedDay(day),\n 'hxa-datepicker-day-invalidday': isInvalidDay(day)}\"\n (click)=\"setSelectedDate(day)\">\n <a class=\"hx-button is-transparent\">{{day.getDate()}}</a>\n </div>\n </div>\n </div>\n</div>",
styles: [".hxa-datepicker-container{max-width:21em;width:21em;height:24em;display:flex;flex-direction:column;font-size:1rem}.hxa-datepicker-header{padding:1rem 1rem 0;flex-direction:column;align-items:initial;justify-content:space-around;font-weight:100}.hxa-datepicker-icon{cursor:pointer;display:flex;flex:1;flex-direction:column;justify-content:center;align-items:center}.hxa-datepicker-icon .hx-button{position:initial!important;top:initial!important}.hxa-datepicker-icon .hx-button.is-transparent:hover{color:#000}.hxa-datepicker-icon .hx-icon{font-size:2.3em;position:initial!important;top:initial!important;color:#0d4d78}.hxa-datepicker-month{display:flex;text-align:center;margin-bottom:1rem}.hxa-datepicker-month-title{font-size:1.5em;flex:3;display:flex;justify-content:center;align-items:center;color:#0d4d78}.hxa-datepicker-week{display:flex;width:100%;text-align:center}.hxa-datepicker-weekday{flex:1;color:#0d4d78}.hxa-datepicker-contents{padding:1rem;background-color:rgba(246,246,249,.5);display:flex;flex-flow:row wrap;flex:1;justify-content:space-around;align-content:space-around}.hxa-datepicker-day{flex:1 1 14%;height:16.666%;display:flex;justify-content:center;align-items:center}.hxa-datepicker-day .hx-button{position:initial;top:initial;flex:1;font-weight:400;height:100%;padding:0;color:#41b987}.hxa-datepicker-day-siblingmonth .hx-button{color:#3b3b3b;font-weight:100}.hxa-datepicker-day-selectedday .hx-button{color:#fff;background:#41b987}.hxa-datepicker-day-invalidday .hx-button{color:#e0e0e1!important;pointer-events:none}.hxa-datepicker-day-currentday .hx-button{border:2px solid #41b987}"]
},] },
];
/** @nocollapse */
DatepickerComponent.ctorParameters = function () { return [
{ type: ElementRef, },
{ type: PositioningService, },
]; };
DatepickerComponent.propDecorators = {
"selectedDate": [{ type: Input },],
"validators": [{ type: Input },],
"onDateSelected": [{ type: Output },],
};
return DatepickerComponent;
}());
export { DatepickerComponent };
function DatepickerComponent_tsickle_Closure_declarations() {
/** @type {!Array<{type: !Function, args: (undefined|!Array<?>)}>} */
DatepickerComponent.decorators;
/**
* @nocollapse
* @type {function(): !Array<(null|{type: ?, decorators: (undefined|!Array<{type: !Function, args: (undefined|!Array<?>)}>)})>}
*/
DatepickerComponent.ctorParameters;
/** @type {!Object<string,!Array<{type: !Function, args: (undefined|!Array<?>)}>>} */
DatepickerComponent.propDecorators;
/** @type {?} */
DatepickerComponent.prototype.selectedDate;
/** @type {?} */
DatepickerComponent.prototype.validators;
/** @type {?} */
DatepickerComponent.prototype.onDateSelected;
/** @type {?} */
DatepickerComponent.prototype.viewDate;
/** @type {?} */
DatepickerComponent.prototype.days;
/** @type {?} */
DatepickerComponent.prototype.week;
/** @type {?} */
DatepickerComponent.prototype.presentDate;
/** @type {?} */
DatepickerComponent.prototype.cellCount;
/** @type {?} */
DatepickerComponent.prototype.hostElement;
/** @type {?} */
DatepickerComponent.prototype.positioningService;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9AaHh1aS9hbmd1bGFyLyIsInNvdXJjZXMiOlsibGliL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7OztBQUFBLE9BQU8sRUFBQyxTQUFTLEVBQVUsWUFBWSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQTRCLFVBQVUsRUFBQyxNQUFNLGVBQWUsQ0FBQztBQUNuSCxPQUFPLEVBQUMsa0JBQWtCLEVBQUMsTUFBTSxvQ0FBb0MsQ0FBQzs7SUFpRHBFLDZCQUNVLGFBQ0E7UUFEQSxnQkFBVyxHQUFYLFdBQVc7UUFDWCx1QkFBa0IsR0FBbEIsa0JBQWtCOzhCQVYwQixJQUFJLFlBQVksRUFBUTtvQkFHbkQsSUFBSSxLQUFLLEVBQVE7b0JBQ2YsQ0FBQyxRQUFRLEVBQUUsU0FBUyxFQUFFLFdBQVcsRUFBRSxVQUFVLEVBQUUsUUFBUSxFQUFFLFVBQVUsRUFBRSxRQUFRLENBQUM7eUJBRXZGLEVBQUU7S0FJK0I7Ozs7SUFHOUMsNENBQWM7Ozs7UUFDbkIsR0FBRyxDQUFDLENBQUMscUJBQUksQ0FBQyxHQUFHLENBQUMsRUFBRSxDQUFDLElBQUksSUFBSSxDQUFDLFNBQVMsRUFBRSxDQUFDLEVBQUUsRUFBRSxDQUFDOztZQUV6QyxxQkFBTSxJQUFJLEdBQVMsSUFBSSxJQUFJLENBQUMsSUFBSSxDQUFDLFFBQVEsQ0FBQyxXQUFXLEVBQUUsRUFBRSxJQUFJLENBQUMsUUFBUSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7O1lBRW5GLHFCQUFNLFNBQVMsR0FBRyxJQUFJLENBQUMsTUFBTSxFQUFFLEtBQUssQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLElBQUksQ0FBQyxNQUFNLEVBQUUsQ0FBQztZQUMxRCxJQUFJLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxHQUFHLElBQUksSUFBSSxDQUFDLElBQUksQ0FB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USxFQUFFLENBQUMsQ0FBQztTQUN6RjtLQUNGOzs7O0lBRUQsc0NBQVE7OztJQUFSO1FBQ0UscUJBQU0sSUFBSSxHQUFTLElBQUksSUFBSSxFQUFFLENBQUM7UUFDOUIsSUFBSSxDQUFDLFdBQVcsR0FBRyxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxFQUFFLElBQUksQ0FBQyxPQUFPLEVBQUUsQ0FBQyxDQUFDO1FBQ2pGLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLFFBQVEsSUFBSSxJQUFJLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFLEVBQUUsSUFBSSxDQUFDLFFBQVEsRUFBRSxDQUFDLENBQUM7UUFDL0UsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO0tBQ3pCOztnQkF4SEYsU0FBUyxTQUFDO29CQUNULFFBQVEsRUFBRSxnQkFBZ0I7b0JBQzFCLFFBQVEsRUFBRSxrK0NBOEJMO29CQUNMLE1BQU0sRUFBRSxDQUFDLDZrREFBNmtELENBQUM7aUJBQ3hsRDs7OztnQkFyQ2lGLFVBQVU7Z0JBQ3BGLGtCQUFrQjs7O2lDQXNDdkIsS0FBSzsrQkFDTCxLQUFLO21DQUVMLE1BQU07OzhCQTFDVDs7U0FzQ2EsbUJBQW1CIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtDb21wb25lbnQsIE9uSW5pdCwgRXZlbnRFbWl0dGVyLCBPdXRwdXQsIElucHV0LCBTaW1wbGVDaGFuZ2VzLCBPbkNoYW5nZXMsIEVsZW1lbnRSZWZ9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xyXG5pbXBvcnQge1Bvc2l0aW9uaW5nU2VydmljZX0gZnJvbSAnLi4vcG9zaXRpb25pbmcvcG9zaXRpb25pbmcuc2VydmljZSc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICBzZWxlY3RvcjogJ2h4YS1kYXRlcGlja2VyJyxcclxuICB0ZW1wbGF0ZTogYDxkaXYgY2xhc3M9XCJoeHVpLXJlc2V0XCI+XHJcbiAgPGRpdiBjbGFzcz1cImh4LWNhcmQgaHhhLWRhdGVwaWNrZXItY29udGFpbmVyXCI+XHJcbiAgICA8ZGl2IGNsYXNzPVwiaHgtY2FyZC1oZWFkZXIgaHhhLWRhdGVwaWNrZXItaGVhZGVyXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1tb250aFwiPlxyXG4gICAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1pY29uXCIgdGl0bGU9XCJQcmV2aW91cyBNb250aFwiIChjbGljayk9XCJwcmV2aW91c01vbnRoKClcIj5cclxuICAgICAgICAgICAgPGEgY2xhc3M9XCJoeC1idXR0b24gaXMtdHJhbnNwYXJlbnRcIj48aSBjbGFzcz1cImh4LWljb24gaWNvbi1hbmdsZS1sZWZ0XCI+PC9pPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItbW9udGgtdGl0bGVcIj5cclxuICAgICAgICAgIDxzcGFuPnt7dmlld0RhdGUudG9Mb2NhbGVTdHJpbmcoXCJlbi1hdVwiLCB7IG1vbnRoOiBcImxvbmdcIiwgeWVhcjogXCJudW1lcmljXCIgfSl9fTwvc3Bhbj48L2Rpdj5cclxuICAgICAgICA8ZGl2IGNsYXNzPVwiaHhhLWRhdGVwaWNrZXItaWNvblwiIHRpdGxlPVwiTmV4dCBNb250aFwiIChjbGljayk9XCJuZXh0TW9udGgoKVwiPlxyXG4gICAgICAgICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPjxpIGNsYXNzPVwiaHgtaWNvbiBpY29uLWFuZ2xlLXJpZ2h0XCI+PC9pPjwvYT5cclxuICAgICAgICA8L2Rpdj5cclxuICAgICAgPC9kaXY+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci13ZWVrXCI+XHJcbiAgICAgICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLXdlZWtkYXlcIiAqbmdGb3I9XCJsZXQgd2Vla2RheSBvZiB3ZWVrXCI+XHJcbiAgICAgICAgICB7e3dlZWtkYXkgfCBzbGljZTowOjN9fVxyXG4gICAgICAgIDwvZGl2PlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gICAgPGRpdiBjbGFzcz1cImh4YS1kYXRlcGlja2VyLWNvbnRlbnRzXCI+XHJcbiAgICAgIDxkaXYgY2xhc3M9XCJoeGEtZGF0ZXBpY2tlci1kYXlcIiAqbmdGb3I9XCJsZXQgZGF5IG9mIGRheXNcIiBcclxuICAgICAgICBbbmdDbGFzc109XCJ7J2h4YS1kYXRlcGlja2VyLWRheS1zaWJsaW5nbW9udGgnOiAhaXNDdXJyZW50TW9udGgoZGF5KSwgXHJcbiAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1jdXJyZW50ZGF5JzogaXNDdXJyZW50RGF5KGRheSksXHJcbiAgICAgICAgJ2h4YS1kYXRlcGlja2VyLWRheS1zZWxlY3RlZGRheSc6IGlzU2VsZWN0ZWREYXkoZGF5KSxcclxuICAgICAgICAnaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXknOiBpc0ludmFsaWREYXkoZGF5KX1cIlxyXG4gICAgICAgIChjbGljayk9XCJzZXRTZWxlY3RlZERhdGUoZGF5KVwiPlxyXG4gICAgICA8YSBjbGFzcz1cImh4LWJ1dHRvbiBpcy10cmFuc3BhcmVudFwiPnt7ZGF5LmdldERhdGUoKX19PC9hPlxyXG4gICAgICA8L2Rpdj5cclxuICAgIDwvZGl2PlxyXG4gIDwvZGl2PlxyXG48L2Rpdj5gLFxyXG4gIHN0eWxlczogW2AuaHhhLWRhdGVwaWNrZXItY29udGFpbmVye21heC13aWR0aDoyMWVtO3dpZHRoOjIxZW07aGVpZ2h0OjI0ZW07ZGlzcGxheTpmbGV4O2ZsZXgtZGlyZWN0aW9uOmNvbHVtbjtmb250LXNpemU6MXJlbX0uaHhhLWRhdGVwaWNrZXItaGVhZGVye3BhZGRpbmc6MXJlbSAxcmVtIDA7ZmxleC1kaXJlY3Rpb246Y29sdW1uO2FsaWduLWl0ZW1zOmluaXRpYWw7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDtmb250LXdlaWdodDoxMDB9Lmh4YS1kYXRlcGlja2VyLWljb257Y3Vyc29yOnBvaW50ZXI7ZGlzcGxheTpmbGV4O2ZsZXg6MTtmbGV4LWRpcmVjdGlvbjpjb2x1bW47anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLWljb24gLmh4LWJ1dHRvbntwb3NpdGlvbjppbml0aWFsIWltcG9ydGFudDt0b3A6aW5pdGlhbCFpbXBvcnRhbnR9Lmh4YS1kYXRlcGlja2VyLWljb24gLmh4LWJ1dHRvbi5pcy10cmFuc3BhcmVudDpob3Zlcntjb2xvcjojMDAwfS5oeGEtZGF0ZXBpY2tlci1pY29uIC5oeC1pY29ue2ZvbnQtc2l6ZToyLjNlbTtwb3NpdGlvbjppbml0aWFsIWltcG9ydGFudDt0b3A6aW5pdGlhbCFpbXBvcnRhbnQ7Y29sb3I6IzBkNGQ3OH0uaHhhLWRhdGVwaWNrZXItbW9udGh7ZGlzcGxheTpmbGV4O3RleHQtYWxpZ246Y2VudGVyO21hcmdpbi1ib3R0b206MXJlbX0uaHhhLWRhdGVwaWNrZXItbW9udGgtdGl0bGV7Zm9udC1zaXplOjEuNWVtO2ZsZXg6MztkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXI7Y29sb3I6IzBkNGQ3OH0uaHhhLWRhdGVwaWNrZXItd2Vla3tkaXNwbGF5OmZsZXg7d2lkdGg6MTAwJTt0ZXh0LWFsaWduOmNlbnRlcn0uaHhhLWRhdGVwaWNrZXItd2Vla2RheXtmbGV4OjE7Y29sb3I6IzBkNGQ3OH0uaHhhLWRhdGVwaWNrZXItY29udGVudHN7cGFkZGluZzoxcmVtO2JhY2tncm91bmQtY29sb3I6cmdiYSgyNDYsMjQ2LDI0OSwuNSk7ZGlzcGxheTpmbGV4O2ZsZXgtZmxvdzpyb3cgd3JhcDtmbGV4OjE7anVzdGlmeS1jb250ZW50OnNwYWNlLWFyb3VuZDthbGlnbi1jb250ZW50OnNwYWNlLWFyb3VuZH0uaHhhLWRhdGVwaWNrZXItZGF5e2ZsZXg6MSAxIDE0JTtoZWlnaHQ6MTYuNjY2JTtkaXNwbGF5OmZsZXg7anVzdGlmeS1jb250ZW50OmNlbnRlcjthbGlnbi1pdGVtczpjZW50ZXJ9Lmh4YS1kYXRlcGlja2VyLWRheSAuaHgtYnV0dG9ue3Bvc2l0aW9uOmluaXRpYWw7dG9wOmluaXRpYWw7ZmxleDoxO2ZvbnQtd2VpZ2h0OjQwMDtoZWlnaHQ6MTAwJTtwYWRkaW5nOjA7Y29sb3I6IzQxYjk4N30uaHhhLWRhdGVwaWNrZXItZGF5LXNpYmxpbmdtb250aCAuaHgtYnV0dG9ue2NvbG9yOiMzYjNiM2I7Zm9udC13ZWlnaHQ6MTAwfS5oeGEtZGF0ZXBpY2tlci1kYXktc2VsZWN0ZWRkYXkgLmh4LWJ1dHRvbntjb2xvcjojZmZmO2JhY2tncm91bmQ6IzQxYjk4N30uaHhhLWRhdGVwaWNrZXItZGF5LWludmFsaWRkYXkgLmh4LWJ1dHRvbntjb2xvcjojZTBlMGUxIWltcG9ydGFudDtwb2ludGVyLWV2ZW50czpub25lfS5oeGEtZGF0ZXBpY2tlci1kYXktY3VycmVudGRheSAuaHgtYnV0dG9ue2JvcmRlcjoycHggc29saWQgIzQxYjk4N31gXVxyXG59KVxyXG5leHBvcnQgY2xhc3MgRGF0ZXBpY2tlckNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgT25DaGFuZ2VzIHtcclxuICBASW5wdXQoKSBwdWJsaWMgc2VsZWN0ZWREYXRlOiBEYXRlO1xyXG4gIEBJbnB1dCgpIHB1YmxpYyB2YWxpZGF0b3JzOiBBcnJheTwoZGF0ZTogRGF0ZSkgPT4gYm9vbGVhbj47XHJcblxyXG4gIEBPdXRwdXQoKSBwdWJsaWMgb25EYXRlU2VsZWN0ZWQ6IEV2ZW50RW1pdHRlcjxEYXRlPiA9IG5ldyBFdmVudEVtaXR0ZXI8RGF0ZT4oKTtcclxuXHJcbiAgcHVibGljIHZpZXdEYXRlOiBEYXRlO1xyXG4gIHB1YmxpYyBkYXlzOiBBcnJheTxEYXRlPiA9IG5ldyBBcnJheTxEYXRlPigpO1xyXG4gIHB1YmxpYyB3ZWVrOiBBcnJheTxzdHJpbmc+ID0gWydNb25kYXknLCAnVHVlc2RheScsICdXZWRuZXNkYXknLCAnVGh1cnNkYXknLCAnRnJpZGF5JywgJ1NhdHVyZGF5JywgJ1N1bmRheSddO1xyXG4gIHByaXZhdGUgcHJlc2VudERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBjZWxsQ291bnQgPSA0MTtcclxuXHJcbiAgY29uc3RydWN0b3IoXHJcbiAgICBwcml2YXRlIGhvc3RFbGVtZW50OiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSBwb3NpdGlvbmluZ1NlcnZpY2U6IFBvc2l0aW9uaW5nU2VydmljZSkgeyB9XHJcblxyXG4gIC8vIFBvcHVsYXRlcyB0aGUgZGF5cyBhcnJheSB3aXRoIHRoZSBjdXJyZW50IG1vbnRoLCBhbmQgY29tcGxldGVzIHRoZSB2aWV3IHdpdGggcGFydGlhbCBkYXRlcyBmcm9tIHNpYmxpbmcgbW9udGhzXHJcbiAgcHVibGljIHJlbmRlckNhbGVuZGFyKCk6IHZvaWQge1xyXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPD0gdGhpcy5jZWxsQ291bnQ7IGkrKykge1xyXG4gICAgICAvLyBkYXRlIHdpbGwgYmUgc2V0IHRvIHRoZSBmaXJzdCBkYXkgb2YgdGhlIG1vbnRoIHNldCBpbiB0aGlzLnZpZXdEYXRlXHJcbiAgICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSh0aGlzLnZpZXdEYXRlLmdldEZ1bGxZZWFyKCksIHRoaXMudmlld0RhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICAgIC8vIFNoaWZ0cyB0aGUgd2VlayB0byBzdGFydCBmcm9tIE1vbmRheSwgcmF0aGVyIHRoYW4gU3VuZGF5LCB0aGlzIGNhdXNlcyB0aGUgaW5kZXggdG8gc3RhcnQgYXQgMVxyXG4gICAgICBjb25zdCBkYXlPZmZzZXQgPSBkYXRlLmdldERheSgpID09PSAwID8gNyA6IGRhdGUuZ2V0RGF5KCk7XHJcbiAgICAgIHRoaXMuZGF5c1tpXSA9IG5ldyBEYXRlKGRhdGUuc2V0RGF0ZSgyIC0gZGF5T2Zmc2V0ICsgaSkpO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgLy8gVE9ETzogTWF5YmUgd2Ugc2hvdWxkIG1vdmUgYWxsIG9mIHRoaXMgbG9naWMgaW50byB0aGUgcG9zaXRpb25pbmcgc2VydmljZT9cclxuICBwcml2YXRlIHBvc2l0aW9uQ2FsZW5kYXIoKTogdm9pZCB7XHJcbiAgICBjb25zdCByZWN0ID0gdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xyXG4gICAgY29uc3QgYnVmZmVyID0gMTA7XHJcbiAgICBpZiAodGhpcy5wb3NpdGlvbmluZ1NlcnZpY2UuaXNFbGVtZW50QmVsb3dUaGVGb2xkKHRoaXMuaG9zdEVsZW1lbnQubmF0aXZlRWxlbWVudCkpIHtcclxuICAgICAgdGhpcy5ob3N0RWxlbWVudC5uYXRpdmVFbGVtZW50LnN0eWxlLnRvcCA9IChyZWN0LnRvcCAtIChyZWN0LnRvcCArIHJlY3QuaGVpZ2h0ICsgYnVmZmVyKSkgKyAncHgnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHVibGljIHByZXZpb3VzTW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgLSAxKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBuZXh0TW9udGgoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy52aWV3RGF0ZS5nZXRGdWxsWWVhcigpLCB0aGlzLnZpZXdEYXRlLmdldE1vbnRoKCkgKyAxKTtcclxuICAgIHRoaXMucmVuZGVyQ2FsZW5kYXIoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc0N1cnJlbnRNb250aChpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dERhdGUuZ2V0TW9udGgoKSA9PT0gdGhpcy52aWV3RGF0ZS5nZXRNb250aCgpO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzQ3VycmVudERheShpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiBpbnB1dERhdGUuZ2V0VGltZSgpID09PSB0aGlzLnByZXNlbnREYXRlLmdldFRpbWUoKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBpc1NlbGVjdGVkRGF5KGlucHV0RGF0ZTogRGF0ZSk6IGJvb2xlYW4ge1xyXG4gICAgaWYgKHRoaXMuc2VsZWN0ZWREYXRlKSB7XHJcbiAgICAgIHJldHVybiBpbnB1dERhdGUuZ2V0VGltZSgpID09PSB0aGlzLnNlbGVjdGVkRGF0ZS5nZXRUaW1lKCk7XHJcbiAgICB9XHJcblxyXG4gICAgcmV0dXJuIGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHVibGljIGlzSW52YWxpZERheShpbnB1dERhdGU6IERhdGUpOiBib29sZWFuIHtcclxuICAgIHJldHVybiB0aGlzLnZhbGlkYXRvcnMubWFwKChmbikgPT4gZm4oaW5wdXREYXRlKSkucmVkdWNlKChwcmV2LCBuZXh0KSA9PiBwcmV2IHx8IG5leHQsIGZhbHNlKTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBzZXRTZWxlY3RlZERhdGUoZGF0ZTogRGF0ZSk6IHZvaWQge1xyXG4gICAgaWYgKCF0aGlzLmlzSW52YWxpZERheShkYXRlKSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IGRhdGU7XHJcbiAgICAgIHRoaXMub25EYXRlU2VsZWN0ZWQuZW1pdChkYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcclxuICAgIGlmICghIWNoYW5nZXMuc2VsZWN0ZWREYXRlLmN1cnJlbnRWYWx1ZSkge1xyXG4gICAgICB0aGlzLnZpZXdEYXRlID0gbmV3IERhdGUodGhpcy5zZWxlY3RlZERhdGUuZ2V0RnVsbFllYXIoKSwgdGhpcy5zZWxlY3RlZERhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpOiB2b2lkIHtcclxuICAgIGNvbnN0IGRhdGU6IERhdGUgPSBuZXcgRGF0ZSgpO1xyXG4gICAgdGhpcy5wcmVzZW50RGF0ZSA9IG5ldyBEYXRlKGRhdGUuZ2V0RnVsbFllYXIoKSwgZGF0ZS5nZXRNb250aCgpLCBkYXRlLmdldERhdGUoKSk7XHJcbiAgICB0aGlzLnZpZXdEYXRlID0gdGhpcy52aWV3RGF0ZSB8fCBuZXcgRGF0ZShkYXRlLmdldEZ1bGxZZWFyKCksIGRhdGUuZ2V0TW9udGgoKSk7XHJcbiAgICB0aGlzLnJlbmRlckNhbGVuZGFyKCk7XHJcbiAgICB0aGlzLnBvc2l0aW9uQ2FsZW5kYXIoKTtcclxuICB9XHJcbn1cclxuIl19