materialize-angular
Version:
Material UI Angular library
275 lines • 23.2 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: app/completed-components/datepicker/datepicker.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
/**
* @license
* Copyright Workylab. All Rights Reserved.
*
* Use of this source code is governed by an MIT-style license that can be
* found in the LICENSE file at https://raw.githubusercontent.com/workylab/materialize-angular/master/LICENSE
*/
import { Component, ElementRef, forwardRef, Input, ViewChild } from '@angular/core';
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { config } from '../../config';
import { INPUT_TYPE } from '../input/input.model';
export class DatePickerComponent {
constructor() {
this.className = DatePickerComponent.defaultProps.className;
this.disabled = DatePickerComponent.defaultProps.disabled;
this.displayOtherMonthDays = DatePickerComponent.defaultProps.displayOtherMonthDays;
this.floatLabel = DatePickerComponent.defaultProps.floatLabel;
this.format = DatePickerComponent.defaultProps.format;
this.fullSize = DatePickerComponent.defaultProps.fullSize;
this.id = DatePickerComponent.defaultProps.id;
this.name = DatePickerComponent.defaultProps.name;
this.placeholder = DatePickerComponent.defaultProps.placeholder;
this.required = DatePickerComponent.defaultProps.required;
this.inputValue = DatePickerComponent.defaultProps.value;
this.prefix = config.components.prefix;
this.isOpen = false;
this.close = this.close.bind(this);
}
/**
* @return {?}
*/
ngOnInit() {
// this.date = this.buildDate(this.inputValue);
}
/**
* @param {?} selectedDate
* @return {?}
*/
onSelectDay(selectedDate) {
this.isOpen = false;
this.date = selectedDate.date;
this.inputValue = this.formatDate(selectedDate.date);
this.onChange(selectedDate.date);
}
/**
* @param {?} date
* @return {?}
*/
formatDate(date) {
/** @type {?} */
const day = date.getDate();
/** @type {?} */
const month = date.getMonth() + 1;
/** @type {?} */
const dayString = day < 10
? `0${day}`
: day.toString();
/** @type {?} */
const monthString = month < 10
? `0${month}`
: month.toString();
/** @type {?} */
const yearString = date.getFullYear().toString();
/** @type {?} */
const formatedDate = this.format
.replace('dd', dayString)
.replace('mm', monthString)
.replace('yyyy', yearString);
return formatedDate;
}
/**
* @param {?} value
* @return {?}
*/
buildDate(value) {
/** @type {?} */
const dayStartPosition = this.format.indexOf(DatePickerComponent.DAY_KEY);
/** @type {?} */
const monthStartPosition = this.format.indexOf(DatePickerComponent.MONTH_KEY);
/** @type {?} */
const yearStartPosition = this.format.indexOf(DatePickerComponent.YEAR_KEY);
if (dayStartPosition >= 0 && monthStartPosition >= 0 && yearStartPosition >= 0) {
/** @type {?} */
const dayEndPosition = dayStartPosition + DatePickerComponent.DAY_KEY.length;
/** @type {?} */
const monthEndPosition = monthStartPosition + DatePickerComponent.MONTH_KEY.length;
/** @type {?} */
const yearEndPosition = yearStartPosition + DatePickerComponent.YEAR_KEY.length;
/** @type {?} */
const dayString = value.substring(dayStartPosition, dayEndPosition);
/** @type {?} */
const monthString = value.substring(monthStartPosition, monthEndPosition);
/** @type {?} */
const yearString = value.substring(yearStartPosition, yearEndPosition);
if (dayString && monthString && yearString) {
/** @type {?} */
const day = Number(dayString);
/** @type {?} */
const month = Number(monthString) - 1;
/** @type {?} */
const year = Number(yearString);
return new Date(year, month, day);
}
}
return new Date();
}
/**
* @return {?}
*/
open() {
this.isOpen = true;
setTimeout((/**
* @return {?}
*/
() => {
this.backdropRef.nativeElement.addEventListener('click', this.close);
}), 0);
}
/**
* @return {?}
*/
close() {
this.isOpen = false;
}
/**
* @param {?} value
* @return {?}
*/
onInputChange(value) {
this.date = this.buildDate(value);
this.onChange(this.date);
}
/**
* @return {?}
*/
onInputFocus() {
this.onTouched();
}
/**
* @param {?} isDisabled
* @return {?}
*/
setDisabledState(isDisabled) {
this.disabled = isDisabled;
}
/**
* @param {?} value
* @return {?}
*/
writeValue(value) {
this.date = value;
this.inputValue = this.formatDate(value);
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @param {?} value
* @return {?}
*/
onChange(value) {
}
/**
* @return {?}
*/
onTouched() { }
}
DatePickerComponent.DAY_KEY = 'dd';
DatePickerComponent.MONTH_KEY = 'mm';
DatePickerComponent.YEAR_KEY = 'yyyy';
DatePickerComponent.defaultProps = {
autocomplete: 'none',
className: '',
date: new Date(),
disabled: false,
displayOtherMonthDays: true,
floatLabel: '',
format: 'dd-mm-yyyy',
fullSize: false,
hasCounter: false,
id: null,
maxLength: 500,
name: '',
placeholder: '',
required: false,
type: INPUT_TYPE.TEXT,
value: ''
};
DatePickerComponent.decorators = [
{ type: Component, args: [{
providers: [{
multi: true,
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => DatePickerComponent))
}],
selector: `${config.components.prefix}-datepicker }`,
template: "<div [ngClass]=\"[prefix + '-datepicker', className]\" [class.full-size]=\"fullSize\">\n <div #backdrop *ngIf=\"isOpen\" [ngClass]=\"prefix + '-datepicker-backdrop'\"></div>\n\n <materialize-input\n [disabled]=\"disabled\"\n [floatLabel]=\"floatLabel\"\n [id]=\"id\"\n [placeholder]=\"placeholder\"\n [required]=\"required\"\n [value]=\"inputValue\"\n\n (onChange)=\"onInputChange($event)\"\n (onFocus)=\"onInputFocus()\"\n >\n <materialize-button (onClick)=\"open()\"\n materializeSuffix\n [className]=\"prefix + '-datepicker-button'\"\n [disabled]=\"disabled\"\n >\n <materialize-icon [className]=\"prefix + '-datepicker-button'\">calendar_today</materialize-icon>\n </materialize-button>\n </materialize-input>\n\n <materialize-calendar *ngIf=\"isOpen\"\n [className]=\"prefix + '-datepicker-calendar'\"\n [date]=\"date\"\n (onSelectDay)=\"onSelectDay($event)\">\n </materialize-calendar>\n</div>\n"
}] }
];
/** @nocollapse */
DatePickerComponent.ctorParameters = () => [];
DatePickerComponent.propDecorators = {
backdropRef: [{ type: ViewChild, args: ['backdrop', { static: false },] }],
className: [{ type: Input }],
disabled: [{ type: Input }],
displayOtherMonthDays: [{ type: Input }],
floatLabel: [{ type: Input }],
format: [{ type: Input }],
fullSize: [{ type: Input }],
id: [{ type: Input }],
name: [{ type: Input }],
placeholder: [{ type: Input }],
required: [{ type: Input }],
inputValue: [{ type: Input }]
};
if (false) {
/** @type {?} */
DatePickerComponent.DAY_KEY;
/** @type {?} */
DatePickerComponent.MONTH_KEY;
/** @type {?} */
DatePickerComponent.YEAR_KEY;
/** @type {?} */
DatePickerComponent.defaultProps;
/** @type {?} */
DatePickerComponent.prototype.backdropRef;
/** @type {?} */
DatePickerComponent.prototype.className;
/** @type {?} */
DatePickerComponent.prototype.disabled;
/** @type {?} */
DatePickerComponent.prototype.displayOtherMonthDays;
/** @type {?} */
DatePickerComponent.prototype.floatLabel;
/** @type {?} */
DatePickerComponent.prototype.format;
/** @type {?} */
DatePickerComponent.prototype.fullSize;
/** @type {?} */
DatePickerComponent.prototype.id;
/** @type {?} */
DatePickerComponent.prototype.name;
/** @type {?} */
DatePickerComponent.prototype.placeholder;
/** @type {?} */
DatePickerComponent.prototype.required;
/** @type {?} */
DatePickerComponent.prototype.inputValue;
/** @type {?} */
DatePickerComponent.prototype.prefix;
/** @type {?} */
DatePickerComponent.prototype.date;
/** @type {?} */
DatePickerComponent.prototype.isOpen;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9tYXRlcmlhbGl6ZS1hbmd1bGFyLyIsInNvdXJjZXMiOlsiYXBwL2NvbXBsZXRlZC1jb21wb25lbnRzL2RhdGVwaWNrZXIvZGF0ZXBpY2tlci5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7Ozs7O0FBUUEsT0FBTyxFQUFFLFNBQVMsRUFBRSxVQUFVLEVBQUUsVUFBVSxFQUFFLEtBQUssRUFBVSxTQUFTLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDNUYsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFHdEMsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBV2xELE1BQU0sT0FBTyxtQkFBbUI7SUEyQzlCO1FBakJTLGNBQVMsR0FBVyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsU0FBUyxDQUFDO1FBQy9ELGFBQVEsR0FBWSxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsUUFBUSxDQUFDO1FBQzlELDBCQUFxQixHQUFZLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxxQkFBcUIsQ0FBQztRQUN4RixlQUFVLEdBQVcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLFVBQVUsQ0FBQztRQUNqRSxXQUFNLEdBQVcsbUJBQW1CLENBQUMsWUFBWSxDQUFDLE1BQU0sQ0FBQztRQUN6RCxhQUFRLEdBQVksbUJBQW1CLENBQUMsWUFBWSxDQUFDLFFBQVEsQ0FBQztRQUM5RCxPQUFFLEdBQWtCLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxFQUFFLENBQUM7UUFDeEQsU0FBSSxHQUFXLG1CQUFtQixDQUFDLFlBQVksQ0FBQyxJQUFJLENBQUM7UUFDckQsZ0JBQVcsR0FBVyxtQkFBbUIsQ0FBQyxZQUFZLENBQUMsV0FBVyxDQUFDO1FBQ25FLGFBQVEsR0FBWSxtQkFBbUIsQ0FB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O3VCQUNMLEtBQUs7b0NBQ0wsS0FBSzt5QkFDTCxLQUFLO3FCQUNMLEtBQUs7dUJBQ0wsS0FBSztpQkFDTCxLQUFLO21CQUNMLEtBQUs7MEJBQ0wsS0FBSzt1QkFDTCxLQUFLO3lCQUNMLEtBQUs7Ozs7SUFuQ04sNEJBQStCOztJQUMvQiw4QkFBaUM7O0lBQ2pDLDZCQUFrQzs7SUFFbEMsaUNBaUJFOztJQUVGLDBDQUFnRTs7SUFFaEUsd0NBQXdFOztJQUN4RSx1Q0FBdUU7O0lBQ3ZFLG9EQUFpRzs7SUFDakcseUNBQTBFOztJQUMxRSxxQ0FBa0U7O0lBQ2xFLHVDQUF1RTs7SUFDdkUsaUNBQWlFOztJQUNqRSxtQ0FBOEQ7O0lBQzlELDBDQUE0RTs7SUFDNUUsdUNBQXVFOztJQUN2RSx5Q0FBcUU7O0lBRXJFLHFDQUF5Qzs7SUFFekMsbUNBQWtCOztJQUNsQixxQ0FBdUIiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgV29ya3lsYWIuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuXG4gKlxuICogVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYW4gTUlULXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmVcbiAqIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUgYXQgaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL3dvcmt5bGFiL21hdGVyaWFsaXplLWFuZ3VsYXIvbWFzdGVyL0xJQ0VOU0VcbiAqL1xuXG5pbXBvcnQgeyBDb21wb25lbnQsIEVsZW1lbnRSZWYsIGZvcndhcmRSZWYsIElucHV0LCBPbkluaXQsIFZpZXdDaGlsZCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE5HX1ZBTFVFX0FDQ0VTU09SIH0gZnJvbSAnQGFuZ3VsYXIvZm9ybXMnO1xuaW1wb3J0IHsgY29uZmlnIH0gZnJvbSAnLi4vLi4vY29uZmlnJztcbmltcG9ydCB7IERhdGVNb2RlbCB9IGZyb20gJy4uL2NhbGVuZGFyL2NhbGVuZGFyLm1vZGVsJztcbmltcG9ydCB7IERhdGVQaWNrZXJNb2RlbCB9IGZyb20gJy4vZGF0ZXBpY2tlci5tb2RlbCc7XG5pbXBvcnQgeyBJTlBVVF9UWVBFIH0gZnJvbSAnLi4vaW5wdXQvaW5wdXQubW9kZWwnO1xuXG5AQ29tcG9uZW50KHtcbiAgcHJvdmlkZXJzOiBbe1xuICAgIG11bHRpOiB0cnVlLFxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxuICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IERhdGVQaWNrZXJDb21wb25lbnQpXG4gIH1dLFxuICBzZWxlY3RvcjogYCR7IGNvbmZpZy5jb21wb25lbnRzLnByZWZpeCB9LWRhdGVwaWNrZXIgfWAsXG4gIHRlbXBsYXRlVXJsOiAnLi9kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJ1xufSlcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQ29tcG9uZW50IGltcGxlbWVudHMgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uSW5pdCB7XG4gIHN0YXRpYyByZWFkb25seSBEQVlfS0VZID0gJ2RkJztcbiAgc3RhdGljIHJlYWRvbmx5IE1PTlRIX0tFWSA9ICdtbSc7XG4gIHN0YXRpYyByZWFkb25seSBZRUFSX0tFWSA9ICd5eXl5JztcblxuICBzdGF0aWMgcmVhZG9ubHkgZGVmYXVsdFByb3BzOiBEYXRlUGlja2VyTW9kZWwgPSB7XG4gICAgYXV0b2NvbXBsZXRlOiAnbm9uZScsXG4gICAgY2xhc3NOYW1lOiAnJyxcbiAgICBkYXRlOiBuZXcgRGF0ZSgpLFxuICAgIGRpc2FibGVkOiBmYWxzZSxcbiAgICBkaXNwbGF5T3RoZXJNb250aERheXM6IHRydWUsXG4gICAgZmxvYXRMYWJlbDogJycsXG4gICAgZm9ybWF0OiAnZGQtbW0teXl5eScsXG4gICAgZnVsbFNpemU6IGZhbHNlLFxuICAgIGhhc0NvdW50ZXI6IGZhbHNlLFxuICAgIGlkOiBudWxsLFxuICAgIG1heExlbmd0aDogNTAwLFxuICAgIG5hbWU6ICcnLFxuICAgIHBsYWNlaG9sZGVyOiAnJyxcbiAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgdHlwZTogSU5QVVRfVFlQRS5URVhULFxuICAgIHZhbHVlOiAnJ1xuICB9O1xuXG4gIEBWaWV3Q2hpbGQoJ2JhY2tkcm9wJywge3N0YXRpYzogZmFsc2V9KSBiYWNrZHJvcFJlZjogRWxlbWVudFJlZjtcblxuICBASW5wdXQoKSBjbGFzc05hbWU6IHN0cmluZyA9IERhdGVQaWNrZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmNsYXNzTmFtZTtcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW4gPSBEYXRlUGlja2VyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5kaXNhYmxlZDtcbiAgQElucHV0KCkgZGlzcGxheU90aGVyTW9udGhEYXlzOiBib29sZWFuID0gRGF0ZVBpY2tlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMuZGlzcGxheU90aGVyTW9udGhEYXlzO1xuICBASW5wdXQoKSBmbG9hdExhYmVsOiBzdHJpbmcgPSBEYXRlUGlja2VyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5mbG9hdExhYmVsO1xuICBASW5wdXQoKSBmb3JtYXQ6IHN0cmluZyA9IERhdGVQaWNrZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLmZvcm1hdDtcbiAgQElucHV0KCkgZnVsbFNpemU6IGJvb2xlYW4gPSBEYXRlUGlja2VyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5mdWxsU2l6ZTtcbiAgQElucHV0KCkgaWQ6IHN0cmluZyB8IG51bGwgPSBEYXRlUGlja2VyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy5pZDtcbiAgQElucHV0KCkgbmFtZTogc3RyaW5nID0gRGF0ZVBpY2tlckNvbXBvbmVudC5kZWZhdWx0UHJvcHMubmFtZTtcbiAgQElucHV0KCkgcGxhY2Vob2xkZXI6IHN0cmluZyA9IERhdGVQaWNrZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLnBsYWNlaG9sZGVyO1xuICBASW5wdXQoKSByZXF1aXJlZDogYm9vbGVhbiA9IERhdGVQaWNrZXJDb21wb25lbnQuZGVmYXVsdFByb3BzLnJlcXVpcmVkO1xuICBASW5wdXQoKSBpbnB1dFZhbHVlOiBzdHJpbmcgPSBEYXRlUGlja2VyQ29tcG9uZW50LmRlZmF1bHRQcm9wcy52YWx1ZTtcblxuICBwdWJsaWMgcHJlZml4ID0gY29uZmlnLmNvbXBvbmVudHMucHJlZml4O1xuXG4gIHB1YmxpYyBkYXRlOiBEYXRlO1xuICBwdWJsaWMgaXNPcGVuOiBib29sZWFuO1xuXG4gIGNvbnN0cnVjdG9yKCkge1xuICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XG5cbiAgICB0aGlzLmNsb3NlID0gdGhpcy5jbG9zZS5iaW5kKHRoaXMpO1xuICB9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgLy8gdGhpcy5kYXRlID0gdGhpcy5idWlsZERhdGUodGhpcy5pbnB1dFZhbHVlKTtcbiAgfVxuXG4gIG9uU2VsZWN0RGF5KHNlbGVjdGVkRGF0ZTogRGF0ZU1vZGVsKSB7XG4gICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcbiAgICB0aGlzLmRhdGUgPSBzZWxlY3RlZERhdGUuZGF0ZTtcbiAgICB0aGlzLmlucHV0VmFsdWUgPSB0aGlzLmZvcm1hdERhdGUoc2VsZWN0ZWREYXRlLmRhdGUpO1xuXG4gICAgdGhpcy5vbkNoYW5nZShzZWxlY3RlZERhdGUuZGF0ZSk7XG4gIH1cblxuICBmb3JtYXREYXRlKGRhdGU6IERhdGUpOiBzdHJpbmcge1xuICAgIGNvbnN0IGRheSA9IGRhdGUuZ2V0RGF0ZSgpO1xuICAgIGNvbnN0IG1vbnRoID0gZGF0ZS5nZXRNb250aCgpICsgMTtcblxuICAgIGNvbnN0IGRheVN0cmluZyA9IGRheSA8IDEwXG4gICAgICA/IGAwJHsgZGF5IH1gXG4gICAgICA6IGRheS50b1N0cmluZygpO1xuXG4gICAgY29uc3QgbW9udGhTdHJpbmcgPSBtb250aCA8IDEwXG4gICAgICA/IGAwJHsgbW9udGggfWBcbiAgICAgIDogbW9udGgudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IHllYXJTdHJpbmcgPSBkYXRlLmdldEZ1bGxZZWFyKCkudG9TdHJpbmcoKTtcblxuICAgIGNvbnN0IGZvcm1hdGVkRGF0ZSA9IHRoaXMuZm9ybWF0XG4gICAgICAucmVwbGFjZSgnZGQnLCBkYXlTdHJpbmcpXG4gICAgICAucmVwbGFjZSgnbW0nLCBtb250aFN0cmluZylcbiAgICAgIC5yZXBsYWNlKCd5eXl5JywgeWVhclN0cmluZyk7XG5cbiAgICByZXR1cm4gZm9ybWF0ZWREYXRlO1xuICB9XG5cbiAgYnVpbGREYXRlKHZhbHVlOiBzdHJpbmcpOiBEYXRlIHtcbiAgICBjb25zdCBkYXlTdGFydFBvc2l0aW9uID0gdGhpcy5mb3JtYXQuaW5kZXhPZihEYXRlUGlja2VyQ29tcG9uZW50LkRBWV9LRVkpO1xuICAgIGNvbnN0IG1vbnRoU3RhcnRQb3NpdGlvbiA9IHRoaXMuZm9ybWF0LmluZGV4T2YoRGF0ZVBpY2tlckNvbXBvbmVudC5NT05USF9LRVkpO1xuICAgIGNvbnN0IHllYXJTdGFydFBvc2l0aW9uID0gdGhpcy5mb3JtYXQuaW5kZXhPZihEYXRlUGlja2VyQ29tcG9uZW50LllFQVJfS0VZKTtcblxuICAgIGlmIChkYXlTdGFydFBvc2l0aW9uID49IDAgJiYgbW9udGhTdGFydFBvc2l0aW9uID49IDAgJiYgeWVhclN0YXJ0UG9zaXRpb24gPj0gMCkge1xuICAgICAgY29uc3QgZGF5RW5kUG9zaXRpb24gPSBkYXlTdGFydFBvc2l0aW9uICsgRGF0ZVBpY2tlckNvbXBvbmVudC5EQVlfS0VZLmxlbmd0aDtcbiAgICAgIGNvbnN0IG1vbnRoRW5kUG9zaXRpb24gPSBtb250aFN0YXJ0UG9zaXRpb24gKyBEYXRlUGlja2VyQ29tcG9uZW50Lk1PTlRIX0tFWS5sZW5ndGg7XG4gICAgICBjb25zdCB5ZWFyRW5kUG9zaXRpb24gPSB5ZWFyU3RhcnRQb3NpdGlvbiArIERhdGVQaWNrZXJDb21wb25lbnQuWUVBUl9LRVkubGVuZ3RoO1xuXG4gICAgICBjb25zdCBkYXlTdHJpbmcgPSB2YWx1ZS5zdWJzdHJpbmcoZGF5U3RhcnRQb3NpdGlvbiwgZGF5RW5kUG9zaXRpb24pO1xuICAgICAgY29uc3QgbW9udGhTdHJpbmcgPSB2YWx1ZS5zdWJzdHJpbmcobW9udGhTdGFydFBvc2l0aW9uLCBtb250aEVuZFBvc2l0aW9uKTtcbiAgICAgIGNvbnN0IHllYXJTdHJpbmcgPSB2YWx1ZS5zdWJzdHJpbmcoeWVhclN0YXJ0UG9zaXRpb24sIHllYXJFbmRQb3NpdGlvbik7XG5cbiAgICAgIGlmIChkYXlTdHJpbmcgJiYgbW9udGhTdHJpbmcgJiYgeWVhclN0cmluZykge1xuICAgICAgICBjb25zdCBkYXkgPSBOdW1iZXIoZGF5U3RyaW5nKTtcbiAgICAgICAgY29uc3QgbW9udGggPSBOdW1iZXIobW9udGhTdHJpbmcpIC0gMTtcbiAgICAgICAgY29uc3QgeWVhciA9IE51bWJlcih5ZWFyU3RyaW5nKTtcblxuICAgICAgICByZXR1cm4gbmV3IERhdGUoeWVhciwgbW9udGgsIGRheSk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG5ldyBEYXRlKCk7XG4gIH1cblxuICBvcGVuKCkge1xuICAgIHRoaXMuaXNPcGVuID0gdHJ1ZTtcblxuICAgIHNldFRpbWVvdXQoKCkgPT4ge1xuICAgICAgdGhpcy5iYWNrZHJvcFJlZi5uYXRpdmVFbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ2NsaWNrJywgdGhpcy5jbG9zZSk7XG4gICAgfSwgMCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xuICB9XG5cbiAgb25JbnB1dENoYW5nZSh2YWx1ZTogc3RyaW5nKSB7XG4gICAgdGhpcy5kYXRlID0gdGhpcy5idWlsZERhdGUodmFsdWUpO1xuXG4gICAgdGhpcy5vbkNoYW5nZSh0aGlzLmRhdGUpO1xuICB9XG5cbiAgb25JbnB1dEZvY3VzKCkge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gIH1cblxuICBzZXREaXNhYmxlZFN0YXRlKGlzRGlzYWJsZWQ6IGJvb2xlYW4pOiB2b2lkIHtcbiAgICB0aGlzLmRpc2FibGVkID0gaXNEaXNhYmxlZDtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IERhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmRhdGUgPSB2YWx1ZTtcblxuICAgIHRoaXMuaW5wdXRWYWx1ZSA9IHRoaXMuZm9ybWF0RGF0ZSh2YWx1ZSk7XG4gIH1cblxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiAodmFsdWU6IERhdGUpID0+IHZvaWQpOiB2b2lkIHtcbiAgICB0aGlzLm9uQ2hhbmdlID0gZm47XG4gIH1cblxuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cblxuICBvbkNoYW5nZSh2YWx1ZTogRGF0ZSk6IHZvaWQge1xuICB9XG5cbiAgb25Ub3VjaGVkKCk6IHZvaWQge31cbn1cbiJdfQ==