@duoduo-oba/ng-devui
Version:
DevUI components based on Angular
523 lines • 42.5 kB
JavaScript
/**
* @fileoverview added by tsickle
* Generated from: datepicker-cdk-overlay.component.ts
* @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc
*/
import { NG_VALUE_ACCESSOR } from '@angular/forms';
import { Component, forwardRef, Input, TemplateRef, Output, EventEmitter, ElementRef, ViewContainerRef, Renderer2, HostListener } from '@angular/core';
import { CdkOverlayOrigin } from '@angular/cdk/overlay';
import { AppendToBodyDirectionsConfig } from '@duoduo-oba/ng-devui/utils';
import { SelectDateChangeReason } from './date-change-event-args.model';
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';
import { cornerFadeInOut } from '@duoduo-oba/ng-devui/utils';
import { fromEvent } from 'rxjs';
import { debounceTime } from 'rxjs/operators';
export class DatePickerAppendToBodyComponent {
/**
* @param {?} elementRef
* @param {?} viewContainerRef
* @param {?} renderer2
* @param {?} datePickerConfig
* @param {?} i18n
*/
constructor(elementRef, viewContainerRef, renderer2, datePickerConfig, i18n) {
this.elementRef = elementRef;
this.viewContainerRef = viewContainerRef;
this.renderer2 = renderer2;
this.datePickerConfig = datePickerConfig;
this.i18n = i18n;
this.yearNumber = 12;
this.autoOpen = false;
this.selectedDateChange = new EventEmitter();
this.isOpen = false;
this.datepickerPosition = 'bottom';
this.clickShow = false;
this.appendToBodyDirections = [
'rightDown', 'leftDown', 'rightUp', 'leftUp'
];
this.onChange = (/**
* @param {?} _
* @return {?}
*/
(_) => null);
this.onTouched = (/**
* @return {?}
*/
() => null);
this.clearAll = (/**
* @return {?}
*/
() => {
this.writeValue(null);
});
this._dateConfig = datePickerConfig['dateConfig'];
this.dateConverter = datePickerConfig['dateConfig'].dateConverter || new DefaultDateConverter();
this.inputSub = fromEvent(this.elementRef.nativeElement, 'input')
.pipe(debounceTime(300)).subscribe((/**
* @param {?} event
* @return {?}
*/
event => {
this.transUserInputToDatepicker(event);
}));
}
/**
* @param {?} dateConfig
* @return {?}
*/
set dateConfig(dateConfig) {
if (dateConfig) {
this._dateConfig = dateConfig;
this._dateFormat = this.showTime ? dateConfig.format.time : dateConfig.format.date;
}
else {
this._dateConfig = this.datePickerConfig.dateConfig;
}
}
/**
* @return {?}
*/
get dateConfig() {
return this._dateConfig;
}
/**
* @param {?} dateFormat
* @return {?}
*/
set dateFormat(dateFormat) {
if (this._dateFormat !== dateFormat) {
this._dateFormat = dateFormat;
this.writeModelValue({ selectedDate: this.selectedDate, reason: SelectDateChangeReason.format });
}
}
/**
* @return {?}
*/
get dateFormat() {
return this._dateFormat;
}
/**
* @param {?} date
* @return {?}
*/
set maxDate(date) {
/** @type {?} */
const parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this._maxDate = parseDate;
}
}
/**
* @return {?}
*/
get maxDate() {
return this._maxDate;
}
/**
* @param {?} date
* @return {?}
*/
set minDate(date) {
/** @type {?} */
const parseDate = this.dateConverter.parse(date, this.dateFormat, this.locale || this.i18nLocale);
if (parseDate) {
this._minDate = parseDate;
}
}
/**
* @return {?}
*/
get minDate() {
return this._minDate;
}
/**
* @return {?}
*/
ngOnInit() {
this.showTime = this.showTime || this.dateConfig.timePicker;
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.setPositions();
this.setI18nText();
this.updateCdkConnectedOverlayOrigin();
if (this.autoOpen) {
this.isOpen = true;
}
}
/**
* @param {?} changes
* @return {?}
*/
ngOnChanges(changes) {
if (changes['appendToBodyDirections']) {
this.setPositions();
}
}
/**
* @param {?} fn
* @return {?}
*/
registerOnChange(fn) {
this.onChange = fn;
}
/**
* @param {?} fn
* @return {?}
*/
registerOnTouched(fn) {
this.onTouched = fn;
}
/**
* @param {?} obj
* @return {?}
*/
writeValue(obj) {
this.selectedDate = obj ?
this.dateConverter.parse(obj, this.dateFormat, this.locale || this.i18nLocale) : null;
/** @type {?} */
const value = this.selectedDate ? this.dateConverter.format(this.selectedDate, this.dateFormat, this.locale || this.i18nLocale) : '';
this.renderer2.setProperty(this.elementRef.nativeElement, 'value', value);
}
/**
* @return {?}
*/
setI18nText() {
this.i18nLocale = this.i18n.getI18nText().locale;
this.i18nSubscription = this.i18n.langChange().subscribe((/**
* @param {?} data
* @return {?}
*/
(data) => {
this.i18nLocale = data.locale;
}));
}
/**
* @param {?} data
* @return {?}
*/
timeChange(data) {
this.writeValue(data['selectedDate']);
this.writeModelValue(data);
if (data['reason'] === SelectDateChangeReason.date && !this.showTime ||
data['reason'] === SelectDateChangeReason.button) {
this.isOpen = false;
}
}
/**
* @return {?}
*/
updateCdkConnectedOverlayOrigin() {
if (this.elementRef.nativeElement) {
this.cdkConnectedOverlayOrigin = new CdkOverlayOrigin(this.elementRef.nativeElement);
}
}
/**
* @param {?} $event
* @param {?=} clickShow
* @return {?}
*/
toggle($event, clickShow) {
this.isOpen = !this.isOpen;
this.clickShow = clickShow;
}
/**
* @return {?}
*/
hide() {
this.isOpen = false;
}
/**
* @private
* @param {?} selectDateObj
* @return {?}
*/
writeModelValue(selectDateObj) {
/** @type {?} */
let selectDate;
/** @type {?} */
let dateReason = SelectDateChangeReason.time;
if (selectDateObj && typeof selectDateObj === 'object' && selectDateObj.hasOwnProperty('selectedDate')) {
selectDate = selectDateObj.selectedDate;
dateReason = selectDateObj.reason;
}
else {
selectDate = selectDateObj;
}
if (selectDate) {
selectDate = new Date(selectDate);
}
else {
selectDate = null;
}
this.onChange(selectDate); // 这行代码能触发ngModel绑定的变量值发生变化
this.selectedDateChange.emit({
reason: dateReason,
selectedDate: this.selectedDate
});
}
/**
* @param {?} $event
* @return {?}
*/
onBlur($event) {
this.onTouched();
}
/**
* @param {?} $event
* @return {?}
*/
onDocumentClick($event) {
if (this.elementRef.nativeElement !== $event.target && !this.clickShow) {
this.isOpen = false;
}
else {
this.clickShow = false;
}
}
/**
* @param {?} position
* @return {?}
*/
onPositionChange(position) {
switch (position.connectionPair.overlayY) {
case 'top':
case 'center':
this.datepickerPosition = 'bottom';
break;
case 'bottom':
this.datepickerPosition = 'top';
}
}
/**
* @return {?}
*/
setPositions() {
if (this.appendToBodyDirections && this.appendToBodyDirections.length > 0) {
this.positions = this.appendToBodyDirections.map((/**
* @param {?} position
* @return {?}
*/
position => {
if (typeof position === 'string') {
return AppendToBodyDirectionsConfig[position];
}
else {
return position;
}
})).filter((/**
* @param {?} position
* @return {?}
*/
position => position !== undefined));
}
else {
this.positions = undefined;
}
}
/**
* @private
* @param {?} event
* @return {?}
*/
transUserInputToDatepicker(event) {
if (!this.showTime && !this.disabled) {
/** @type {?} */
const value = event.target.value;
/** @type {?} */
const valueDate = new Date(value);
/** @type {?} */
const valueFormat = this.dateConverter.format(valueDate, this.dateFormat, this.locale || this.i18nLocale);
if (value && value === valueFormat) {
if (valueDate.getTime() < this.minDate.getTime() || valueDate.getTime() > this.maxDate.getTime()) {
this.writeValue(this.selectedDate);
}
else {
this.selectedDate = new Date(value);
this.writeModelValue(value);
}
}
else if (!value) {
this.writeValue(null);
}
}
else {
this.writeValue(this.selectedDate);
}
}
/**
* @return {?}
*/
ngOnDestroy() {
if (this.inputSub) {
this.inputSub.unsubscribe();
}
if (this.i18nSubscription) {
this.i18nSubscription.unsubscribe();
}
}
}
DatePickerAppendToBodyComponent.decorators = [
{ type: Component, args: [{
selector: '[dDatepicker][appendToBody]',
providers: [{
provide: NG_VALUE_ACCESSOR,
useExisting: forwardRef((/**
* @return {?}
*/
() => DatePickerAppendToBodyComponent)),
multi: true
}],
exportAs: 'datepicker',
template: `
<ng-template cdk-connected-overlay
[cdkConnectedOverlayOrigin]="cdkConnectedOverlayOrigin"
[cdkConnectedOverlayPositions]="positions"
[cdkConnectedOverlayOpen]="isOpen"
(backdropClick)="isOpen=false"
(positionChange)="onPositionChange($event)">
<d-datepicker []="isOpen ? datepickerPosition : 'void'" [locale]="locale || i18nLocale"
[showTime]="showTime" [cssClass]="cssClass" [selectedDate]="selectedDate"
[disabled]="disabled" [dateConverter]="dateConverter" (selectedDateChange)="timeChange($event)"
[yearNumber]="yearNumber" [dateFormat]="dateFormat" [dateConfig]="dateConfig"
[customViewTemplate]="customViewTemplate" [maxDate]="maxDate"
[minDate]="minDate" class="devui-datepicker"></d-datepicker>
</ng-template>
`,
animations: [
cornerFadeInOut
],
styles: [".devui-datepicker{-webkit-transform:perspective(1px) translate3d(0,0,0);transform:perspective(1px) translate3d(0,0,0)}"]
}] }
];
/** @nocollapse */
DatePickerAppendToBodyComponent.ctorParameters = () => [
{ type: ElementRef },
{ type: ViewContainerRef },
{ type: Renderer2 },
{ type: DatePickerConfig },
{ type: I18nService }
];
DatePickerAppendToBodyComponent.propDecorators = {
locale: [{ type: Input }],
showTime: [{ type: Input }],
cssClass: [{ type: Input }],
disabled: [{ type: Input }],
dateConverter: [{ type: Input }],
yearNumber: [{ type: Input }],
customViewTemplate: [{ type: Input }],
autoOpen: [{ type: Input }],
selectedDateChange: [{ type: Output }],
dateConfig: [{ type: Input }],
dateFormat: [{ type: Input }],
maxDate: [{ type: Input }],
minDate: [{ type: Input }],
appendToBodyDirections: [{ type: Input }],
onBlur: [{ type: HostListener, args: ['blur', ['$event'],] }],
onDocumentClick: [{ type: HostListener, args: ['document:click', ['$event'],] }]
};
if (false) {
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.locale;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.showTime;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.cssClass;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.disabled;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.dateConverter;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.yearNumber;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.customViewTemplate;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.autoOpen;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.selectedDateChange;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.selectedDate;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.isOpen;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype._dateConfig;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.positions;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.datepickerPosition;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype._dateFormat;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype._maxDate;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype._minDate;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.clickShow;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.inputSub;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.i18nSubscription;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.i18nLocale;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.cdkConnectedOverlayOrigin;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.appendToBodyDirections;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.onChange;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.onTouched;
/** @type {?} */
DatePickerAppendToBodyComponent.prototype.clearAll;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.elementRef;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.viewContainerRef;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.renderer2;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.datePickerConfig;
/**
* @type {?}
* @private
*/
DatePickerAppendToBodyComponent.prototype.i18n;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXBpY2tlci1jZGstb3ZlcmxheS5jb21wb25lbnQuanMiLCJzb3VyY2VSb290Ijoibmc6Ly9uZy1kZXZ1aS9kYXRlcGlja2VyLyIsInNvdXJjZXMiOlsiZGF0ZXBpY2tlci1jZGstb3ZlcmxheS5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDekUsT0FBTyxFQUNMLFNBQVMsRUFDVCxVQUFVLEVBRVYsS0FBSyxFQUNMLFdBQVcsRUFDWCxNQUFNLEVBQ04sWUFBWSxFQUNaLFVBQVUsRUFDVixnQkFBZ0IsRUFDaEIsU0FBUyxFQUNULFlBQVksRUFJYixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQUUsZ0JBQWdCLEVBQTRFLE1BQU0sc0JBQXNCLENBQUM7QUFFbEksT0FBTyxFQUF5Qiw0QkFBNEIsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBRXJGLE9BQU8sRUFBNkIsc0JBQXNCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQztBQUNuRyxPQUFPLEVBQUUsdUJBQXVCLElBQUksZ0JBQWdCLEVBQUUsTUFBTSw4QkFBOEIsQ0FBQztBQUMzRixPQUFPLEVBQUUsV0FBVyxFQUFpQixNQUFNLGVBQWUsQ0FBQztBQUMzRCxPQUFPLEVBQUUsb0JBQW9CLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUN0RCxPQUFPLEVBQUUsZUFBZSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDakQsT0FBTyxFQUFFLFNBQVMsRUFBZ0IsTUFBTSxNQUFNLENBQUM7QUFDL0MsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBOEI5QyxNQUFNLE9BQU8sK0JBQStCOzs7Ozs7OztJQTZFMUMsWUFBb0IsVUFBc0IsRUFBVSxnQkFBa0MsRUFDbEUsU0FBb0IsRUFBVSxnQkFBa0MsRUFBVSxJQUFpQjtRQUQzRixlQUFVLEdBQVYsVUFBVSxDQUFZO1FBQVUscUJBQWdC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QUNMLEtBQUs7NEJBQ0wsS0FBSzt5QkFDTCxLQUFLO2lDQUNMLEtBQUs7dUJBQ0wsS0FBSztpQ0FDTCxNQUFNO3lCQWVOLEtBQUs7eUJBYUwsS0FBSztzQkFXTCxLQUFLO3NCQVVMLEtBQUs7cUNBWUwsS0FBSztxQkEyR0wsWUFBWSxTQUFDLE1BQU0sRUFBRSxDQUFDLFFBQVEsQ0FBQzs4QkFLL0IsWUFBWSxTQUFDLGdCQUFnQixFQUFFLENBQUMsUUFBUSxDQUFDOzs7O0lBckwxQyxpREFBd0I7O0lBQ3hCLG1EQUEyQjs7SUFDM0IsbURBQTBCOztJQUMxQixtREFBMkI7O0lBQzNCLHdEQUFzQzs7SUFDdEMscURBQXlCOztJQUN6Qiw2REFBOEM7O0lBQzlDLG1EQUEwQjs7SUFDMUIsNkRBQTZFOztJQUM3RSx1REFBbUI7O0lBQ25CLGlEQUFlOztJQUNmLHNEQUFpQjs7SUFDakIsb0RBQStCOztJQUMvQiw2REFBcUQ7Ozs7O0lBQ3JELHNEQUE0Qjs7Ozs7SUFDNUIsbURBQXVCOzs7OztJQUN2QixtREFBdUI7Ozs7O0lBQ3ZCLG9EQUEwQjs7Ozs7SUFDMUIsbURBQStCOzs7OztJQUMvQiwyREFBdUM7O0lBQ3ZDLHFEQUEyQzs7SUErQzNDLG9FQUFzQzs7SUFFdEMsaUVBRUU7Ozs7O0lBRUYsbURBQW9DOzs7OztJQUNwQyxvREFBK0I7O0lBaUsvQixtREFFQzs7Ozs7SUFqS1cscURBQThCOzs7OztJQUFFLDJEQUEwQzs7Ozs7SUFDMUUsb0RBQTRCOzs7OztJQUFFLDJEQUEwQzs7Ozs7SUFBRSwrQ0FBeUIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBDb250cm9sVmFsdWVBY2Nlc3NvciwgTkdfVkFMVUVfQUNDRVNTT1IgfSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XHJcbmltcG9ydCB7XHJcbiAgQ29tcG9uZW50LFxyXG4gIGZvcndhcmRSZWYsXHJcbiAgT25Jbml0LFxyXG4gIElucHV0LFxyXG4gIFRlbXBsYXRlUmVmLFxyXG4gIE91dHB1dCxcclxuICBFdmVudEVtaXR0ZXIsXHJcbiAgRWxlbWVudFJlZixcclxuICBWaWV3Q29udGFpbmVyUmVmLFxyXG4gIFJlbmRlcmVyMixcclxuICBIb3N0TGlzdGVuZXIsXHJcbiAgT25DaGFuZ2VzLFxyXG4gIFNpbXBsZUNoYW5nZXMsXHJcbiAgT25EZXN0cm95XHJcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XHJcbmltcG9ydCB7IENka092ZXJsYXlPcmlnaW4sIENvbm5lY3RlZFBvc2l0aW9uLCBDb25uZWN0ZWRPdmVybGF5UG9zaXRpb25DaGFuZ2UsIFZlcnRpY2FsQ29ubmVjdGlvblBvcyB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9vdmVybGF5JztcclxuXHJcbmltcG9ydCB7IEFwcGVuZFRvQm9keURpcmVjdGlvbiwgQXBwZW5kVG9Cb2R5RGlyZWN0aW9uc0NvbmZpZyB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgRGF0ZUNvbnZlcnRlciB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgU2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncywgU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbiB9IGZyb20gJy4vZGF0ZS1jaGFuZ2UtZXZlbnQtYXJncy5tb2RlbCc7XHJcbmltcG9ydCB7IERhdGVQaWNrZXJDb25maWdTZXJ2aWNlIGFzIERhdGVQaWNrZXJDb25maWcgfSBmcm9tICcuL2RhdGUtcGlja2VyLmNvbmZpZy5zZXJ2aWNlJztcclxuaW1wb3J0IHsgSTE4blNlcnZpY2UsIEkxOG5JbnRlcmZhY2UgfSBmcm9tICduZy1kZXZ1aS9pMThuJztcclxuaW1wb3J0IHsgRGVmYXVsdERhdGVDb252ZXJ0ZXIgfSBmcm9tICduZy1kZXZ1aS91dGlscyc7XHJcbmltcG9ydCB7IGNvcm5lckZhZGVJbk91dCB9IGZyb20gJ25nLWRldnVpL3V0aWxzJztcclxuaW1wb3J0IHsgZnJvbUV2ZW50LCBTdWJzY3JpcHRpb24gfSBmcm9tICdyeGpzJztcclxuaW1wb3J0IHsgZGVib3VuY2VUaW1lIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xyXG5cclxuQENvbXBvbmVudCh7XHJcbiAgc2VsZWN0b3I6ICdbZERhdGVwaWNrZXJdW2FwcGVuZFRvQm9keV0nLFxyXG4gIHByb3ZpZGVyczogW3tcclxuICAgIHByb3ZpZGU6IE5HX1ZBTFVFX0FDQ0VTU09SLFxyXG4gICAgdXNlRXhpc3Rpbmc6IGZvcndhcmRSZWYoKCkgPT4gRGF0ZVBpY2tlckFwcGVuZFRvQm9keUNvbXBvbmVudCksXHJcbiAgICBtdWx0aTogdHJ1ZVxyXG4gIH1dLFxyXG4gIGV4cG9ydEFzOiAnZGF0ZXBpY2tlcicsXHJcbiAgdGVtcGxhdGU6IGBcclxuICAgIDxuZy10ZW1wbGF0ZSBjZGstY29ubmVjdGVkLW92ZXJsYXlcclxuICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbl09XCJjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luXCJcclxuICAgICAgICAgICAgICAgICBbY2RrQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uc109XCJwb3NpdGlvbnNcIlxyXG4gICAgICAgICAgICAgICAgIFtjZGtDb25uZWN0ZWRPdmVybGF5T3Blbl09XCJpc09wZW5cIlxyXG4gICAgICAgICAgICAgICAgIChiYWNrZHJvcENsaWNrKT1cImlzT3Blbj1mYWxzZVwiXHJcbiAgICAgICAgICAgICAgICAgKHBvc2l0aW9uQ2hhbmdlKT1cIm9uUG9zaXRpb25DaGFuZ2UoJGV2ZW50KVwiPlxyXG4gICAgICA8ZC1kYXRlcGlja2VyIFtAY29ybmVyRmFkZUluT3V0XT1cImlzT3BlbiA/IGRhdGVwaWNrZXJQb3NpdGlvbiA6ICd2b2lkJ1wiIFtsb2NhbGVdPVwibG9jYWxlIHx8IGkxOG5Mb2NhbGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW3Nob3dUaW1lXT1cInNob3dUaW1lXCIgW2Nzc0NsYXNzXT1cImNzc0NsYXNzXCIgW3NlbGVjdGVkRGF0ZV09XCJzZWxlY3RlZERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCIgW2RhdGVDb252ZXJ0ZXJdPVwiZGF0ZUNvbnZlcnRlclwiIChzZWxlY3RlZERhdGVDaGFuZ2UpPVwidGltZUNoYW5nZSgkZXZlbnQpXCJcclxuICAgICAgICAgICAgICAgICAgICAgIFt5ZWFyTnVtYmVyXT1cInllYXJOdW1iZXJcIiBbZGF0ZUZvcm1hdF09XCJkYXRlRm9ybWF0XCIgW2RhdGVDb25maWddPVwiZGF0ZUNvbmZpZ1wiXHJcbiAgICAgICAgICAgICAgICAgICAgICBbY3VzdG9tVmlld1RlbXBsYXRlXT1cImN1c3RvbVZpZXdUZW1wbGF0ZVwiIFttYXhEYXRlXT1cIm1heERhdGVcIlxyXG4gICAgICAgICAgICAgICAgICAgICAgW21pbkRhdGVdPVwibWluRGF0ZVwiIGNsYXNzPVwiZGV2dWktZGF0ZXBpY2tlclwiPjwvZC1kYXRlcGlja2VyPlxyXG4gICAgPC9uZy10ZW1wbGF0ZT5cclxuICBgLFxyXG4gIGFuaW1hdGlvbnM6IFtcclxuICAgIGNvcm5lckZhZGVJbk91dFxyXG4gIF0sXHJcbiAgc3R5bGVVcmxzOiBbJy4vZGF0ZXBpY2tlci1jZGstb3ZlcmxheS5jb21wb25lbnQuc2NzcyddXHJcbn0pXHJcbmV4cG9ydCBjbGFzcyBEYXRlUGlja2VyQXBwZW5kVG9Cb2R5Q29tcG9uZW50IGltcGxlbWVudHMgT25Jbml0LCBPbkNoYW5nZXMsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3Ige1xyXG4gIEBJbnB1dCgpIGxvY2FsZTogc3RyaW5nO1xyXG4gIEBJbnB1dCgpIHNob3dUaW1lOiBib29sZWFuO1xyXG4gIEBJbnB1dCgpIGNzc0NsYXNzOiBzdHJpbmc7XHJcbiAgQElucHV0KCkgZGlzYWJsZWQ6IGJvb2xlYW47XHJcbiAgQElucHV0KCkgZGF0ZUNvbnZlcnRlcjogRGF0ZUNvbnZlcnRlcjtcclxuICBASW5wdXQoKSB5ZWFyTnVtYmVyID0gMTI7XHJcbiAgQElucHV0KCkgY3VzdG9tVmlld1RlbXBsYXRlOiBUZW1wbGF0ZVJlZjxhbnk+O1xyXG4gIEBJbnB1dCgpIGF1dG9PcGVuID0gZmFsc2U7XHJcbiAgQE91dHB1dCgpIHNlbGVjdGVkRGF0ZUNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8U2VsZWN0RGF0ZUNoYW5nZUV2ZW50QXJncz4oKTtcclxuICBzZWxlY3RlZERhdGU6IERhdGU7XHJcbiAgaXNPcGVuID0gZmFsc2U7XHJcbiAgX2RhdGVDb25maWc6IGFueTtcclxuICBwb3NpdGlvbnM6IENvbm5lY3RlZFBvc2l0aW9uW107XHJcbiAgZGF0ZXBpY2tlclBvc2l0aW9uOiBWZXJ0aWNhbENvbm5lY3Rpb25Qb3MgPSAnYm90dG9tJztcclxuICBwcml2YXRlIF9kYXRlRm9ybWF0OiBzdHJpbmc7XHJcbiAgcHJpdmF0ZSBfbWF4RGF0ZTogRGF0ZTtcclxuICBwcml2YXRlIF9taW5EYXRlOiBEYXRlO1xyXG4gIHByaXZhdGUgY2xpY2tTaG93ID0gZmFsc2U7XHJcbiAgcHJpdmF0ZSBpbnB1dFN1YjogU3Vic2NyaXB0aW9uO1xyXG4gIHByaXZhdGUgaTE4blN1YnNjcmlwdGlvbjogU3Vic2NyaXB0aW9uO1xyXG4gIHB1YmxpYyBpMThuTG9jYWxlOiBJMThuSW50ZXJmYWNlWydsb2NhbGUnXTtcclxuXHJcblxyXG4gIEBJbnB1dCgpIHNldCBkYXRlQ29uZmlnKGRhdGVDb25maWc6IGFueSkge1xyXG4gICAgaWYgKGRhdGVDb25maWcpIHtcclxuICAgICAgdGhpcy5fZGF0ZUNvbmZpZyA9IGRhdGVDb25maWc7XHJcbiAgICAgIHRoaXMuX2RhdGVGb3JtYXQgPSB0aGlzLnNob3dUaW1lID8gZGF0ZUNvbmZpZy5mb3JtYXQudGltZSA6IGRhdGVDb25maWcuZm9ybWF0LmRhdGU7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLl9kYXRlQ29uZmlnID0gdGhpcy5kYXRlUGlja2VyQ29uZmlnLmRhdGVDb25maWc7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBnZXQgZGF0ZUNvbmZpZygpIHtcclxuICAgIHJldHVybiB0aGlzLl9kYXRlQ29uZmlnO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IGRhdGVGb3JtYXQoZGF0ZUZvcm1hdDogc3RyaW5nKSB7XHJcbiAgICBpZiAodGhpcy5fZGF0ZUZvcm1hdCAhPT0gZGF0ZUZvcm1hdCkge1xyXG4gICAgICB0aGlzLl9kYXRlRm9ybWF0ID0gZGF0ZUZvcm1hdDtcclxuICAgICAgdGhpcy53cml0ZU1vZGVsVmFsdWUoe3NlbGVjdGVkRGF0ZTogdGhpcy5zZWxlY3RlZERhdGUsIHJlYXNvbjogU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi5mb3JtYXR9KTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGdldCBkYXRlRm9ybWF0KCkge1xyXG4gICAgcmV0dXJuIHRoaXMuX2RhdGVGb3JtYXQ7XHJcbiAgfVxyXG5cclxuICBASW5wdXQoKSBzZXQgbWF4RGF0ZShkYXRlOiBEYXRlIHwgYW55KSB7XHJcbiAgICBjb25zdCBwYXJzZURhdGUgPSB0aGlzLmRhdGVDb252ZXJ0ZXIucGFyc2UoZGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpO1xyXG4gICAgaWYgKHBhcnNlRGF0ZSkge1xyXG4gICAgICB0aGlzLl9tYXhEYXRlID0gcGFyc2VEYXRlO1xyXG4gICAgfVxyXG4gIH1cclxuICBnZXQgbWF4RGF0ZSgpIHtcclxuICAgIHJldHVybiB0aGlzLl9tYXhEYXRlO1xyXG4gIH1cclxuXHJcbiAgQElucHV0KCkgc2V0IG1pbkRhdGUoZGF0ZTogRGF0ZSB8IGFueSkge1xyXG4gICAgY29uc3QgcGFyc2VEYXRlID0gdGhpcy5kYXRlQ29udmVydGVyLnBhcnNlKGRhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKTtcclxuICAgIGlmIChwYXJzZURhdGUpIHtcclxuICAgICAgdGhpcy5fbWluRGF0ZSA9IHBhcnNlRGF0ZTtcclxuICAgIH1cclxuICB9XHJcbiAgZ2V0IG1pbkRhdGUoKSB7XHJcbiAgICByZXR1cm4gdGhpcy5fbWluRGF0ZTtcclxuICB9XHJcblxyXG4gIHB1YmxpYyBjZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luOiBhbnk7XHJcblxyXG4gIEBJbnB1dCgpIGFwcGVuZFRvQm9keURpcmVjdGlvbnM6IEFycmF5PEFwcGVuZFRvQm9keURpcmVjdGlvbiB8IENvbm5lY3RlZFBvc2l0aW9uPiA9IFtcclxuICAgICdyaWdodERvd24nLCAnbGVmdERvd24nLCAncmlnaHRVcCcsICdsZWZ0VXAnXHJcbiAgXTtcclxuXHJcbiAgcHJpdmF0ZSBvbkNoYW5nZSA9IChfOiBhbnkpID0+IG51bGw7XHJcbiAgcHJpdmF0ZSBvblRvdWNoZWQgPSAoKSA9PiBudWxsO1xyXG5cclxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsZW1lbnRSZWY6IEVsZW1lbnRSZWYsIHByaXZhdGUgdmlld0NvbnRhaW5lclJlZjogVmlld0NvbnRhaW5lclJlZixcclxuICAgICAgICAgICAgICBwcml2YXRlIHJlbmRlcmVyMjogUmVuZGVyZXIyLCBwcml2YXRlIGRhdGVQaWNrZXJDb25maWc6IERhdGVQaWNrZXJDb25maWcsIHByaXZhdGUgaTE4bjogSTE4blNlcnZpY2UpIHtcclxuICAgIHRoaXMuX2RhdGVDb25maWcgPSBkYXRlUGlja2VyQ29uZmlnWydkYXRlQ29uZmlnJ107XHJcbiAgICB0aGlzLmRhdGVDb252ZXJ0ZXIgPSBkYXRlUGlja2VyQ29uZmlnWydkYXRlQ29uZmlnJ10uZGF0ZUNvbnZlcnRlciB8fCBuZXcgRGVmYXVsdERhdGVDb252ZXJ0ZXIoKTtcclxuXHJcblxyXG4gICAgdGhpcy5pbnB1dFN1YiA9IGZyb21FdmVudCh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ2lucHV0JylcclxuICAgICAucGlwZShcclxuICAgICAgZGVib3VuY2VUaW1lKDMwMClcclxuICAgICApLnN1YnNjcmliZShldmVudCA9PiB7XHJcbiAgICAgICAgdGhpcy50cmFuc1VzZXJJbnB1dFRvRGF0ZXBpY2tlcihldmVudCk7XHJcbiAgICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgbmdPbkluaXQoKSB7XHJcbiAgICB0aGlzLnNob3dUaW1lID0gdGhpcy5zaG93VGltZSB8fCB0aGlzLmRhdGVDb25maWcudGltZVBpY2tlcjtcclxuICAgIHRoaXMuX21pbkRhdGUgPSB0aGlzLm1pbkRhdGUgPyBuZXcgRGF0ZSh0aGlzLm1pbkRhdGUpIDogbmV3IERhdGUodGhpcy5kYXRlQ29uZmlnLm1pbiwgMCwgMSwgMCwgMCwgMCk7XHJcbiAgICB0aGlzLl9tYXhEYXRlID0gdGhpcy5tYXhEYXRlID8gbmV3IERhdGUodGhpcy5tYXhEYXRlKSA6IG5ldyBEYXRlKHRoaXMuZGF0ZUNvbmZpZy5tYXgsIDExLCAzMSwgMjMsIDU5LCA1OSk7XHJcbiAgICB0aGlzLnNldFBvc2l0aW9ucygpO1xyXG4gICAgdGhpcy5zZXRJMThuVGV4dCgpO1xyXG4gICAgdGhpcy51cGRhdGVDZGtDb25uZWN0ZWRPdmVybGF5T3JpZ2luKCk7XHJcbiAgICBpZiAodGhpcy5hdXRvT3Blbikge1xyXG4gICAgICB0aGlzLmlzT3BlbiA9IHRydWU7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XHJcbiAgICBpZiAoY2hhbmdlc1snYXBwZW5kVG9Cb2R5RGlyZWN0aW9ucyddKSB7XHJcbiAgICAgIHRoaXMuc2V0UG9zaXRpb25zKCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICByZWdpc3Rlck9uQ2hhbmdlKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25DaGFuZ2UgPSBmbjtcclxuICB9XHJcblxyXG4gIHJlZ2lzdGVyT25Ub3VjaGVkKGZuOiBhbnkpOiB2b2lkIHtcclxuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XHJcbiAgfVxyXG5cclxuICB3cml0ZVZhbHVlKG9iajogYW55KTogdm9pZCB7XHJcbiAgICB0aGlzLnNlbGVjdGVkRGF0ZSA9IG9iaiA/XHJcbiAgICAgIHRoaXMuZGF0ZUNvbnZlcnRlci5wYXJzZShvYmosIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKSA6IG51bGw7XHJcbiAgICBjb25zdCB2YWx1ZSA9XHJcbiAgICAgIHRoaXMuc2VsZWN0ZWREYXRlID8gdGhpcy5kYXRlQ29udmVydGVyLmZvcm1hdCh0aGlzLnNlbGVjdGVkRGF0ZSwgdGhpcy5kYXRlRm9ybWF0LCB0aGlzLmxvY2FsZSB8fCB0aGlzLmkxOG5Mb2NhbGUpIDogJyc7XHJcbiAgICB0aGlzLnJlbmRlcmVyMi5zZXRQcm9wZXJ0eSh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCwgJ3ZhbHVlJywgdmFsdWUpO1xyXG4gIH1cclxuXHJcbiAgc2V0STE4blRleHQoKSB7XHJcbiAgICB0aGlzLmkxOG5Mb2NhbGUgPSB0aGlzLmkxOG4uZ2V0STE4blRleHQoKS5sb2NhbGU7XHJcbiAgICB0aGlzLmkxOG5TdWJzY3JpcHRpb24gPSB0aGlzLmkxOG4ubGFuZ0NoYW5nZSgpLnN1YnNjcmliZSgoZGF0YSkgPT4ge1xyXG4gICAgICB0aGlzLmkxOG5Mb2NhbGUgPSBkYXRhLmxvY2FsZTtcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgdGltZUNoYW5nZShkYXRhKSB7XHJcbiAgICB0aGlzLndyaXRlVmFsdWUoZGF0YVsnc2VsZWN0ZWREYXRlJ10pO1xyXG4gICAgdGhpcy53cml0ZU1vZGVsVmFsdWUoZGF0YSk7XHJcbiAgICBpZiAoZGF0YVsncmVhc29uJ10gPT09IFNlbGVjdERhdGVDaGFuZ2VSZWFzb24uZGF0ZSAmJiAhdGhpcy5zaG93VGltZSB8fFxyXG4gICAgIGRhdGFbJ3JlYXNvbiddID09PSBTZWxlY3REYXRlQ2hhbmdlUmVhc29uLmJ1dHRvbikge1xyXG4gICAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdXBkYXRlQ2RrQ29ubmVjdGVkT3ZlcmxheU9yaWdpbigpIHtcclxuICAgIGlmICh0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCkge1xyXG4gICAgICB0aGlzLmNka0Nvbm5lY3RlZE92ZXJsYXlPcmlnaW4gPSBuZXcgQ2RrT3ZlcmxheU9yaWdpbih0aGlzLmVsZW1lbnRSZWYubmF0aXZlRWxlbWVudCk7XHJcbiAgICB9XHJcbiAgfVxyXG5cclxuICB0b2dnbGUoJGV2ZW50OiBFdmVudCwgY2xpY2tTaG93PzogYm9vbGVhbikge1xyXG4gICAgdGhpcy5pc09wZW4gPSAhdGhpcy5pc09wZW47XHJcbiAgICB0aGlzLmNsaWNrU2hvdyA9IGNsaWNrU2hvdztcclxuICB9XHJcblxyXG4gIGhpZGUoKSB7XHJcbiAgICB0aGlzLmlzT3BlbiA9IGZhbHNlO1xyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB3cml0ZU1vZGVsVmFsdWUoc2VsZWN0RGF0ZU9iajogYW55KSB7XHJcbiAgICBsZXQgc2VsZWN0RGF0ZTtcclxuICAgIGxldCBkYXRlUmVhc29uID0gU2VsZWN0RGF0ZUNoYW5nZVJlYXNvbi50aW1lO1xyXG4gICAgaWYgKHNlbGVjdERhdGVPYmogJiYgdHlwZW9mIHNlbGVjdERhdGVPYmogPT09ICdvYmplY3QnICYmIHNlbGVjdERhdGVPYmouaGFzT3duUHJvcGVydHkoJ3NlbGVjdGVkRGF0ZScpKSB7XHJcbiAgICAgIHNlbGVjdERhdGUgPSBzZWxlY3REYXRlT2JqLnNlbGVjdGVkRGF0ZTtcclxuICAgICAgZGF0ZVJlYXNvbiA9IHNlbGVjdERhdGVPYmoucmVhc29uO1xyXG4gICAgfSBlbHNlIHtcclxuICAgICAgc2VsZWN0RGF0ZSA9IHNlbGVjdERhdGVPYmo7XHJcbiAgICB9XHJcbiAgICBpZiAoc2VsZWN0RGF0ZSkge1xyXG4gICAgICBzZWxlY3REYXRlID0gbmV3IERhdGUoc2VsZWN0RGF0ZSk7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICBzZWxlY3REYXRlID0gbnVsbDtcclxuICAgIH1cclxuICAgIHRoaXMub25DaGFuZ2Uoc2VsZWN0RGF0ZSk7IC8vIOi/meihjOS7o+eggeiDveinpuWPkW5nTW9kZWznu5HlrprnmoTlj5jph4/lgLzlj5HnlJ/lj5jljJZcclxuICAgIHRoaXMuc2VsZWN0ZWREYXRlQ2hhbmdlLmVtaXQoe1xyXG4gICAgICByZWFzb246IGRhdGVSZWFzb24sXHJcbiAgICAgIHNlbGVjdGVkRGF0ZTogdGhpcy5zZWxlY3RlZERhdGVcclxuICAgIH0pO1xyXG4gIH1cclxuXHJcbiAgQEhvc3RMaXN0ZW5lcignYmx1cicsIFsnJGV2ZW50J10pXHJcbiAgb25CbHVyKCRldmVudCkge1xyXG4gICAgdGhpcy5vblRvdWNoZWQoKTtcclxuICB9XHJcblxyXG4gIEBIb3N0TGlzdGVuZXIoJ2RvY3VtZW50OmNsaWNrJywgWyckZXZlbnQnXSlcclxuICBvbkRvY3VtZW50Q2xpY2soJGV2ZW50KSB7XHJcbiAgICBpZiAodGhpcy5lbGVtZW50UmVmLm5hdGl2ZUVsZW1lbnQgIT09ICRldmVudC50YXJnZXQgJiYgIXRoaXMuY2xpY2tTaG93KSB7XHJcbiAgICAgIHRoaXMuaXNPcGVuID0gZmFsc2U7XHJcbiAgICB9IGVsc2Uge1xyXG4gICAgICB0aGlzLmNsaWNrU2hvdyA9IGZhbHNlO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgb25Qb3NpdGlvbkNoYW5nZShwb3NpdGlvbjogQ29ubmVjdGVkT3ZlcmxheVBvc2l0aW9uQ2hhbmdlKSB7XHJcbiAgICBzd2l0Y2ggKHBvc2l0aW9uLmNvbm5lY3Rpb25QYWlyLm92ZXJsYXlZKSB7XHJcbiAgICAgIGNhc2UgJ3RvcCc6XHJcbiAgICAgIGNhc2UgJ2NlbnRlcic6XHJcbiAgICAgICAgdGhpcy5kYXRlcGlja2VyUG9zaXRpb24gPSAnYm90dG9tJztcclxuICAgICAgICBicmVhaztcclxuICAgICAgY2FzZSAnYm90dG9tJzpcclxuICAgICAgICB0aGlzLmRhdGVwaWNrZXJQb3NpdGlvbiA9ICd0b3AnO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgc2V0UG9zaXRpb25zKCkge1xyXG4gICAgaWYgKHRoaXMuYXBwZW5kVG9Cb2R5RGlyZWN0aW9ucyAmJiB0aGlzLmFwcGVuZFRvQm9keURpcmVjdGlvbnMubGVuZ3RoID4gMCkge1xyXG4gICAgICB0aGlzLnBvc2l0aW9ucyA9IHRoaXMuYXBwZW5kVG9Cb2R5RGlyZWN0aW9ucy5tYXAocG9zaXRpb24gPT4ge1xyXG4gICAgICAgIGlmICh0eXBlb2YgcG9zaXRpb24gPT09ICdzdHJpbmcnKSB7XHJcbiAgICAgICAgICByZXR1cm4gQXBwZW5kVG9Cb2R5RGlyZWN0aW9uc0NvbmZpZ1twb3NpdGlvbl07XHJcbiAgICAgICAgfSBlbHNlIHtcclxuICAgICAgICAgIHJldHVybiBwb3NpdGlvbjtcclxuICAgICAgICB9XHJcbiAgICAgIH0pLmZpbHRlcihwb3NpdGlvbiA9PiBwb3NpdGlvbiAhPT0gdW5kZWZpbmVkKTtcclxuICAgIH0gZWxzZSB7XHJcbiAgICAgIHRoaXMucG9zaXRpb25zID0gdW5kZWZpbmVkO1xyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgcHJpdmF0ZSB0cmFuc1VzZXJJbnB1dFRvRGF0ZXBpY2tlcihldmVudCkge1xyXG4gICAgaWYgKCF0aGlzLnNob3dUaW1lICYmICF0aGlzLmRpc2FibGVkKSB7XHJcbiAgICAgIGNvbnN0IHZhbHVlID0gZXZlbnQudGFyZ2V0LnZhbHVlO1xyXG4gICAgICBjb25zdCB2YWx1ZURhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgIGNvbnN0IHZhbHVlRm9ybWF0ID0gdGhpcy5kYXRlQ29udmVydGVyLmZvcm1hdCh2YWx1ZURhdGUsIHRoaXMuZGF0ZUZvcm1hdCwgdGhpcy5sb2NhbGUgfHwgdGhpcy5pMThuTG9jYWxlKTtcclxuICAgICAgaWYgKHZhbHVlICYmIHZhbHVlID09PSB2YWx1ZUZvcm1hdCkge1xyXG4gICAgICAgIGlmICh2YWx1ZURhdGUuZ2V0VGltZSgpIDwgdGhpcy5taW5EYXRlLmdldFRpbWUoKSB8fCB2YWx1ZURhdGUuZ2V0VGltZSgpID4gdGhpcy5tYXhEYXRlLmdldFRpbWUoKSkge1xyXG4gICAgICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgICAgICB9IGVsc2Uge1xyXG4gICAgICAgICAgdGhpcy5zZWxlY3RlZERhdGUgPSBuZXcgRGF0ZSh2YWx1ZSk7XHJcbiAgICAgICAgICB0aGlzLndyaXRlTW9kZWxWYWx1ZSh2YWx1ZSk7XHJcbiAgICAgICAgfVxyXG4gICAgICB9IGVsc2UgaWYgKCF2YWx1ZSkge1xyXG4gICAgICAgIHRoaXMud3JpdGVWYWx1ZShudWxsKTtcclxuICAgICAgfVxyXG4gICAgfSBlbHNlIHtcclxuICAgICAgdGhpcy53cml0ZVZhbHVlKHRoaXMuc2VsZWN0ZWREYXRlKTtcclxuICAgIH1cclxuICB9XHJcblxyXG4gIGNsZWFyQWxsID0gKCkgPT4ge1xyXG4gICAgdGhpcy53cml0ZVZhbHVlKG51bGwpO1xyXG4gIH1cclxuXHJcbiAgbmdPbkRlc3Ryb3koKSB7XHJcbiAgICBpZiAodGhpcy5pbnB1dFN1Yikge1xyXG4gICAgICB0aGlzLmlucHV0U3ViLnVuc3Vic2NyaWJlKCk7XHJcbiAgICB9XHJcbiAgICBpZiAodGhpcy5pMThuU3Vic2NyaXB0aW9uKSB7XHJcbiAgICAgIHRoaXMuaTE4blN1YnNjcmlwdGlvbi51bnN1YnNjcmliZSgpO1xyXG4gICAgfVxyXG4gIH1cclxufVxyXG4iXX0=