@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
686 lines • 53.4 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: two-datepicker/two-datepicker.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import * as tslib_1 from "tslib";
import { Component, ElementRef, ViewChild, Input, HostListener, Output, EventEmitter } from '@angular/core';
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { cornerFadeInOut } from '@duoduo-oba/ng-devui/utils';
import { Subject } from 'rxjs';
import { distinctUntilChanged } from 'rxjs/operators';
import { DatePickerConfigService as DatePickerConfig } from '../date-picker.config.service';
import { I18nService } from '@duoduo-oba/ng-devui/i18n';
import { DefaultDateConverter } from '@duoduo-oba/ng-devui/utils';
var TwoDatePickerComponent = /** @class */ (function () {
function TwoDatePickerComponent(el, datePickerConfig, i18n) {
var _this = this;
this.el = el;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.showTime = false;
this.selectedRange = [null, null];
this.hideOnRangeSelected = true;
this.selectRange = new EventEmitter();
this.datePosition = 'bottom';
this.selectDateSubject = new Subject();
this.hoverOnDate = new Subject();
this.switchOpenSub = new Subject();
this.today = new Date();
this.datepickerPosition = 'bottom';
this.currentCalendars = [null, null];
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
this.onChange = (/**
* @param {?} _
* @return {?}
*/
function (_) { return null; });
this.chooseDate = (/**
* @param {?} range
* @return {?}
*/
function (range) {
var _a;
if (range) {
_this.selectedRange = range;
if (Array.isArray(_this.selectedRange)) {
_a = tslib_1.__read(_this.selectedRange, 2), _this.rangeStart = _a[0], _this.rangeEnd = _a[1];
}
}
_this.notifyValueChange(range);
});
this.clear = (/**
* @param {?} side
* @return {?}
*/
function (side) {
var _a;
if (side === 'start') {
_this.selectStart(null);
}
else if (side === 'end') {
_this.selectEnd(null);
}
_a = tslib_1.__read(_this.selectedRange, 2), _this.rangeStart = _a[0], _this.rangeEnd = _a[1];
});
this._dateConfig = datePickerConfig['dateConfig'];
this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter();
}
Object.defineProperty(TwoDatePickerComponent.prototype, "dateConfig", {
get: /**
* @return {?}
*/
function () {
return this._dateConfig;
},
set: /**
* @param {?} dateConfig
* @return {?}
*/
function (dateConfig) {
if (dateConfig) {
this._dateConfig = dateConfig;
this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TwoDatePickerComponent.prototype, "dateFormat", {
get: /**
* @return {?}
*/
function () {
return this._dateFormat;
},
set: /**
* @param {?} dateFormat
* @return {?}
*/
function (dateFormat) {
if (this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TwoDatePickerComponent.prototype, "maxDate", {
get: /**
* @return {?}
*/
function () {
return this._maxDate;
},
set: /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var parseDate = this.convertDate(date);
if (parseDate) {
this._maxDate = parseDate;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TwoDatePickerComponent.prototype, "minDate", {
get: /**
* @return {?}
*/
function () {
return this._minDate;
},
set: /**
* @param {?} date
* @return {?}
*/
function (date) {
/** @type {?} */
var parseDate = this.convertDate(date);
if (parseDate) {
this._minDate = parseDate;
}
},
enumerable: true,
configurable: true
});
Object.defineProperty(TwoDatePickerComponent.prototype, "whichOpen", {
get: /**
* @return {?}
*/
function () {
return this._whichOpen;
},
set: /**
* @param {?} side
* @return {?}
*/
function (side) {
this._whichOpen = side;
this.switchOpenSub.next(side);
},
enumerable: true,
configurable: true
});
/**
* @param {?} $event
* @return {?}
*/
TwoDatePickerComponent.prototype.onDocumentClick = /**
* @param {?} $event
* @return {?}
*/
function ($event) {
if (this.el.nativeElement !== $event.target) {
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
this.whichOpen = false;
}
};
/**
* @return {?}
*/
TwoDatePickerComponent.prototype.ngOnInit = /**
* @return {?}
*/
function () {
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.updateCdkConnectedOverlayOrigin(this.el.nativeElement);
this.subscribeHoverActions();
};
/**
* @return {?}
*/
TwoDatePickerComponent.prototype.isDisableToday = /**
* @return {?}
*/
function () {
if ((this.minDate.getTime() >= (this.today).getTime()) || (this.maxDate.getTime() <= (this.today).getTime())) {
this.disableToday = true;
}
else {
this.disableToday = false;
}
};
/**
* @param {?} event
* @param {?} side
* @return {?}
*/
TwoDatePickerComponent.prototype.toggle = /**
* @param {?} event
* @param {?} side
* @return {?}
*/
function (event, side) {
event.stopPropagation();
if (this.isOpen) {
if (side === 'start') {
if (this.startOpen) {
this.startOpen = false;
this.isOpen = false;
this.whichOpen = false;
}
else if (this.endOpen) {
this.startOpen = true;
this.whichOpen = 'start';
}
this.endOpen = false;
}
else if (side === 'end') {
if (this.startOpen) {
this.endOpen = true;
this.whichOpen = 'end';
}
else if (this.endOpen) {
this.endOpen = false;
this.isOpen = false;
this.whichOpen = false;
}
this.startOpen = false;
}
}
else {
this.startOpen = side === 'start' ? true : false;
this.endOpen = side === 'end' ? true : false;
this.isOpen = true;
this.whichOpen = side;
}
};
/**
* @param {?} position
* @return {?}
*/
TwoDatePickerComponent.prototype.onPositionChange = /**
* @param {?} position
* @return {?}
*/
function (position) {
switch (position.connectionPair.overlayY) {
case 'top':
case 'center':
this.datePosition = 'bottom';
break;
case 'bottom':
this.datePosition = 'top';
}
};
/**
* @param {?} date
* @return {?}
*/
TwoDatePickerComponent.prototype.convertDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
return date ?
this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale) : null;
};
/**
* @param {?} date
* @return {?}
*/
TwoDatePickerComponent.prototype.formatDate = /**
* @param {?} date
* @return {?}
*/
function (date) {
return date ?
this.dateConverter.format(date, this.dateFormat, this.locale || this.i18nLocale) : null;
};
/**
* @param {?} el
* @return {?}
*/
TwoDatePickerComponent.prototype.updateCdkConnectedOverlayOrigin = /**
* @param {?} el
* @return {?}
*/
function (el) {
if (el) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(el);
}
else {
this.cdkConnectedOverlayOrigin = undefined;
}
};
/**
* @param {?} currentCalender
* @param {?} orientation
* @return {?}
*/
TwoDatePickerComponent.prototype.syncPickerPair = /**
* @param {?} currentCalender
* @param {?} orientation
* @return {?}
*/
function (currentCalender, orientation) {
switch (orientation) {
case 'left':
this.currentCalendars[0] = currentCalender;
break;
case 'right':
this.currentCalendars[1] = currentCalender;
break;
}
};
/**
* @param {?} data
* @return {?}
*/
TwoDatePickerComponent.prototype.rangeChange = /**
* @param {?} data
* @return {?}
*/
function (data) {
this.chooseDate(data.selectedRange);
this.selectDateSubject.next({ side: 'start', date: this.rangeStart, onlyWrite: true });
this.selectDateSubject.next({ side: 'end', date: this.rangeEnd, onlyWrite: true });
};
/**
* @param {?} range
* @return {?}
*/
TwoDatePickerComponent.prototype.notifyValueChange = /**
* @param {?} range
* @return {?}
*/
function (range) {
this.onChange(range);
this.selectRange.emit(this.selectedRange);
};
/**
* @param {?} event
* @return {?}
*/
TwoDatePickerComponent.prototype.selectingDate = /**
* @param {?} event
* @return {?}
*/
function (event) {
this.hoverOnDate.next(event);
};
/**
* @return {?}
*/
TwoDatePickerComponent.prototype.subscribeHoverActions = /**
* @return {?}
*/
function () {
var _this = this;
this.hoverOnDate.pipe(distinctUntilChanged()).subscribe((/**
* @param {?} date
* @return {?}
*/
function (date) {
_this.previewRangeEnd(date);
}));
};
/**
* @param {?} date
* @return {?}
*/
TwoDatePickerComponent.prototype.previewRangeEnd = /**
* @param {?} date
* @return {?}
*/
function (date) {
if (date) {
this.leftPicker['previewEnd'] = date;
this.rightPicker['previewEnd'] = date;
}
};
/**
* @param {?} rangeStart
* @param {?} picker
* @return {?}
*/
TwoDatePickerComponent.prototype.syncRangeStart = /**
* @param {?} rangeStart
* @param {?} picker
* @return {?}
*/
function (rangeStart, picker) {
if (this.whichOpen === 'end') {
this.selectEnd(rangeStart);
}
else if (this.whichOpen === 'start') {
this.selectStart(rangeStart);
}
picker.selectRange(rangeStart, true);
};
/**
* @param {?} date
* @return {?}
*/
TwoDatePickerComponent.prototype.selectStart = /**
* @param {?} date
* @return {?}
*/
function (date) {
this.selectDateSubject.next({ side: 'start', date: date });
this.whichOpen = 'end';
this.startOpen = false;
this.endOpen = true;
this.selectedRange[0] = date;
this.rangeStart = date;
this.isDisableToday();
};
/**
* @param {?} date
* @return {?}
*/
TwoDatePickerComponent.prototype.selectEnd = /**
* @param {?} date
* @return {?}
*/
function (date) {
this.selectDateSubject.next({ side: 'end', date: date });
this.selectedRange[1] = date;
this.rangeEnd = date;
if (!this.showTime && this.hideOnRangeSelected) {
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
this.whichOpen = false;
}
this.isDisableToday();
};
/**
* @return {?}
*/
TwoDatePickerComponent.prototype.consolidateTime = /**
* @return {?}
*/
function () {
};
/**
* @param {?} event
* @return {?}
*/
TwoDatePickerComponent.prototype.chooseToday = /**
* @param {?} event
* @return {?}
*/
function (event) {
var _a;
event.preventDefault();
event.stopPropagation();
if ((this.minDate.getTime() <= (this.today).getTime()) && (this.maxDate.getTime() >= (this.today).getTime())) {
if (this.whichOpen === 'start') {
this.selectStart(this.today);
}
else if (this.whichOpen === 'end') {
this.selectEnd(this.today);
}
_a = tslib_1.__read(this.selectedRange, 2), this.rangeStart = _a[0], this.rangeEnd = _a[1];
}
};
/**
* @param {?} event
* @return {?}
*/
TwoDatePickerComponent.prototype.clearBtn = /**
* @param {?} event
* @return {?}
*/
function (event) {
event.preventDefault();
event.stopPropagation();
if (this.whichOpen) {
this.clear(this.whichOpen);
}
};
/**
* @return {?}
*/
TwoDatePickerComponent.prototype.setI18nText = /**
* @return {?}
*/
function () {
var _this = this;
this.i18nText = this.i18n.getI18nText().datePicker;
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nSubscription = this.i18n.langChange().subscribe((/**
* @param {?} data
* @return {?}
*/
function (data) {
_this.i18nText = data.datePicker;
_this.i18nLocale = data.locale;
}));
};
/**
* @return {?}
*/
TwoDatePickerComponent.prototype.ngOnDestroy = /**
* @return {?}
*/
function () {
this.isOpen = false;
this.startOpen = false;
this.endOpen = false;
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
};
TwoDatePickerComponent.decorators = [
{ type: Component, args: [{
selector: '[dTwoDatePicker]',
exportAs: 'twoDatePicker',
template: "<ng-content></ng-content>\r\n<ng-template\r\n cdk-connected-overlay\r\n [cdkConnectedOverlayOrigin]=\"cdkConnectedOverlayOrigin\"\r\n [cdkConnectedOverlayOpen]=\"isOpen\"\r\n (backdropClick)=\"isOpen = false\"\r\n (positionChange)=\"onPositionChange($event)\"\r\n>\r\n <div [@cornerFadeInOut]=\"isOpen ? datepickerPosition : 'void'\" class=\"devui-two-date-wrapper\">\r\n <div class=\"devui-two-date-picker\">\r\n <d-two-datepicker-single\r\n class=\"devui-date-picker\"\r\n [locale]=\"locale\"\r\n [cssClass]=\"cssClass\"\r\n [disabled]=\"disabled\"\r\n [dateConverter]=\"dateConverter\"\r\n [dateFormat]=\"dateFormat\"\r\n [dateConfig]=\"dateConfig\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [rangePicker]=\"true\"\r\n [selectedRange]=\"[rangeStart, rangeEnd]\"\r\n [currentCalendars]=\"currentCalendars\"\r\n [showTime]=\"showTime\"\r\n (rangeSelected)=\"rangeChange($event)\"\r\n (hoverOnDate)=\"selectingDate($event)\"\r\n (rangeSelecting)=\"syncRangeStart($event, rightPicker)\"\r\n (syncPickerPair)=\"syncPickerPair($event, 'left')\"\r\n [whichOpen]=\"whichOpen\"\r\n #leftPicker\r\n >\r\n </d-two-datepicker-single>\r\n <d-two-datepicker-single\r\n class=\"devui-date-picker\"\r\n [locale]=\"locale\"\r\n [cssClass]=\"cssClass\"\r\n [disabled]=\"disabled\"\r\n [dateConverter]=\"dateConverter\"\r\n [dateFormat]=\"dateFormat\"\r\n [dateConfig]=\"dateConfig\"\r\n [maxDate]=\"maxDate\"\r\n [minDate]=\"minDate\"\r\n [rangePicker]=\"true\"\r\n [selectedRange]=\"[rangeStart, rangeEnd]\"\r\n [currentCalendars]=\"currentCalendars\"\r\n [showTime]=\"showTime\"\r\n (rangeSelected)=\"rangeChange($event)\"\r\n (hoverOnDate)=\"selectingDate($event)\"\r\n (rangeSelecting)=\"syncRangeStart($event, leftPicker)\"\r\n (syncPickerPair)=\"syncPickerPair($event, 'right')\"\r\n [isAuxiliary]=\"true\"\r\n (consolidateTime)=\"consolidateTime()\"\r\n [whichOpen]=\"whichOpen\"\r\n #rightPicker\r\n >\r\n </d-two-datepicker-single>\r\n </div>\r\n <div *ngIf=\"!customViewTemplate\" class=\"devui-two-date-footer devui-two-date-custom\">\r\n <a\r\n [ngClass]=\"{\r\n disabled: disableToday\r\n }\"\r\n (click)=\"chooseToday($event)\"\r\n >{{ i18nText.today }}</a\r\n >\r\n <d-button (btnClick)=\"clearBtn($event)\" bsSize=\"sm\">{{ i18nText.clear }}</d-button>\r\n </div>\r\n </div>\r\n</ng-template>\r\n",
animations: [
cornerFadeInOut
],
styles: [".devui-two-date-wrapper{display:-webkit-inline-box!important;display:inline-flex!important;box-shadow:0 4px 8px 0 rgba(41,48,64,.2);background-color:#fff;-webkit-transform:perspective(1px) translate3d(0,0,0);transform:perspective(1px) translate3d(0,0,0);-webkit-box-orient:vertical;-webkit-box-direction:normal;flex-direction:column}.devui-two-date-wrapper .devui-two-date-picker{display:-webkit-inline-box!important;display:inline-flex!important;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.devui-two-date-wrapper .devui-two-date-picker::after{content:'';position:absolute;top:29px;width:100%;height:1px;border-bottom:1px solid #adb0b8}.devui-two-date-wrapper .devui-two-date-custom{width:500px;border-top:1px solid #adb0b8}.devui-two-date-wrapper .devui-two-date-footer{padding:10px;display:-webkit-box;display:flex;-webkit-box-pack:justify;justify-content:space-between;-webkit-box-align:center;align-items:center}.devui-two-date-wrapper .devui-two-date-footer a{color:#5e7ce0;text-decoration:none;cursor:pointer}.devui-two-date-wrapper .devui-two-date-footer a.disabled{color:#adb0b8;cursor:not-allowed}.devui-date-picker:not(:last-child){margin-right:20px}.host-wrapper{color:red}:host ::ng-deep .devui-input-focus{border-color:#344899!important}"]
}] }
];
/** @nocollapse */
TwoDatePickerComponent.ctorParameters = function () { return [
{ type: ElementRef },
{ type: DatePickerConfig },
{ type: I18nService }
]; };
TwoDatePickerComponent.propDecorators = {
locale: [{ type: Input }],
cssClass: [{ type: Input }],
disabled: [{ type: Input }],
dateConverter: [{ type: Input }],
selectedRange: [{ type: Input }],
hideOnRangeSelected: [{ type: Input }],
selectRange: [{ type: Output }],
leftPicker: [{ type: ViewChild, args: ['leftPicker', { static: false },] }],
rightPicker: [{ type: ViewChild, args: ['rightPicker', { static: false },] }],
templateWrap: [{ type: ViewChild, args: ['templateWrap', { static: false },] }],
dateConfig: [{ type: Input }],
dateFormat: [{ type: Input }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
return TwoDatePickerComponent;
}());
export { TwoDatePickerComponent };
if (false) {
/** @type {?} */
TwoDatePickerComponent.prototype.locale;
/** @type {?} */
TwoDatePickerComponent.prototype.cssClass;
/** @type {?} */
TwoDatePickerComponent.prototype.disabled;
/** @type {?} */
TwoDatePickerComponent.prototype.dateConverter;
/** @type {?} */
TwoDatePickerComponent.prototype.showTime;
/** @type {?} */
TwoDatePickerComponent.prototype.selectedRange;
/** @type {?} */
TwoDatePickerComponent.prototype.hideOnRangeSelected;
/** @type {?} */
TwoDatePickerComponent.prototype.customViewTemplate;
/** @type {?} */
TwoDatePickerComponent.prototype.selectRange;
/** @type {?} */
TwoDatePickerComponent.prototype.leftPicker;
/** @type {?} */
TwoDatePickerComponent.prototype.rightPicker;
/** @type {?} */
TwoDatePickerComponent.prototype.templateWrap;
/** @type {?} */
TwoDatePickerComponent.prototype.datePosition;
/** @type {?} */
TwoDatePickerComponent.prototype.selectDateSubject;
/** @type {?} */
TwoDatePickerComponent.prototype.hoverOnDate;
/** @type {?} */
TwoDatePickerComponent.prototype.switchOpenSub;
/** @type {?} */
TwoDatePickerComponent.prototype.today;
/** @type {?} */
TwoDatePickerComponent.prototype.rangeStart;
/** @type {?} */
TwoDatePickerComponent.prototype.rangeEnd;
/** @type {?} */
TwoDatePickerComponent.prototype.disableToday;
/** @type {?} */
TwoDatePickerComponent.prototype.i18nText;
/** @type {?} */
TwoDatePickerComponent.prototype.i18nLocale;
/** @type {?} */
TwoDatePickerComponent.prototype.i18nSubscription;
/** @type {?} */
TwoDatePickerComponent.prototype.datepickerPosition;
/** @type {?} */
TwoDatePickerComponent.prototype.currentCalendars;
/** @type {?} */
TwoDatePickerComponent.prototype.cdkConnectedOverlayOrigin;
/** @type {?} */
TwoDatePickerComponent.prototype.isOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.startOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.endOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._whichOpen;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._dateConfig;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._dateFormat;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._maxDate;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype._minDate;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.onChange;
/** @type {?} */
TwoDatePickerComponent.prototype.chooseDate;
/** @type {?} */
TwoDatePickerComponent.prototype.clear;
/** @type {?} */
TwoDatePickerComponent.prototype.el;
/**
* @type {?}
* @protected
*/
TwoDatePickerComponent.prototype.datePickerConfig;
/**
* @type {?}
* @private
*/
TwoDatePickerComponent.prototype.i18n;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHdvLWRhdGVwaWNrZXIuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctZGV2dWkvZGF0ZXBpY2tlci8iLCJzb3VyY2VzIjpbInR3by1kYXRlcGlja2VyL3R3by1kYXRlcGlja2VyLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7QUFBQSxPQUFPLEVBQ0wsU0FBUyxFQUdULFVBQVUsRUFFVixTQUFTLEVBQ1QsS0FBSyxFQUNMLFlBQVksRUFDWixNQUFNLEVBQ04sWUFBWSxFQUNiLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxnQkFBZ0IsRUFBeUQsTUFBTSxzQkFBc0IsQ0FBQztBQUMvRyxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLE9BQU8sRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDN0MsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDdEQsT0FBTyxFQUFFLHVCQUF1QixJQUFJLGdCQUFnQixFQUFFLE1BQU0sK0JBQStCLENBQUM7QUFDNUYsT0FBTyxFQUFFLFdBQVcsRUFBaUIsTUFBTSxlQUFlLENBQUM7QUFFM0QsT0FBTyxFQUFFLG9CQUFvQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFFdEQ7SUFnREUsZ0NBQW1CLEVBQWMsRUFBWSxnQkFBa0MsRUFBVSxJQUFpQjtRQUExRyxpQkFHQztRQUhrQixPQUFFLEdBQUYsRUFBRSxDQUFZO1FBQVkscUJBQWdCLEdBQWhCLGdCQUFnQixDQUFrQjtRQUFVLFNBQUksR0FBSixJQUFJLENBQWE7UUFsQzFHLGFBQVEsR0FBRyxLQUFLLENBQUM7UUFDUixrQkFBYSxHQUFHLENBQUMsSUFBSSxFQUFFLElBQUksQ0FBQyxDQUFDO1FBQzdCLHdCQUFtQixHQUFHLElBQUksQ0FBQztRQUUxQixnQkFBVyxHQUFHLElBQUksWUFBWSxFQUFFLENBQUM7UUFLM0MsaUJBQVksR0FBMEIsUUFBUSxD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VyxvQ0FBcUI7Ozs7O0lBQUUsa0RBQTRDOzs7OztJQUFFLHNDQUF5QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIE9uSW5pdCxcclxuICBPbkRlc3Ryb3ksXHJcbiAgRWxlbWVudFJlZixcclxuICBUZW1wbGF0ZVJlZixcclxuICBWaWV3Q2hpbGQsXHJcbiAgSW5wdXQsXHJcbiAgSG9zdExpc3RlbmVyLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXJcclxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcclxuaW1wb3J0IHsgQ2RrT3ZlcmxheU9yaWdpbiwgQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlLCBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MgfSBmcm9tICdAYW5ndWxhci9jZGsvb3ZlcmxheSc7XHJcbmltcG9ydCB7IGNvcm5lckZhZGVJbk91dCB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgU3ViamVjdCwgU3Vic2NyaXB0aW9uIH0gZnJvbSAncnhqcyc7XHJcbmltcG9ydCB7IGRpc3RpbmN0VW50aWxDaGFuZ2VkIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5pbXBvcnQgeyBEYXRlUGlja2VyQ29uZmlnU2VydmljZSBhcyBEYXRlUGlja2VyQ29uZmlnIH0gZnJvbSAnLi4vZGF0ZS1waWNrZXIuY29uZmlnLnNlcnZpY2UnO1xyXG5pbXBvcnQgeyBJMThuU2VydmljZSwgSTE4bkludGVyZmFjZSB9IGZyb20gJ25nLWRldnVpL2kxOG4nO1xyXG5pbXBvcnQgeyBEYXRlQ29udmVydGVyIH0gZnJvbSAnbmctZGV2dWkvdXRpbHMnO1xyXG5pbXBvcnQgeyBEZWZhdWx0RGF0ZUNvbnZlcnRlciB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuXHJcbkBDb21wb25lbnQoe1xyXG4gIHNlbGVjdG9yOiAnW2RUd29EYXRlUGlja2VyXScsXHJcbiAgZXhwb3J0QXM6ICd0d29EYXRlUGlja2VyJyxcclxuICB0ZW1wbGF0ZVVybDogJ3R3by1kYXRlcGlja2VyLmNvbXBvbmVudC5odG1sJyxcclxuICBzdHlsZVVybHM6IFsnLi90d28tZGF0ZXBpY2tlci5jb21wb25lbnQuc2NzcyddLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIGNvcm5lckZhZGVJbk91dFxyXG4gIF1cclxufSlcclxuZXhwb3J0IGNsYXNzIFR3b0RhdGVQaWNrZXJDb21wb25lbnQgaW1wbGVtZW50cyBPbkluaXQsIE9uRGVzdHJveSB7XHJcbiAgQElucHV0KCkgbG9jYWxlOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgY3NzQ2xhc3M6IHN0cmluZztcclxuICBASW5wdXQoKSBkaXNhYmxlZDogYm9vbGVhbjtcclxuICBASW5wdXQoKSBkYXRlQ29udmVydGVyOiBEYXRlQ29udmVydGVyO1xyXG4gIHNob3dUaW1lID0gZmFsc2U7XHJcbiAgQElucHV0KCkgc2VsZWN0ZWRSYW5nZSA9IFtudWxsLCBudWxsXTtcclxuICBASW5wdXQoKSBoaWRlT25SYW5nZVNlbGVjdGVkID0gdHJ1ZTtcclxuICBjdXN0b21WaWV3VGVtcGxhdGU6IFRlbXBsYXRlUmVmPGFueT47XHJcbiAgQE91dHB1dCgpIHNlbGVjdFJhbmdlID0gbmV3IEV2ZW50RW1pdHRlcigpO1xyXG4gIEBWaWV3Q2hpbGQoJ2xlZnRQaWNrZXInLCB7IHN0YXRpYzogZmFsc2UgfSkgbGVmdFBpY2tlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCdyaWdodFBpY2tlcicsIHsgc3RhdGljOiBmYWxzZSB9KSByaWdodFBpY2tlcjogRWxlbWVudFJlZjtcclxuICBAVmlld0NoaWxkKCd0ZW1wbGF0ZVdyYXAnLCB7IHN0YXRpYzogZmFsc2UgfSkgdGVtcGxhdGVXcmFwOiBFbGVtZW50UmVmO1xyXG5cclxuICBkYXRlUG9zaXRpb246IFZlcnRpY2FsQ29ubmVjdGlvblBvcyA9ICdib3R0b20nO1xyXG4gIHNlbGVjdERhdGVTdWJqZWN0ID0gbmV3IFN1YmplY3Q8e3NpZGU6IFN0cmluZywgZGF0ZTogRGF0ZSwgb25seVdyaXRlPzogQm9vbGVhbn0+KCk7XHJcbiAgaG92ZXJPbkRhdGU6IFN1YmplY3Q8b2JqZWN0PiA9IG5ldyBTdWJqZWN0PG9iamVjdD4oKTtcclxuICBzd2l0Y2hPcGVuU3ViOiBTdWJqZWN0PCdzdGFydCd8J2VuZCd8ZmFsc2U+ID0gbmV3IFN1YmplY3Q8J3N0YXJ0J3wnZW5kJ3xmYWxzZT4oKTtcclxuICB0b2RheSA9IG5ldyBEYXRlKCk7XHJcbiAgcmFuZ2VTdGFydDtcclxuICByYW5nZUVuZDtcclxuICBkaXNhYmxlVG9kYXk7XHJcbiAgaTE4blRleHQ6IEkxOG5JbnRlcmZhY2VbJ2RhdGVQaWNrZXInXTtcclxuICBpMThuTG9jYWxlOiBJMThuSW50ZXJmYWNlWydsb2NhbGUnXTtcclxuICBpMThuU3Vic2NyaXB0aW9uOiBTdWJzY3JpcHRpb247XHJcbiAgZGF0ZXBpY2tlclBvc2l0aW9uOiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MgPSAnYm90dG9tJztcclxuXHJcbiAgcHVibGljIGN1cnJlbnRDYWxlbmRhcnMgPSBbbnVsbCwgbnVsbF07XHJcbiAgcHVibGljIGNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW46IENka092ZXJsYXlPcmlnaW47XHJcbiAgcHVibGljIGlzT3BlbiA9IGZhbHNlO1xyXG4gIHByaXZhdGUgc3RhcnRPcGVuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBlbmRPcGVuID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBfd2hpY2hPcGVuOiAnc3RhcnQnfCdlbmQnfGZhbHNlO1xyXG4gIHByaXZhdGUgX2RhdGVDb25maWc6IGFueTtcclxuICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgb25DaGFuZ2UgPSAoXzogYW55KSA9PiBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3RvcihwdWJsaWMgZWw6IEVsZW1lbnRSZWYsIHByb3RlY3RlZCBkYXRlUGlja2VyQ29uZmlnOiBEYXRlUGlja2VyQ29uZmlnLCBwcml2YXRlIGkxOG46IEkxOG5TZXJ2aWNlKSB7XHJcbiAgICB0aGlzLl9kYXRlQ29uZmlnID0gZGF0ZVBpY2tlckNvbmZpZ1snZGF0ZUNvbmZpZyddO1xyXG4gICAgdGhpcy5kYXRlQ29udmVydGVyID0gZGF0ZVBpY2tlckNvbmZpZ1snZGF0ZUNvbmZpZyddLmRhdGVDb252ZXJ0ZXIgfHwgbmV3IERlZmF1bHREYXRlQ29udmVydGVyKCk7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgZGF0ZUNvbmZpZyhkYXRlQ29uZmlnOiBhbnkpIHtcclxuICAgIGlmIChkYXRlQ29uZmlnKSB7XHJcbiAgICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlQ29uZmlnO1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gdGhpcy5zaG93VGltZSA/IGRhdGVDb25maWcuZm9ybWF0LnRpbWUgOiBkYXRlQ29uZmlnLmZvcm1hdC5kYXRlO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IHRoaXMuZGF0ZVBpY2tlckNvbmZpZy5kYXRlQ29uZmlnO1xyXG4gICAgfVxyXG4gIH1cclxuICBASW5wdXQoKSBzZXQgZGF0ZUZvcm1hdChkYXRlRm9ybWF0OiBzdHJpbmcpIHtcclxuICAgIGlmICh0aGlzLl9kYXRlRm9ybWF0ICE9PSBkYXRlRm9ybWF0KSB7XHJcbiAgICAgIHRoaXMuX2RhdGVGb3JtYXQgPSBkYXRlRm9ybWF0O1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXQgbWF4RGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICBjb25zdCBwYXJzZURhdGUgPSB0aGlzLmNvbnZlcnREYXRlKGRhdGUpO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzLl9tYXhEYXRlID0gcGFyc2VEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXQgbWluRGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICBjb25zdCBwYXJzZURhdGUgPSB0aGlzLmNvbnZlcnREYXRlKGRhdGUpO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzLl9taW5EYXRlID0gcGFyc2VEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuICBzZXQgd2hpY2hPcGVuKHNpZGU6ICdzdGFydCd8J2VuZCd8ZmFsc2UpIHtcclxuICAgIHRoaXMuX3doaWNoT3BlbiA9IHNpZGU7XHJcbiAgICB0aGlzLnN3aXRjaE9wZW5TdWIubmV4dChzaWRlKTtcclxuICB9XHJcblxyXG4gIGdldCBkYXRlQ29uZmlnKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGVDb25maWc7XHJcbiAgfVxyXG4gIGdldCBkYXRlRm9ybWF0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGVGb3JtYXQ7XHJcbiAgfVxyXG4gIGdldCBtYXhEYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21heERhdGU7XHJcbiAgfVxyXG4gIGdldCBtaW5EYXRlKCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX21pbkRhdGU7XHJcbiAgfVxyXG4gIGdldCB3aGljaE9wZW4oKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fd2hpY2hPcGVuO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignZG9jdW1lbnQ6Y2xpY2snLCBbJyRldmVudCddKVxyXG4gIG9uRG9jdW1lbnRDbGljaygkZXZlbnQpIHtcclxuICAgIGlmICh0aGlzLmVsLm5hdGl2ZUVsZW1lbnQgIT09ICRldmVudC50YXJnZXQpIHtcclxuICAgICAgdGhpcy5pc09wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5zdGFydE9wZW4gPSBmYWxzZTtcclxuICAgICAgdGhpcy5lbmRPcGVuID0gZmFsc2U7XHJcbiAgICAgIHRoaXMud2hpY2hPcGVuID0gZmFsc2U7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uSW5pdCgpIHtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLm1pbkRhdGUgPyBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1pbiwgMCwgMSwgMCwgMCwgMCk7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5tYXhEYXRlID8gbmV3IERhdGUodGhpcy5tYXhEYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5tYXgsIDExLCAzMSwgMjMsIDU5LCA1OSk7XHJcbiAgICB0aGlzLnNldEkxOG5UZXh0KCk7XHJcbiAgICB0aGlzLnVwZGF0ZUNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4odGhpcy5lbC5uYXRpdmVFbGVtZW50KTtcclxuICAgIHRoaXMuc3Vic2NyaWJlSG92ZXJBY3Rpb25zKCk7XHJcbiAgfVxyXG5cclxuICBpc0Rpc2FibGVUb2RheSgpIHtcclxuICAgIGlmICgodGhpcy5taW5EYXRlLmdldFRpbWUoKSA+PSAodGhpcy50b2RheSkuZ2V0VGltZSgpKSB8fCAodGhpcy5tYXhEYXRlLmdldFRpbWUoKSA8PSAodGhpcy50b2RheSkuZ2V0VGltZSgpKSkge1xyXG4gICAgICB0aGlzLmRpc2FibGVUb2RheSA9IHRydWU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmRpc2FibGVUb2RheSA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdG9nZ2xlKGV2ZW50LCBzaWRlOiAnc3RhcnQnfCdlbmQnKSB7XHJcbiAgICBldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcclxuICAgIGlmICh0aGlzLmlzT3Blbikge1xyXG4gICAgICBpZiAoc2lkZSA9PT0gJ3N0YXJ0Jykge1xyXG4gICAgICAgIGlmICh0aGlzLnN0YXJ0T3Blbikge1xyXG4gICAgICAgICAgdGhpcy5zdGFydE9wZW4gPSBmYWxzZTtcclxuICAgICAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLndoaWNoT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5lbmRPcGVuKSB7XHJcbiAgICAgICAgICB0aGlzLnN0YXJ0T3BlbiA9IHRydWU7XHJcbiAgICAgICAgICB0aGlzLndoaWNoT3BlbiA9ICdzdGFydCc7XHJcbiAgICAgICAgfVxyXG4gICAgICAgIHRoaXMuZW5kT3BlbiA9IGZhbHNlO1xyXG4gICAgICB9IGVsc2UgaWYgKHNpZGUgPT09ICdlbmQnKSB7XHJcbiAgICAgICAgaWYgKHRoaXMuc3RhcnRPcGVuKSB7XHJcbiAgICAgICAgICB0aGlzLmVuZE9wZW4gPSB0cnVlO1xyXG4gICAgICAgICAgdGhpcy53aGljaE9wZW4gPSAnZW5kJztcclxuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuZW5kT3Blbikge1xyXG4gICAgICAgICAgdGhpcy5lbmRPcGVuID0gZmFsc2U7XHJcbiAgICAgICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgICAgICAgdGhpcy53aGljaE9wZW4gPSBmYWxzZTtcclxuICAgICAgICB9XHJcbiAgICAgICAgdGhpcy5zdGFydE9wZW4gPSBmYWxzZTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5zdGFydE9wZW4gPSBzaWRlID09PSAnc3RhcnQnID8gdHJ1ZSA6IGZhbHNlO1xyXG4gICAgICB0aGlzLmVuZE9wZW4gPSBzaWRlID09PSAnZW5kJyA/IHRydWUgOiBmYWxzZTtcclxuICAgICAgdGhpcy5pc09wZW4gPSB0cnVlO1xyXG4gICAgICB0aGlzLndoaWNoT3BlbiA9IHNpZGU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBvblBvc2l0aW9uQ2hhbmdlKHBvc2l0aW9uOiBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UpIHtcclxuICAgIHN3aXRjaCAocG9zaXRpb24uY29ubmVjdGlvblBhaXIub3ZlcmxheVkpIHtcclxuICAgICAgY2FzZSAndG9wJzpcclxuICAgICAgY2FzZSAnY2VudGVyJzpcclxuICAgICAgICB0aGlzLmRhdGVQb3NpdGlvbiA9ICdib3R0b20nO1xyXG4gICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICB0aGlzLmRhdGVQb3NpdGlvbiA9ICd0b3AnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgY29udmVydERhdGUoZGF0ZSkge1xyXG4gICAgcmV0dXJuIGRhdGUgP1xyXG4gICAgICB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoZGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpIDogbnVsbDtcclxuICB9XHJcblxyXG4gIGZvcm1hdERhdGUoZGF0ZSkge1xyXG4gICAgcmV0dXJuIGRhdGUgP1xyXG4gICAgICB0aGlzLmRhdGVDb252ZXJ0ZXIuZm9ybWF0KGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKSA6IG51bGw7XHJcbiAgfVxyXG5cclxuICB1cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKGVsOiBFbGVtZW50UmVmKSB7XHJcbiAgICBpZiAoZWwpIHtcclxuICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luID0gbmV3IENka092ZXJsYXlPcmlnaW4oZWwpO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy5jZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc3luY1BpY2tlclBhaXIoY3VycmVudENhbGVuZGVyOiBvYmplY3QsIG9yaWVudGF0aW9uOiBzdHJpbmcpIHtcclxuICAgIHN3aXRjaCAob3JpZW50YXRpb24pIHtcclxuICAgICAgY2FzZSAnbGVmdCc6XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJzWzBdID0gY3VycmVudENhbGVuZGVyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgICBjYXNlICdyaWdodCc6XHJcbiAgICAgICAgdGhpcy5jdXJyZW50Q2FsZW5kYXJzWzFdID0gY3VycmVudENhbGVuZGVyO1xyXG4gICAgICAgIGJyZWFrO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcmFuZ2VDaGFuZ2UoZGF0YSkge1xyXG4gICAgdGhpcy5jaG9vc2VEYXRlKGRhdGEuc2VsZWN0ZWRSYW5nZSk7XHJcbiAgICB0aGlzLnNlbGVjdERhdGVTdWJqZWN0Lm5leHQoe3NpZGU6ICdzdGFydCcsIGRhdGU6IHRoaXMucmFuZ2VTdGFydCwgb25seVdyaXRlOiB0cnVlfSk7XHJcbiAgICB0aGlzLnNlbGVjdERhdGVTdWJqZWN0Lm5leHQoe3NpZGU6ICdlbmQnLCBkYXRlOiB0aGlzLnJhbmdlRW5kLCBvbmx5V3JpdGU6IHRydWV9KTtcclxuICB9XHJcblxyXG4gIGNob29zZURhdGUgPSAocmFuZ2UpID0+IHtcclxuICAgIGlmIChyYW5nZSkge1xyXG4gICAgICB0aGlzLnNlbGVjdGVkUmFuZ2UgPSByYW5nZTtcclxuICAgICAgaWYgKEFycmF5LmlzQXJyYXkodGhpcy5zZWxlY3RlZFJhbmdlKSkge1xyXG4gICAgICAgIFt0aGlzLnJhbmdlU3RhcnQsIHRoaXMucmFuZ2VFbmRdID0gdGhpcy5zZWxlY3RlZFJhbmdlO1xyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgICB0aGlzLm5vdGlmeVZhbHVlQ2hhbmdlKHJhbmdlKTtcclxuICB9XHJcblxyXG4gIG5vdGlmeVZhbHVlQ2hhbmdlKHJhbmdlKSB7XHJcbiAgICB0aGlzLm9uQ2hhbmdlKHJhbmdlKTtcclxuICAgIHRoaXMuc2VsZWN0UmFuZ2UuZW1pdCh0aGlzLnNlbGVjdGVkUmFuZ2UpO1xyXG4gIH1cclxuXHJcbiAgc2VsZWN0aW5nRGF0ZShldmVudCkge1xyXG4gICAgdGhpcy5ob3Zlck9uRGF0ZS5uZXh0KGV2ZW50KTtcclxuICB9XHJcblxyXG4gIHN1YnNjcmliZUhvdmVyQWN0aW9ucygpIHtcclxuICAgIHRoaXMuaG92ZXJPbkRhdGUucGlwZShcclxuICAgICAgZGlzdGluY3RVbnRpbENoYW5nZWQoKVxyXG4gICAgKS5zdWJzY3JpYmUoKGRhdGUpID0+IHtcclxuICAgICAgdGhpcy5wcmV2aWV3UmFuZ2VFbmQoZGF0ZSk7XHJcbiAgICB9KTtcclxuICB9XHJcblxyXG4gIHByZXZpZXdSYW5nZUVuZChkYXRlKSB7XHJcbiAgICBpZiAoZGF0ZSkge1xyXG4gICAgICB0aGlzLmxlZnRQa