UNPKG

ng-devui

Version:

DevUI components based on Angular

420 lines 60.8 kB
import { __decorate, __metadata } from "tslib"; import { CdkOverlayOrigin } from '@angular/cdk/overlay'; import { DOCUMENT } from '@angular/common'; import { ChangeDetectorRef, Component, ComponentRef, ElementRef, EventEmitter, HostListener, Inject, Input, Output, Renderer2, TemplateRef, ViewChild, forwardRef, } from '@angular/core'; import { NG_VALUE_ACCESSOR } from '@angular/forms'; import { I18nService } from 'ng-devui/i18n'; import { DefaultDateConverter, DevConfigService, WithConfig, addClassToOrigin, fadeInOut, formWithDropDown, removeClassFromOrigin, } from 'ng-devui/utils'; import { fromEvent } from 'rxjs'; import { debounceTime, filter, map } from 'rxjs/operators'; import { DatePickerConfigService as DatePickerConfig } from './date-picker.config.service'; import { SelectDateRangeChangeReason } from './date-range-change-event-args.model'; import * as i0 from "@angular/core"; import * as i1 from "./date-picker.config.service"; import * as i2 from "ng-devui/i18n"; import * as i3 from "ng-devui/utils"; import * as i4 from "@angular/forms"; import * as i5 from "@angular/cdk/overlay"; import * as i6 from "./date-range-picker.component"; // tslint:disable-next-line: component-class-suffix export class DateRangePickerDirective { set maxDate(date) { this._maxDate = date; } get maxDate() { if (this.dateRangePicker?.maxDate) { return this.dateRangePicker.maxDate; } else { return this._maxDate; } } set minDate(date) { this._minDate = date; } get minDate() { if (this.dateRangePicker?.minDate) { return this.dateRangePicker.minDate; } else { return this._minDate; } } set selectedRange(range) { if (Array.isArray(range) && range.every((_) => !!_ || _ === null)) { this._selectedRange = range; } } get selectedRange() { return this._selectedRange; } set showTime(showTime) { this._showTime = showTime; } get showTime() { return typeof this._showTime === 'boolean' ? this._showTime : this.dateConfig.timePicker; } set dateConfig(dateConfig) { if (this.checkDateConfig(dateConfig)) { this._dateConfig = dateConfig; } else { this._dateConfig = this.datePickerConfig.dateConfig; } this._dateFormat = this.showTime ? this._dateConfig.format.time : this._dateConfig.format.date; } get dateConfig() { return this._dateConfig; } set dateFormat(dateFormat) { if (dateFormat && this._dateFormat !== dateFormat) { this._dateFormat = dateFormat; } } get dateFormat() { return this._dateFormat || this.datePickerConfig.defaultFormat; } set rangeStart(rangeStart) { if (this.dateRangePicker) { this.dateRangePicker.rangeStart = rangeStart; } } get rangeEnd() { if (this.dateRangePicker) { return this.dateRangePicker.rangeEnd; } } set isOpen(isOpen) { if (this._isOpen !== isOpen) { this._isOpen = isOpen; if (!isOpen && !this.rangeEnd) { this.rangeStart = null; } if (!isOpen) { this.startAnimation = false; removeClassFromOrigin(this.elementRef); this.document.removeEventListener('click', this.onDocumentClick); } else { setTimeout(() => { addClassToOrigin(this.elementRef); this.document.addEventListener('click', this.onDocumentClick); this.startAnimation = true; this.cdr.detectChanges(); }); } } } get isOpen() { return this._isOpen; } constructor(elementRef, renderer, datePickerConfig, i18n, cdr, devConfigService, doc) { this.elementRef = elementRef; this.renderer = renderer; this.datePickerConfig = datePickerConfig; this.i18n = i18n; this.cdr = cdr; this.devConfigService = devConfigService; this.doc = doc; this.hideOnRangeSelected = false; this.splitter = ' - '; this.showAnimation = true; this.selectedRangeChange = new EventEmitter(); this._selectedRange = [null, null]; this._isOpen = false; this.datepickerPosition = 'bottom'; this.valueList = []; this.startAnimation = false; this.onChange = (_) => null; this.onTouched = () => null; this.chooseDate = (range, reason, hide = true) => { if (this.dateRangePicker?.chooseDate) { this.dateRangePicker.chooseDate(range, reason); } else { this._selectedRange = [...range]; this.notifyValueChange({ reason: reason, selectedRange: [...range], }); } if (!this.showTime && this.hideOnRangeSelected && hide) { this.hide(); } }; this.onDocumentClick = ($event) => { let templateWrap; if (this.dateRangePicker?.templateWrap) { templateWrap = this.dateRangePicker.templateWrap; } if (templateWrap && templateWrap.nativeElement.contains($event.target) && !this.hideOnRangeSelected) { this.isOpen = true; } else if (this.elementRef.nativeElement !== $event.target) { this.isOpen = false; } this.cdr.markForCheck(); }; this.clearAll = (reason, hide) => { const currentReason = typeof reason === 'number' ? reason : SelectDateRangeChangeReason.custom; this.chooseDate([null, null], currentReason, hide); }; this._dateConfig = datePickerConfig.dateConfig; this.dateConverter = datePickerConfig.dateConfig.dateConverter || new DefaultDateConverter(); this._minDate = this.minDate ? new Date(this.minDate) : new Date(this.dateConfig.min, 0, 1, 0, 0, 0); this._maxDate = this.maxDate ? new Date(this.maxDate) : new Date(this.dateConfig.max, 11, 31, 23, 59, 59); this.setI18nText(); this.document = this.doc; } onBlur($event) { this.onTouched(); if (!this.validateDate(this.elementRef.nativeElement.value)) { this.resetValue(); } } checkDateConfig(dateConfig) { if (!dateConfig) { return false; } if (typeof dateConfig.timePicker !== 'boolean' || !dateConfig.max || !dateConfig.min || !dateConfig.format) { return false; } return true; } ngOnInit() { this.updateCdkConnectedOverlayOrigin(); this.initInputChanges(); } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouched = fn; } initInputChanges() { this.valueChangeSubscrip = fromEvent(this.elementRef.nativeElement, 'keyup') .pipe(map((e) => e.target.value), filter(() => !this.disabled), debounceTime(300)) .subscribe((value) => { this.transUserInputToDatepicker(value); }); } writeValue(selectedRange) { this._selectedRange = selectedRange; if (selectedRange) { this.writeModelValue(selectedRange); } } setI18nText() { this.i18nLocale = this.i18n.getI18nText().locale; this.i18nSubscription = this.i18n.langChange().subscribe((data) => { this.i18nLocale = data.locale; }); } updateCdkConnectedOverlayOrigin() { if (this.elementRef.nativeElement) { this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(formWithDropDown(this.elementRef) || this.elementRef.nativeElement); } } toggle(clickShow) { if (clickShow === undefined) { this.isOpen = !this.isOpen; } else { this.isOpen = clickShow; } } hide(event) { if (event !== false) { this.isOpen = false; } } writeModelValue(input) { if (Array.isArray(input) && input.every((_) => !!_)) { this.renderer.setProperty(this.elementRef.nativeElement, 'value', this.formatDateRange(input)); } else { this.renderer.setProperty(this.elementRef.nativeElement, 'value', ''); } } formatDateRange(arr) { return arr .map((date, i) => { return date ? this.dateConverter.format(date, this.dateFormat, this.locale || this.i18nLocale) : ['Start', 'End'][i]; }) .join(this.splitter); } onPositionChange(position) { switch (position.connectionPair.overlayY) { case 'top': case 'center': this.datepickerPosition = 'bottom'; break; case 'bottom': this.datepickerPosition = 'top'; break; default: } } notifyValueChange(dateObj) { this.writeValue(dateObj.selectedRange); this.onChange(dateObj.selectedRange); this.onTouched(); this.selectedRangeChange.emit({ reason: dateObj.reason, selectedRange: dateObj.selectedRange, }); if (!this.showTime && this.hideOnRangeSelected) { this.hide(); } } transUserInputToDatepicker(value) { if (!this.showTime && !this.disabled) { const _value = value || this.elementRef.nativeElement.value; if (!_value && !this.selectedRange.every((val) => !!val)) { this.clearAll(undefined, false); return; } if (!_value) { this.clearAll(undefined, false); return; } if (this.validateDate(_value)) { this.chooseDate(this.valueList, undefined, false); } } else { this.resetValue(); } } resetValue() { this.writeValue(this.selectedRange); } validateDate(value) { if (!value) { return true; } this.valueList = value.split(this.splitter); let valueFormat; // 如果拆出来6个,则为日期间分隔符和年月日间分隔符相同的情况,此情况允许 if (this.valueList.length === 6 && this.valueList.every((val) => !!val)) { const curValueList = []; this.valueList.forEach((val, index) => { // 根据下标,前三个组装在一起,后三个组装在一起,不需要考虑分隔符,后面会format if ((index + 1) % 3 === 1) { curValueList.push(val); } else { curValueList[Math.ceil(index / 3) - 1] = curValueList[Math.ceil(index / 3) - 1] + '-' + val; } }); this.valueList = curValueList; } // 不管拆出来是6还是2个,都需要组装成2个日期 if (this.valueList.length === 2 && this.valueList.every((val) => !!val) && this.valueList.every((val, index) => new Date(val).getTime() === new Date(this.selectedRange[index]).getTime())) { this.valueList = this.valueList.map((t) => new Date(t)); return true; } if (!this.valueList.every((val) => new Date(val).getTime())) { return false; } if (this.valueList.length === 2 && this.valueList.every((val) => !!val)) { const valueTimeList = this.valueList.map((val) => new Date(`${val} 00:00:00`).getTime()); valueFormat = this.formatDateRange(this.valueList.map((numValue) => new Date(numValue))); if (value === valueFormat && !valueTimeList.every((val) => { return val >= this.minDate.getTime() && val <= this.maxDate.getTime(); })) { return false; } else { // 判断前后俩日期是否大于最小,小于最大,若是则合法,进行如下操作 // 此时包括value为NaN既日期格式不正确的情况,对其进行处理下方判断会过滤掉 this.valueList = this.valueList .map((val) => new Date(val).getTime()) .sort((a, b) => a - b) .map((numValue) => new Date(numValue)); } if (valueFormat && value === valueFormat) { return true; } return false; } else { return false; } } ngOnDestroy() { this.hide(); if (this.i18nSubscription) { this.i18nSubscription.unsubscribe(); } if (this.valueChangeSubscrip) { this.valueChangeSubscrip.unsubscribe(); } this.document.removeEventListener('click', this.onDocumentClick); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerDirective, deps: [{ token: i0.ElementRef }, { token: i0.Renderer2 }, { token: i1.DatePickerConfigService }, { token: i2.I18nService }, { token: i0.ChangeDetectorRef }, { token: i3.DevConfigService }, { token: DOCUMENT }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: DateRangePickerDirective, selector: "[dDateRangePicker]", inputs: { locale: "locale", cssClass: "cssClass", disabled: "disabled", dateConverter: "dateConverter", hideOnRangeSelected: "hideOnRangeSelected", customViewTemplate: "customViewTemplate", splitter: "splitter", showAnimation: "showAnimation", maxDate: "maxDate", minDate: "minDate", selectedRange: "selectedRange", showTime: "showTime", dateConfig: "dateConfig", dateFormat: "dateFormat" }, outputs: { selectedRangeChange: "selectedRangeChange" }, host: { listeners: { "blur": "onBlur($event)" } }, providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateRangePickerDirective), multi: true, }, ], viewQueries: [{ propertyName: "dateRangePicker", first: true, predicate: ["dateRangePicker"], descendants: true }], exportAs: ["dateRangePicker"], ngImport: i0, template: "<ng-template\n cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (backdropClick)=\"isOpen=false\"\n (positionChange)=\"onPositionChange($event)\"\n>\n <div [@fadeInOut]=\"startAnimation ? datepickerPosition : 'void'\" [@.disabled]=\"!showAnimation\" class=\"devui-date-range-wrapper\">\n <d-date-range-picker\n #dateRangePicker\n [locale]=\"locale\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n [customViewTemplate]=\"customViewTemplate\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [dateFormat]=\"dateFormat\"\n [showTime]=\"showTime\"\n [selectedRange]=\"selectedRange\"\n (selectedRangeChange)=\"notifyValueChange($event)\"\n (hide)=\"hide($event)\"\n [(ngModel)]=\"_selectedRange\"\n ></d-date-range-picker>\n </div>\n</ng-template>\n", styles: [".devui-date-range-wrapper{display:inline-flex!important;box-shadow:var(--devui-shadow-length-connected-overlay, 0 4px 12px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background-color:var(--devui-connected-overlay-bg, #ffffff);transform:perspective(1px) translateZ(0);flex-direction:column;border-radius:var(--devui-border-radius, 2px);margin:4px 0;-webkit-user-select:none;user-select:none}.devui-date-range-custom{width:500px;border-top:1px solid var(--devui-line, #dbdbdb)}.devui-date-picker:not(:last-child){margin-right:20px}\n"], dependencies: [{ 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: "directive", type: i5.CdkConnectedOverlay, selector: "[cdk-connected-overlay], [connected-overlay], [cdkConnectedOverlay]", inputs: ["cdkConnectedOverlayOrigin", "cdkConnectedOverlayPositions", "cdkConnectedOverlayPositionStrategy", "cdkConnectedOverlayOffsetX", "cdkConnectedOverlayOffsetY", "cdkConnectedOverlayWidth", "cdkConnectedOverlayHeight", "cdkConnectedOverlayMinWidth", "cdkConnectedOverlayMinHeight", "cdkConnectedOverlayBackdropClass", "cdkConnectedOverlayPanelClass", "cdkConnectedOverlayViewportMargin", "cdkConnectedOverlayScrollStrategy", "cdkConnectedOverlayOpen", "cdkConnectedOverlayDisableClose", "cdkConnectedOverlayTransformOriginOn", "cdkConnectedOverlayHasBackdrop", "cdkConnectedOverlayLockPosition", "cdkConnectedOverlayFlexibleDimensions", "cdkConnectedOverlayGrowAfterOpen", "cdkConnectedOverlayPush", "cdkConnectedOverlayDisposeOnNavigation"], outputs: ["backdropClick", "positionChange", "attach", "detach", "overlayKeydown", "overlayOutsideClick"], exportAs: ["cdkConnectedOverlay"] }, { kind: "component", type: i6.DateRangePickerComponent, selector: "d-date-range-picker", inputs: ["locale", "cssClass", "disabled", "dateConverter", "selectedRange", "dateFormat", "customViewTemplate", "showTime", "dateConfig", "maxDate", "minDate"], outputs: ["selectedRangeChange", "hide"], exportAs: ["dateRangePicker"] }], animations: [fadeInOut] }); } } __decorate([ WithConfig(), __metadata("design:type", Object) ], DateRangePickerDirective.prototype, "showAnimation", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: DateRangePickerDirective, decorators: [{ type: Component, args: [{ selector: '[dDateRangePicker]', providers: [ { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => DateRangePickerDirective), multi: true, }, ], exportAs: 'dateRangePicker', animations: [fadeInOut], preserveWhitespaces: false, template: "<ng-template\n cdk-connected-overlay\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\n [cdkConnectedOverlayOpen]=\"isOpen\"\n (backdropClick)=\"isOpen=false\"\n (positionChange)=\"onPositionChange($event)\"\n>\n <div [@fadeInOut]=\"startAnimation ? datepickerPosition : 'void'\" [@.disabled]=\"!showAnimation\" class=\"devui-date-range-wrapper\">\n <d-date-range-picker\n #dateRangePicker\n [locale]=\"locale\"\n [cssClass]=\"cssClass\"\n [disabled]=\"disabled\"\n [dateConverter]=\"dateConverter\"\n [customViewTemplate]=\"customViewTemplate\"\n [minDate]=\"minDate\"\n [maxDate]=\"maxDate\"\n [dateFormat]=\"dateFormat\"\n [showTime]=\"showTime\"\n [selectedRange]=\"selectedRange\"\n (selectedRangeChange)=\"notifyValueChange($event)\"\n (hide)=\"hide($event)\"\n [(ngModel)]=\"_selectedRange\"\n ></d-date-range-picker>\n </div>\n</ng-template>\n", styles: [".devui-date-range-wrapper{display:inline-flex!important;box-shadow:var(--devui-shadow-length-connected-overlay, 0 4px 12px 0) var(--devui-shadow, rgba(0, 0, 0, .16));background-color:var(--devui-connected-overlay-bg, #ffffff);transform:perspective(1px) translateZ(0);flex-direction:column;border-radius:var(--devui-border-radius, 2px);margin:4px 0;-webkit-user-select:none;user-select:none}.devui-date-range-custom{width:500px;border-top:1px solid var(--devui-line, #dbdbdb)}.devui-date-picker:not(:last-child){margin-right:20px}\n"] }] }], ctorParameters: () => [{ type: i0.ElementRef }, { type: i0.Renderer2 }, { type: i1.DatePickerConfigService }, { type: i2.I18nService }, { type: i0.ChangeDetectorRef }, { type: i3.DevConfigService }, { type: undefined, decorators: [{ type: Inject, args: [DOCUMENT] }] }], propDecorators: { locale: [{ type: Input }], cssClass: [{ type: Input }], disabled: [{ type: Input }], dateConverter: [{ type: Input }], hideOnRangeSelected: [{ type: Input }], customViewTemplate: [{ type: Input }], splitter: [{ type: Input }], showAnimation: [{ type: Input }], selectedRangeChange: [{ type: Output }], dateRangePicker: [{ type: ViewChild, args: ['dateRangePicker'] }], maxDate: [{ type: Input }], minDate: [{ type: Input }], selectedRange: [{ type: Input }], showTime: [{ type: Input }], dateConfig: [{ type: Input }], dateFormat: [{ type: Input }], onBlur: [{ type: HostListener, args: ['blur', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZS1yYW5nZS1waWNrZXIuZGlyZWN0aXZlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vZGV2dWkvZGF0ZXBpY2tlci9kYXRlLXJhbmdlLXBpY2tlci5kaXJlY3RpdmUudHMiLCIuLi8uLi8uLi9kZXZ1aS9kYXRlcGlja2VyL2RhdGUtcmFuZ2UtcGlja2VyLmRpcmVjdGl2ZS5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7QUFBQSxPQUFPLEVBQUUsZ0JBQWdCLEVBQXlELE1BQU0sc0JBQXNCLENBQUM7QUFDL0csT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzNDLE9BQU8sRUFDTCxpQkFBaUIsRUFDakIsU0FBUyxFQUNULFlBQVksRUFDWixVQUFVLEVBQ1YsWUFBWSxFQUNaLFlBQVksRUFDWixNQUFNLEVBQ04sS0FBSyxFQUdMLE1BQU0sRUFDTixTQUFTLEVBQ1QsV0FBVyxFQUNYLFNBQVMsRUFDVCxVQUFVLEdBQ1gsTUFBTSxlQUFlLENBQUM7QUFDdkIsT0FBTyxFQUF3QixpQkFBaUIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ3pFLE9BQU8sRUFBaUIsV0FBVyxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQzNELE9BQU8sRUFFTCxvQkFBb0IsRUFDcEIsZ0JBQWdCLEVBQ2hCLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULGdCQUFnQixFQUNoQixxQkFBcUIsR0FDdEIsTUFBTSxnQkFBZ0IsQ0FBQztBQUN4QixPQUFPLEVBQWdCLFNBQVMsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUMvQyxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0sRUFBRSxHQUFHLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUMzRCxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQWtDLDJCQUEyQixFQUFFLE1BQU0sc0NBQXNDLENBQUM7Ozs7Ozs7O0FB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S0FBSztnQkFDRyxtQkFBbUI7c0JBQTNCLEtBQUs7Z0JBQ0csa0JBQWtCO3NCQUExQixLQUFLO2dCQUNHLFFBQVE7c0JBQWhCLEtBQUs7Z0JBQ2lCLGFBQWE7c0JBQW5DLEtBQUs7Z0JBQ0ksbUJBQW1CO3NCQUE1QixNQUFNO2dCQUN1QixlQUFlO3NCQUE1QyxTQUFTO3VCQUFDLGlCQUFpQjtnQkFtQmYsT0FBTztzQkFBbkIsS0FBSztnQkFZTyxPQUFPO3NCQUFuQixLQUFLO2dCQVlPLGFBQWE7c0JBQXpCLEtBQUs7Z0JBVU8sUUFBUTtzQkFBcEIsS0FBSztnQkFRTyxVQUFVO3NCQUF0QixLQUFLO2dCQWFPLFVBQVU7c0JBQXRCLEtBQUs7Z0JBZ0VOLE1BQU07c0JBREwsWUFBWTt1QkFBQyxNQUFNLEVBQUUsQ0FBQyxRQUFRLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDZGtPdmVybGF5T3JpZ2luLCBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsIFZlcnRpY2FsQ29ubmVjdGlvblBvcyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuaW1wb3J0IHsgRE9DVU1FTlQgfSBmcm9tICdAYW5ndWxhci9jb21tb24nO1xyXG5pbXBvcnQge1xyXG4gIENoYW5nZURldGVjdG9yUmVmLFxyXG4gIENvbXBvbmVudCxcclxuICBDb21wb25lbnRSZWYsXHJcbiAgRWxlbWVudFJlZixcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIEluamVjdCxcclxuICBJbnB1dCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgT25Jbml0LFxyXG4gIE91dHB1dCxcclxuICBSZW5kZXJlcjIsXHJcbiAgVGVtcGxhdGVSZWYsXHJcbiAgVmlld0NoaWxkLFxyXG4gIGZvcndhcmRSZWYsXHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcclxuaW1wb3J0IHsgSTE4bkludGVyZmFjZSwgSTE4blNlcnZpY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHtcclxuICBEYXRlQ29udmVydGVyLFxyXG4gIERlZmF1bHREYXRlQ29udmVydGVyLFxyXG4gIERldkNvbmZpZ1NlcnZpY2UsXHJcbiAgV2l0aENvbmZpZyxcclxuICBhZGRDbGFzc1RvT3JpZ2luLFxyXG4gIGZhZGVJbk91dCxcclxuICBmb3JtV2l0aERyb3BEb3duLFxyXG4gIHJlbW92ZUNsYXNzRnJvbU9yaWdpbixcclxufSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IFN1YnNjcmlwdGlvbiwgZnJvbUV2ZW50IH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRlYm91bmNlVGltZSwgZmlsdGVyLCBtYXAgfSBmcm9tICdyeGpzL29wZXJhdG9ycyc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJDb25maWdTZXJ2aWNlIGFzIERhdGVQaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgU2VsZWN0RGF0ZVJhbmdlQ2hhbmdlRXZlbnRBcmdzLCBTZWxlY3REYXRlUmFuZ2VDaGFuZ2VSZWFzb24gfSBmcm9tICcuL2RhdGUtcmFuZ2UtY2hhbmdlLWV2ZW50LWFyZ3MubW9kZWwnO1xyXG5pbXBvcnQgeyBEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQgfSBmcm9tICcuL2RhdGUtcmFuZ2UtcGlja2VyLmNvbXBvbmVudCc7XHJcblxyXG5AQ29tcG9uZW50KHtcclxuICAvKiBlc2xpbnQtZGlzYWJsZS1uZXh0LWxpbmUgQGFuZ3VsYXItZXNsaW50L2NvbXBvbmVudC1zZWxlY3RvciovXHJcbiAgc2VsZWN0b3I6ICdbZERhdGVSYW5nZVBpY2tlcl0nLFxyXG4gIHByb3ZpZGVyczogW1xyXG4gICAge1xyXG4gICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXHJcbiAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBEYXRlUmFuZ2VQaWNrZXJEaXJlY3RpdmUpLFxyXG4gICAgICBtdWx0aTogdHJ1ZSxcclxuICAgIH0sXHJcbiAgXSxcclxuICBleHBvcnRBczogJ2RhdGVSYW5nZVBpY2tlcicsXHJcbiAgdGVtcGxhdGVVcmw6ICcuL2RhdGUtcmFuZ2UtcGlja2VyLmRpcmVjdGl2ZS5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi9kYXRlLXJhbmdlLXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtmYWRlSW5PdXRdLFxyXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxyXG59KVxyXG4vLyB0c2xpbnQ6ZGlzYWJsZS1uZXh0LWxpbmU6IGNvbXBvbmVudC1jbGFzcy1zdWZmaXhcclxuZXhwb3J0IGNsYXNzIERhdGVSYW5nZVBpY2tlckRpcmVjdGl2ZSBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgbG9jYWxlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkYXRlQ29udmVydGVyOiBEYXRlQ29udmVydGVyO1xyXG4gIEBJbnB1dCgpIGhpZGVPblJhbmdlU2VsZWN0ZWQgPSBmYWxzZTtcclxuICBASW5wdXQoKSBjdXN0b21WaWV3VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQElucHV0KCkgc3BsaXR0ZXIgPSAnICAtICAnO1xyXG4gIEBJbnB1dCgpIEBXaXRoQ29uZmlnKCkgc2hvd0FuaW1hdGlvbiA9IHRydWU7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkUmFuZ2VDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPFNlbGVjdERhdGVSYW5nZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBAVmlld0NoaWxkKCdkYXRlUmFuZ2VQaWNrZXInKSBkYXRlUmFuZ2VQaWNrZXI6IENvbXBvbmVudFJlZjxEYXRlUmFuZ2VQaWNrZXJDb21wb25lbnQ+O1xyXG4gIHByaXZhdGUgX21heERhdGU6IERhdGU7XHJcbiAgcHJpdmF0ZSBfbWluRGF0ZTogRGF0ZTtcclxuICBfc2VsZWN0ZWRSYW5nZSA9IFtudWxsLCBudWxsXTtcclxuICBwcml2YXRlIF9pc09wZW4gPSBmYWxzZTtcclxuICBwcml2YXRlIF9kYXRlQ29uZmlnOiBhbnk7XHJcbiAgcHJpdmF0ZSBfZGF0ZUZvcm1hdDogc3RyaW5nO1xyXG4gIHByaXZhdGUgX3Nob3dUaW1lOiBib29sZWFuO1xyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBhbnk7XHJcbiAgcHVibGljIGkxOG5Mb2NhbGU6IEkxOG5JbnRlcmZhY2VbJ2xvY2FsZSddO1xyXG4gIHByaXZhdGUgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgdmFsdWVDaGFuZ2VTdWJzY3JpcDogU3Vic2NyaXB0aW9uO1xyXG4gIGRhdGVwaWNrZXJQb3NpdGlvbjogVmVydGljYWxDb25uZWN0aW9uUG9zID0gJ2JvdHRvbSc7XHJcbiAgdmFsdWVMaXN0ID0gW107XHJcbiAgc3RhcnRBbmltYXRpb24gPSBmYWxzZTtcclxuICBkb2N1bWVudDogRG9jdW1lbnQ7XHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IG51bGw7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiBudWxsO1xyXG5cclxuICBASW5wdXQoKSBzZXQgbWF4RGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gZGF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBtYXhEYXRlKCkge1xyXG4gICAgaWYgKCh0aGlzLmRhdGVSYW5nZVBpY2tlciBhcyBhbnkpPy5tYXhEYXRlKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5kYXRlUmFuZ2VQaWNrZXIgYXMgYW55KS5tYXhEYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWluRGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICB0aGlzLl9taW5EYXRlID0gZGF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBtaW5EYXRlKCkge1xyXG4gICAgaWYgKCh0aGlzLmRhdGVSYW5nZVBpY2tlciBhcyBhbnkpPy5taW5EYXRlKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5kYXRlUmFuZ2VQaWNrZXIgYXMgYW55KS5taW5EYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgc2VsZWN0ZWRSYW5nZShyYW5nZTogQXJyYXk8RGF0ZSB8IG51bGw+KSB7XHJcbiAgICBpZiAoQXJyYXkuaXNBcnJheShyYW5nZSkgJiYgcmFuZ2UuZXZlcnkoKF8pID0+ICEhXyB8fCBfID09PSBudWxsKSkge1xyXG4gICAgICB0aGlzLl9zZWxlY3RlZFJhbmdlID0gcmFuZ2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgc2VsZWN0ZWRSYW5nZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9zZWxlY3RlZFJhbmdlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IHNob3dUaW1lKHNob3dUaW1lOiBib29sZWFuKSB7XHJcbiAgICB0aGlzLl9zaG93VGltZSA9IHNob3dUaW1lO1xyXG4gIH1cclxuXHJcbiAgZ2V0IHNob3dUaW1lKCkge1xyXG4gICAgcmV0dXJuIHR5cGVvZiB0aGlzLl9zaG93VGltZSA9PT0gJ2Jvb2xlYW4nID8gdGhpcy5fc2hvd1RpbWUgOiB0aGlzLmRhdGVDb25maWcudGltZVBpY2tlcjtcclxuICB9XHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRlQ29uZmlnKGRhdGVDb25maWc6IGFueSkge1xyXG4gICAgaWYgKHRoaXMuY2hlY2tEYXRlQ29uZmlnKGRhdGVDb25maWcpKSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlQ29uZmlnO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kYXRlQ29uZmlnO1xyXG4gICAgfVxyXG4gICAgdGhpcy5fZGF0ZUZvcm1hdCA9IHRoaXMuc2hvd1RpbWUgPyB0aGlzLl9kYXRlQ29uZmlnLmZvcm1hdC50aW1lIDogdGhpcy5fZGF0ZUNvbmZpZy5mb3JtYXQuZGF0ZTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRlQ29uZmlnKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGVDb25maWc7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUZvcm1hdChkYXRlRm9ybWF0OiBzdHJpbmcpIHtcclxuICAgIGlmIChkYXRlRm9ybWF0ICYmIHRoaXMuX2RhdGVGb3JtYXQgIT09IGRhdGVGb3JtYXQpIHtcclxuICAgICAgdGhpcy5fZGF0ZUZvcm1hdCA9IGRhdGVGb3JtYXQ7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUZvcm1hdCgpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlRm9ybWF0IHx8IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kZWZhdWx0Rm9ybWF0O1xyXG4gIH1cclxuXHJcbiAgc2V0IHJhbmdlU3RhcnQocmFuZ2VTdGFydDogRGF0ZSkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlUGlja2VyKSB7XHJcbiAgICAgICh0aGlzLmRhdGVSYW5nZVBpY2tlciBhcyBhbnkpLnJhbmdlU3RhcnQgPSByYW5nZVN0YXJ0O1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IHJhbmdlRW5kKCkge1xyXG4gICAgaWYgKHRoaXMuZGF0ZVJhbmdlUGlja2VyKSB7XHJcbiAgICAgIHJldHVybiAodGhpcy5kYXRlUmFuZ2VQaWNrZXIgYXMgYW55KS5yYW5nZUVuZDtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIHNldCBpc09wZW4oaXNPcGVuOiBib29sZWFuKSB7XHJcbiAgICBpZiAodGhpcy5faXNPcGVuICE9PSBpc09wZW4pIHtcclxuICAgICAgdGhpcy5faXNPcGVuID0gaXNPcGVuO1xyXG4gICAgICBpZiAoIWlzT3BlbiAmJiAhdGhpcy5yYW5nZUVuZCkge1xyXG4gICAgICAgIHRoaXMucmFuZ2VTdGFydCA9IG51bGw7XHJcbiAgICAgIH1cclxuICAgICAgaWYgKCFpc09wZW4pIHtcclxuICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uID0gZmFsc2U7XHJcbiAgICAgICAgcmVtb3ZlQ2xhc3NGcm9tT3JpZ2luKHRoaXMuZWxlbWVudFJlZik7XHJcbiAgICAgICAgdGhpcy5kb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCdjbGljaycsIHRoaXMub25Eb2N1bWVudENsaWNrKTtcclxuICAgICAgfSBlbHNlIHtcclxuICAgICAgICBzZXRUaW1lb3V0KCgpID0+IHtcclxuICAgICAgICAgIGFkZENsYXNzVG9PcmlnaW4odGhpcy5lbGVtZW50UmVmKTtcclxuICAgICAgICAgIHRoaXMuZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcignY2xpY2snLCB0aGlzLm9uRG9jdW1lbnRDbGljayk7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0QW5pbWF0aW9uID0gdHJ1ZTtcclxuICAgICAgICAgIHRoaXMuY2RyLmRldGVjdENoYW5nZXMoKTtcclxuICAgICAgICB9KTtcclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgZ2V0IGlzT3BlbigpIHtcclxuICAgIHJldHVybiB0aGlzLl9pc09wZW47XHJcbiAgfVxyXG4gIGNvbnN0cnVjdG9yKFxyXG4gICAgcHJpdmF0ZSBlbGVtZW50UmVmOiBFbGVtZW50UmVmLFxyXG4gICAgcHJpdmF0ZSByZW5kZXJlcjogUmVuZGVyZXIyLFxyXG4gICAgcHJpdmF0ZSBkYXRlUGlja2VyQ29uZmlnOiBEYXRlUGlja2VyQ29uZmlnLFxyXG4gICAgcHJpdmF0ZSBpMThuOiBJMThuU2VydmljZSxcclxuICAgIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZixcclxuICAgIHByaXZhdGUgZGV2Q29uZmlnU2VydmljZTogRGV2Q29uZmlnU2VydmljZSxcclxuICAgIEBJbmplY3QoRE9DVU1FTlQpIHByaXZhdGUgZG9jOiBhbnlcclxuICApIHtcclxuICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWc7XHJcbiAgICB0aGlzLmRhdGVDb252ZXJ0ZXIgPSBkYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWcuZGF0ZUNvbnZlcnRlciB8fCBuZXcgRGVmYXVsdERhdGVDb252ZXJ0ZXIoKTtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLm1pbkRhdGUgPyBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1pbiwgMCwgMSwgMCwgMCwgMCk7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5tYXhEYXRlID8gbmV3IERhdGUodGhpcy5tYXhEYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5tYXgsIDExLCAzMSwgMjMsIDU5LCA1OSk7XHJcbiAgICB0aGlzLnNldEkxOG5UZXh0KCk7XHJcbiAgICB0aGlzLmRvY3VtZW50ID0gdGhpcy5kb2M7XHJcbiAgfVxyXG5cclxuICBASG9zdExpc3RlbmVyKCdibHVyJywgWyckZXZlbnQnXSlcclxuICBvbkJsdXIoJGV2ZW50KSB7XHJcbiAgICB0aGlzLm9uVG91Y2hlZCgpO1xyXG4gICAgaWYgKCF0aGlzLnZhbGlkYXRlRGF0ZSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudC52YWx1ZSkpIHtcclxuICAgICAgdGhpcy5yZXNldFZhbHVlKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBjaGVja0RhdGVDb25maWcoZGF0ZUNvbmZpZzogYW55KSB7XHJcbiAgICBpZiAoIWRhdGVDb25maWcpIHtcclxuICAgICAgcmV0dXJuIGZhbHNlO1xyXG4gICAgfVxyXG4gICAgaWYgKHR5cGVvZiBkYXRlQ29uZmlnLnRpbWVQaWNrZXIgIT09ICdib29sZWFuJyB8fCAhZGF0ZUNvbmZpZy5tYXggfHwgIWRhdGVDb25maWcubWluIHx8ICFkYXRlQ29uZmlnLmZvcm1hdCkge1xyXG4gICAgICByZXR1cm4gZmFsc2U7XHJcbiAgICB9XHJcbiAgICByZXR1cm4gdHJ1ZTtcclxuICB9XHJcblxyXG4gIG5nT25Jbml0KCkge1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk7XHJcbiAgICB0aGlzLmluaXRJbnB1dENoYW5nZXMoKTtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xyXG4gIH1cclxuXHJcbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IGFueSk6IHZvaWQge1xyXG4gICAgdGhpcy5vblRvdWNoZWQgPSBmbjtcclxuICB9XHJcblxyXG4gIGluaXRJbnB1dENoYW5nZXMoKTogdm9pZCB7XHJcbiAgICB0aGlzLnZhbHVlQ2hhbmdlU3Vic2NyaXAgPSBmcm9tRXZlbnQodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQsICdrZXl1cCcpXHJcbiAgICAgIC5waXBlKFxyXG4gICAgICBtYXAoKGU6IGFueSkgPT4gZS50YXJnZXQudmFsdWUpLFxyXG4gICAgICBmaWx0ZXIoKCkgPT4gIXRoaXMuZGlzYWJsZWQpLFxyXG4gICAgICBkZWJvdW5jZVRpbWUoMzAwKVxyXG4gICAgICApXHJcbiAgICAgIC5zdWJzY3JpYmUoKHZhbHVlKSA9PiB7XHJcbiAgICAgIHRoaXMudHJhbnNVc2VySW5wdXRUb0RhdGVwaWNrZXIodmFsdWUpO1xyXG4gICAgfSk7XHJcb