UNPKG

ng-zorro-antd

Version:

An enterprise-class UI components based on Ant Design and Angular

318 lines (317 loc) 29.6 kB
/** * @fileoverview added by tsickle * Generated from: inner-popup.component.ts * @suppress {checkTypes,constantProperty,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ /** * @license * Copyright Alibaba.com 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://github.com/NG-ZORRO/ng-zorro-antd/blob/master/LICENSE */ import { ChangeDetectionStrategy, Component, EventEmitter, Input, Output, ViewEncapsulation } from '@angular/core'; import { CandyDate } from 'ng-zorro-antd/core/time'; import { PREFIX_CLASS } from './util'; export class InnerPopupComponent { constructor() { this.panelModeChange = new EventEmitter(); // TODO: name is not proper this.headerChange = new EventEmitter(); // Emitted when user changed the header's value // Emitted when user changed the header's value this.selectDate = new EventEmitter(); // Emitted when the date is selected by click the date panel // Emitted when the date is selected by click the date panel this.selectTime = new EventEmitter(); this.dayHover = new EventEmitter(); // Emitted when hover on a day by mouse enter // Emitted when hover on a day by mouse enter this.prefixCls = PREFIX_CLASS; } /** * Hide "next" arrow in left panel, * hide "prev" arrow in right panel * @param {?} direction * @param {?} panelMode * @return {?} */ enablePrevNext(direction, panelMode) { if (!this.showTimePicker && panelMode === this.endPanelMode && ((this.partType === 'left' && direction === 'next') || (this.partType === 'right' && direction === 'prev'))) { return false; } return true; } /** * @param {?} date * @return {?} */ onSelectTime(date) { this.selectTime.emit(new CandyDate(date)); } // The value real changed to outside /** * @param {?} date * @return {?} */ onSelectDate(date) { /** @type {?} */ const value = date instanceof CandyDate ? date : new CandyDate(date); /** @type {?} */ const timeValue = this.timeOptions && this.timeOptions.nzDefaultOpenValue; // Display timeValue when value is null if (!this.value && timeValue) { value.setHms(timeValue.getHours(), timeValue.getMinutes(), timeValue.getSeconds()); } this.selectDate.emit(value); } /** * @param {?} value * @return {?} */ onChooseMonth(value) { this.activeDate = this.activeDate.setMonth(value.getMonth()); if (this.endPanelMode === 'month') { this.value = value; this.selectDate.emit(value); } else { this.headerChange.emit(value); this.panelModeChange.emit(this.endPanelMode); } } /** * @param {?} value * @return {?} */ onChooseYear(value) { this.activeDate = this.activeDate.setYear(value.getYear()); if (this.endPanelMode === 'year') { this.value = value; this.selectDate.emit(value); } else { this.headerChange.emit(value); this.panelModeChange.emit(this.endPanelMode); } } /** * @param {?} value * @return {?} */ onChooseDecade(value) { this.activeDate = this.activeDate.setYear(value.getYear()); if (this.endPanelMode === 'decade') { this.value = value; this.selectDate.emit(value); } else { this.headerChange.emit(value); this.panelModeChange.emit('year'); } } /** * @param {?} changes * @return {?} */ ngOnChanges(changes) { if (changes.activeDate && !changes.activeDate.currentValue) { this.activeDate = new CandyDate(); } // New Antd vesion has merged 'date' ant 'time' to one panel, // So there is not 'time' panel if (changes.panelMode && changes.panelMode.currentValue === 'time') { this.panelMode = 'date'; } } } InnerPopupComponent.decorators = [ { type: Component, args: [{ encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, // tslint:disable-next-line:component-selector selector: 'inner-popup', exportAs: 'innerPopup', template: ` <div [class.ant-picker-datetime-panel]="showTimePicker"> <div class="{{ prefixCls }}-{{ panelMode }}-panel"> <ng-container [ngSwitch]="panelMode"> <ng-container *ngSwitchCase="'decade'"> <decade-header [(value)]="activeDate" [locale]="locale!" [showSuperPreBtn]="enablePrevNext('prev', 'decade')" [showSuperNextBtn]="enablePrevNext('next', 'decade')" [showNextBtn]="false" [showPreBtn]="false" (panelModeChange)="panelModeChange.emit($event)" (valueChange)="headerChange.emit($event)" > </decade-header> <div class="{{ prefixCls }}-body"> <decade-table [showWeek]="showWeek" [activeDate]="activeDate" [value]="value" (valueChange)="onChooseDecade($event)" [disabledDate]="disabledDate" [cellRender]="dateRender" ></decade-table> </div> </ng-container> <ng-container *ngSwitchCase="'year'"> <year-header [(value)]="activeDate" [locale]="locale!" [showSuperPreBtn]="enablePrevNext('prev', 'year')" [showSuperNextBtn]="enablePrevNext('next', 'year')" [showNextBtn]="false" [showPreBtn]="false" (panelModeChange)="panelModeChange.emit($event)" (valueChange)="headerChange.emit($event)" > </year-header> <div class="{{ prefixCls }}-body"> <year-table [showWeek]="showWeek" [activeDate]="activeDate" [value]="value" (valueChange)="onChooseYear($event)" [disabledDate]="disabledDate" [cellRender]="dateRender" ></year-table> </div> </ng-container> <ng-container *ngSwitchCase="'month'"> <month-header [(value)]="activeDate" [locale]="locale!" [showNextBtn]="false" [showPreBtn]="false" (panelModeChange)="panelModeChange.emit($event)" (valueChange)="headerChange.emit($event)" > </month-header> <div class="{{ prefixCls }}-body"> <month-table [showWeek]="showWeek" [value]="value" [activeDate]="activeDate" [disabledDate]="disabledDate" [cellRender]="dateRender" (valueChange)="onChooseMonth($event)" ></month-table> </div> </ng-container> <ng-container *ngSwitchDefault> <date-header [(value)]="activeDate" [locale]="locale!" [showSuperPreBtn]="enablePrevNext('prev', 'date')" [showSuperNextBtn]="enablePrevNext('next', 'date')" [showPreBtn]="enablePrevNext('prev', 'date')" [showNextBtn]="enablePrevNext('next', 'date')" (panelModeChange)="panelModeChange.emit($event)" (valueChange)="headerChange.emit($event)" > </date-header> <div class="{{ prefixCls }}-body"> <date-table [locale]="locale!" [showWeek]="showWeek" [value]="value" [activeDate]="activeDate" (valueChange)="onSelectDate($event)" [disabledDate]="disabledDate" [cellRender]="dateRender" [selectedValue]="selectedValue" [hoverValue]="hoverValue" (dayHover)="dayHover.emit($event)" ></date-table> </div> </ng-container> </ng-container> </div> <ng-container *ngIf="showTimePicker && timeOptions"> <nz-time-picker-panel [nzInDatePicker]="true" [ngModel]="value?.nativeDate" (ngModelChange)="onSelectTime($event)" [format]="$any(timeOptions.nzFormat)" [nzHourStep]="$any(timeOptions.nzHourStep)" [nzMinuteStep]="$any(timeOptions.nzMinuteStep)" [nzSecondStep]="$any(timeOptions.nzSecondStep)" [nzDisabledHours]="$any(timeOptions.nzDisabledHours)" [nzDisabledMinutes]="$any(timeOptions.nzDisabledMinutes)" [nzDisabledSeconds]="$any(timeOptions.nzDisabledSeconds)" [nzHideDisabledOptions]="!!timeOptions.nzHideDisabledOptions" [nzDefaultOpenValue]="$any(timeOptions.nzDefaultOpenValue)" [nzUse12Hours]="!!timeOptions.nzUse12Hours" [nzAddOn]="$any(timeOptions.nzAddOn)" ></nz-time-picker-panel> <!-- use [opened] to trigger time panel \`initPosition()\` --> </ng-container> </div> ` }] } ]; InnerPopupComponent.propDecorators = { activeDate: [{ type: Input }], endPanelMode: [{ type: Input }], panelMode: [{ type: Input }], showWeek: [{ type: Input }], locale: [{ type: Input }], showTimePicker: [{ type: Input }], timeOptions: [{ type: Input }], disabledDate: [{ type: Input }], dateRender: [{ type: Input }], selectedValue: [{ type: Input }], hoverValue: [{ type: Input }], value: [{ type: Input }], partType: [{ type: Input }], panelModeChange: [{ type: Output }], headerChange: [{ type: Output }], selectDate: [{ type: Output }], selectTime: [{ type: Output }], dayHover: [{ type: Output }] }; if (false) { /** @type {?} */ InnerPopupComponent.prototype.activeDate; /** @type {?} */ InnerPopupComponent.prototype.endPanelMode; /** @type {?} */ InnerPopupComponent.prototype.panelMode; /** @type {?} */ InnerPopupComponent.prototype.showWeek; /** @type {?} */ InnerPopupComponent.prototype.locale; /** @type {?} */ InnerPopupComponent.prototype.showTimePicker; /** @type {?} */ InnerPopupComponent.prototype.timeOptions; /** @type {?} */ InnerPopupComponent.prototype.disabledDate; /** @type {?} */ InnerPopupComponent.prototype.dateRender; /** @type {?} */ InnerPopupComponent.prototype.selectedValue; /** @type {?} */ InnerPopupComponent.prototype.hoverValue; /** @type {?} */ InnerPopupComponent.prototype.value; /** @type {?} */ InnerPopupComponent.prototype.partType; /** @type {?} */ InnerPopupComponent.prototype.panelModeChange; /** @type {?} */ InnerPopupComponent.prototype.headerChange; /** @type {?} */ InnerPopupComponent.prototype.selectDate; /** @type {?} */ InnerPopupComponent.prototype.selectTime; /** @type {?} */ InnerPopupComponent.prototype.dayHover; /** @type {?} */ InnerPopupComponent.prototype.prefixCls; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5uZXItcG9wdXAuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmctem9ycm8tYW50ZC9kYXRlLXBpY2tlci8iLCJzb3VyY2VzIjpbImlubmVyLXBvcHVwLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7QUFRQSxPQUFPLEVBQ0wsdUJBQXVCLEVBQ3ZCLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFHTixpQkFBaUIsRUFDbEIsTUFBTSxlQUFlLENBQUM7QUFFdkIsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBSXBELE9BQU8sRUFBRSxZQUFZLEVBQUUsTUFBTSxRQUFRLENBQUM7QUFtSXRDLE1BQU0sT0FBTyxtQkFBbUI7SUFqSWhDO1FBZ0pxQixvQkFBZSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7O1FBR2pELGlCQUFZLEdBQUcsSUFBSSxZQUFZLEVBQWEsQ0FBQyxDQUFDLCtDQUErQzs7UUFDN0YsZUFBVSxHQUFHLElBQUksWUFBWSxFQUFhLENBQUMsQ0FBQyw0REFBNEQ7O1FBQ3hHLGVBQVUsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDO1FBQzNDLGFBQVEsR0FBRyxJQUFJLFlBQVksRUFBYSxDQUFDLENBQUMsNkNBQTZDOztRQUUxRyxjQUFTLEdBQVcsWUFBWSxDQUFDO0lBK0VuQyxDQUFDOzs7Ozs7OztJQXZFQyxjQUFjLENBQUMsU0FBMEIsRUFBRSxTQUFxQjtRQUM5RCxJQUNFLENBQUMsSUFBSSxDQUFDLGNBQWM7WUFDcEIsU0FBUyxLQUFLLElBQUksQ0FBQyxZQUFZO1lBQy9CLENBQUMsQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLE1BQU0sSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsUUFBUSxLQUFLLE9BQU8sSUFBSSxTQUFTLEtBQUssTUFBTSxDQUFDLENBQUMsRUFDM0c7WUFDQSxPQUFPLEtBQUssQ0FBQztT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QUU1RCx3Q0FBaUMiLCJzb3VyY2VzQ29udGVudCI6WyIvKipcbiAqIEBsaWNlbnNlXG4gKiBDb3B5cmlnaHQgQWxpYmFiYS5jb20gQWxsIFJpZ2h0cyBSZXNlcnZlZC5cbiAqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRXZlbnRFbWl0dGVyLFxuICBJbnB1dCxcbiAgT25DaGFuZ2VzLFxuICBPdXRwdXQsXG4gIFNpbXBsZUNoYW5nZXMsXG4gIFRlbXBsYXRlUmVmLFxuICBWaWV3RW5jYXBzdWxhdGlvblxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcblxuaW1wb3J0IHsgQ2FuZHlEYXRlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3RpbWUnO1xuaW1wb3J0IHsgRnVuY3Rpb25Qcm9wIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3R5cGVzJztcbmltcG9ydCB7IE56Q2FsZW5kYXJJMThuSW50ZXJmYWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZC9pMThuJztcbmltcG9ydCB7IERpc2FibGVkRGF0ZUZuLCBOekRhdGVNb2RlLCBSYW5nZVBhcnRUeXBlLCBTdXBwb3J0VGltZU9wdGlvbnMgfSBmcm9tICcuL3N0YW5kYXJkLXR5cGVzJztcbmltcG9ydCB7IFBSRUZJWF9DTEFTUyB9IGZyb20gJy4vdXRpbCc7XG5cbkBDb21wb25lbnQoe1xuICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOmNvbXBvbmVudC1zZWxlY3RvclxuICBzZWxlY3RvcjogJ2lubmVyLXBvcHVwJyxcbiAgZXhwb3J0QXM6ICdpbm5lclBvcHVwJyxcbiAgdGVtcGxhdGU6IGBcbiAgICA8ZGl2IFtjbGFzcy5hbnQtcGlja2VyLWRhdGV0aW1lLXBhbmVsXT1cInNob3dUaW1lUGlja2VyXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwie3sgcHJlZml4Q2xzIH19LXt7IHBhbmVsTW9kZSB9fS1wYW5lbFwiPlxuICAgICAgICA8bmctY29udGFpbmVyIFtuZ1N3aXRjaF09XCJwYW5lbE1vZGVcIj5cbiAgICAgICAgICA8bmctY29udGFpbmVyICpuZ1N3aXRjaENhc2U9XCInZGVjYWRlJ1wiPlxuICAgICAgICAgICAgPGRlY2FkZS1oZWFkZXJcbiAgICAgICAgICAgICAgWyh2YWx1ZSldPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlIVwiXG4gICAgICAgICAgICAgIFtzaG93U3VwZXJQcmVCdG5dPVwiZW5hYmxlUHJldk5leHQoJ3ByZXYnLCAnZGVjYWRlJylcIlxuICAgICAgICAgICAgICBbc2hvd1N1cGVyTmV4dEJ0bl09XCJlbmFibGVQcmV2TmV4dCgnbmV4dCcsICdkZWNhZGUnKVwiXG4gICAgICAgICAgICAgIFtzaG93TmV4dEJ0bl09XCJmYWxzZVwiXG4gICAgICAgICAgICAgIFtzaG93UHJlQnRuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgKHBhbmVsTW9kZUNoYW5nZSk9XCJwYW5lbE1vZGVDaGFuZ2UuZW1pdCgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cImhlYWRlckNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgPlxuICAgICAgICAgICAgPC9kZWNhZGUtaGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1ib2R5XCI+XG4gICAgICAgICAgICAgIDxkZWNhZGUtdGFibGVcbiAgICAgICAgICAgICAgICBbc2hvd1dlZWtdPVwic2hvd1dlZWtcIlxuICAgICAgICAgICAgICAgIFthY3RpdmVEYXRlXT1cImFjdGl2ZURhdGVcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uQ2hvb3NlRGVjYWRlKCRldmVudClcIlxuICAgICAgICAgICAgICAgIFtkaXNhYmxlZERhdGVdPVwiZGlzYWJsZWREYXRlXCJcbiAgICAgICAgICAgICAgICBbY2VsbFJlbmRlcl09XCJkYXRlUmVuZGVyXCJcbiAgICAgICAgICAgICAgPjwvZGVjYWRlLXRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ3llYXInXCI+XG4gICAgICAgICAgICA8eWVhci1oZWFkZXJcbiAgICAgICAgICAgICAgWyh2YWx1ZSldPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgIFtsb2NhbGVdPVwibG9jYWxlIVwiXG4gICAgICAgICAgICAgIFtzaG93U3VwZXJQcmVCdG5dPVwiZW5hYmxlUHJldk5leHQoJ3ByZXYnLCAneWVhcicpXCJcbiAgICAgICAgICAgICAgW3Nob3dTdXBlck5leHRCdG5dPVwiZW5hYmxlUHJldk5leHQoJ25leHQnLCAneWVhcicpXCJcbiAgICAgICAgICAgICAgW3Nob3dOZXh0QnRuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmVCdG5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAocGFuZWxNb2RlQ2hhbmdlKT1cInBhbmVsTW9kZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGVhZGVyQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L3llYXItaGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1ib2R5XCI+XG4gICAgICAgICAgICAgIDx5ZWFyLXRhYmxlXG4gICAgICAgICAgICAgICAgW3Nob3dXZWVrXT1cInNob3dXZWVrXCJcbiAgICAgICAgICAgICAgICBbYWN0aXZlRGF0ZV09XCJhY3RpdmVEYXRlXCJcbiAgICAgICAgICAgICAgICBbdmFsdWVdPVwidmFsdWVcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNob29zZVllYXIoJGV2ZW50KVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyXT1cImRhdGVSZW5kZXJcIlxuICAgICAgICAgICAgICA+PC95ZWFyLXRhYmxlPlxuICAgICAgICAgICAgPC9kaXY+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hDYXNlPVwiJ21vbnRoJ1wiPlxuICAgICAgICAgICAgPG1vbnRoLWhlYWRlclxuICAgICAgICAgICAgICBbKHZhbHVlKV09XCJhY3RpdmVEYXRlXCJcbiAgICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGUhXCJcbiAgICAgICAgICAgICAgW3Nob3dOZXh0QnRuXT1cImZhbHNlXCJcbiAgICAgICAgICAgICAgW3Nob3dQcmVCdG5dPVwiZmFsc2VcIlxuICAgICAgICAgICAgICAocGFuZWxNb2RlQ2hhbmdlKT1cInBhbmVsTW9kZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGVhZGVyQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L21vbnRoLWhlYWRlcj5cbiAgICAgICAgICAgIDxkaXYgY2xhc3M9XCJ7eyBwcmVmaXhDbHMgfX0tYm9keVwiPlxuICAgICAgICAgICAgICA8bW9udGgtdGFibGVcbiAgICAgICAgICAgICAgICBbc2hvd1dlZWtdPVwic2hvd1dlZWtcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgW2Rpc2FibGVkRGF0ZV09XCJkaXNhYmxlZERhdGVcIlxuICAgICAgICAgICAgICAgIFtjZWxsUmVuZGVyXT1cImRhdGVSZW5kZXJcIlxuICAgICAgICAgICAgICAgICh2YWx1ZUNoYW5nZSk9XCJvbkNob29zZU1vbnRoKCRldmVudClcIlxuICAgICAgICAgICAgICA+PC9tb250aC10YWJsZT5cbiAgICAgICAgICAgIDwvZGl2PlxuICAgICAgICAgIDwvbmctY29udGFpbmVyPlxuXG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdTd2l0Y2hEZWZhdWx0PlxuICAgICAgICAgICAgPGRhdGUtaGVhZGVyXG4gICAgICAgICAgICAgIFsodmFsdWUpXT1cImFjdGl2ZURhdGVcIlxuICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZSFcIlxuICAgICAgICAgICAgICBbc2hvd1N1cGVyUHJlQnRuXT1cImVuYWJsZVByZXZOZXh0KCdwcmV2JywgJ2RhdGUnKVwiXG4gICAgICAgICAgICAgIFtzaG93U3VwZXJOZXh0QnRuXT1cImVuYWJsZVByZXZOZXh0KCduZXh0JywgJ2RhdGUnKVwiXG4gICAgICAgICAgICAgIFtzaG93UHJlQnRuXT1cImVuYWJsZVByZXZOZXh0KCdwcmV2JywgJ2RhdGUnKVwiXG4gICAgICAgICAgICAgIFtzaG93TmV4dEJ0bl09XCJlbmFibGVQcmV2TmV4dCgnbmV4dCcsICdkYXRlJylcIlxuICAgICAgICAgICAgICAocGFuZWxNb2RlQ2hhbmdlKT1cInBhbmVsTW9kZUNoYW5nZS5lbWl0KCRldmVudClcIlxuICAgICAgICAgICAgICAodmFsdWVDaGFuZ2UpPVwiaGVhZGVyQ2hhbmdlLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICA+XG4gICAgICAgICAgICA8L2RhdGUtaGVhZGVyPlxuICAgICAgICAgICAgPGRpdiBjbGFzcz1cInt7IHByZWZpeENscyB9fS1ib2R5XCI+XG4gICAgICAgICAgICAgIDxkYXRlLXRhYmxlXG4gICAgICAgICAgICAgICAgW2xvY2FsZV09XCJsb2NhbGUhXCJcbiAgICAgICAgICAgICAgICBbc2hvd1dlZWtdPVwic2hvd1dlZWtcIlxuICAgICAgICAgICAgICAgIFt2YWx1ZV09XCJ2YWx1ZVwiXG4gICAgICAgICAgICAgICAgW2FjdGl2ZURhdGVdPVwiYWN0aXZlRGF0ZVwiXG4gICAgICAgICAgICAgICAgKHZhbHVlQ2hhbmdlKT1cIm9uU2VsZWN0RGF0ZSgkZXZlbnQpXCJcbiAgICAgICAgICAgICAgICBbZGlzYWJsZWREYXRlXT1cImRpc2FibGVkRGF0ZVwiXG4gICAgICAgICAgICAgICAgW2NlbGxSZW5kZXJdPVwiZGF0ZVJlbmRlclwiXG4gICAgICAgICAgICAgICAgW3NlbGVjdGVkVmFsdWVdPVwic2VsZWN0ZWRWYWx1ZVwiXG4gICAgICAgICAgICAgICAgW2hvdmVyVmFsdWVdPVwiaG92ZXJWYWx1ZVwiXG4gICAgICAgICAgICAgICAgKGRheUhvdmVyKT1cImRheUhvdmVyLmVtaXQoJGV2ZW50KVwiXG4gICAgICAgICAgICAgID48L2RhdGUtdGFibGU+XG4gICAgICAgICAgICA8L2Rpdj5cbiAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICA8L2Rpdj5cbiAgICAgIDxuZy1jb250YWluZXIgKm5nSWY9XCJzaG93VGltZVBpY2tlciAmJiB0aW1lT3B0aW9uc1wiPlxuICAgICAgICA8bnotdGltZS1waWNrZXItcGFuZWxcbiAgICAgICAgICBbbnpJbkRhdGVQaWNrZXJdPVwidHJ1ZVwiXG4gICAgICAgICAgW25nTW9kZWxdPVwidmFsdWU/Lm5hdGl2ZURhdGVcIlxuICAgICAgICAgIChuZ01vZGVsQ2hhbmdlKT1cIm9uU2VsZWN0VGltZSgkZXZlbnQpXCJcbiAgICAgICAgICBbZm9ybWF0XT1cIiRhbnkodGltZU9wdGlvbnMubnpGb3JtYXQpXCJcbiAgICAgICAgICBbbnpIb3VyU3RlcF09XCIkYW55KHRpbWVPcHRpb25zLm56SG91clN0ZXApXCJcbiAgICAgICAgICBbbnpNaW51dGVTdGVwXT1cIiRhbnkodGltZU9wdGlvbnMubnpNaW51dGVTdGVwKVwiXG4gICAgICAgICAgW256U2Vjb25kU3RlcF09XCIkYW55KHRpbWVPcHRpb25zLm56U2Vjb25kU3RlcClcIlxuICAgICAgICAgIFtuekRpc2FibGVkSG91cnNdPVwiJGFueSh0aW1lT3B0aW9ucy5uekRpc2FibGVkSG91cnMpXCJcbiAgICAgICAgICBbbnpEaXNhYmxlZE1pbnV0ZXNdPVwiJGFueSh0aW1lT3B0aW9ucy5uekRpc2FibGVkTWludXRlcylcIlxuICAgICAgICAgIFtuekRpc2FibGVkU2Vjb25kc109XCIkYW55KHRpbWVPcHRpb25zLm56RGlzYWJsZWRTZWNvbmRzKVwiXG4gICAgICAgICAgW256SGlkZURpc2FibGVkT3B0aW9uc109XCIhIXRpbWVPcHRpb25zLm56SGlkZURpc2FibGVkT3B0aW9uc1wiXG4gICAgICAgICAgW256RGVmYXVsdE9wZW5WYWx1ZV09XCIkYW55KHRpbWVPcHRpb25zLm56RGVmYXVsdE9wZW5WYWx1ZSlcIlxuICAgICAgICAgIFtuelVzZTEySG91cnNdPVwiISF0aW1lT3B0aW9ucy5uelVzZTEySG91cnNcIlxuICAgICAgICAgIFtuekFkZE9uXT1cIiRhbnkodGltZU9wdGlvbnMubnpBZGRPbilcIlxuICAgICAgICA+PC9uei10aW1lLXBpY2tlci1wYW5lbD5cbiAgICAgICAgPCEtLSB1c2UgW29wZW5lZF0gdG8gdHJpZ2dlciB0aW1lIHBhbmVsIFxcYGluaXRQb3NpdGlvbigpXFxgIC0tPlxuICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgPC9kaXY+XG4gIGBcbn0pXG5leHBvcnQgY2xhc3MgSW5uZXJQb3B1cENvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gIEBJbnB1dCgpIGFjdGl2ZURhdGUhOiBDYW5keURhdGU7XG4gIEBJbnB1dCgpIGVuZFBhbmVsTW9kZSE6IE56RGF0ZU1vZGU7XG4gIEBJbnB1dCgpIHBhbmVsTW9kZSE6IE56RGF0ZU1vZGU7XG4gIEBJbnB1dCgpIHNob3dXZWVrITogYm9vbGVhbjtcbiAgQElucHV0KCkgbG9jYWxlITogTnpDYWxlbmRhckkxOG5JbnRlcmZhY2U7XG4gIEBJbnB1dCgpIHNob3dUaW1lUGlja2VyITogYm9vbGVhbjtcbiAgQElucHV0KCkgdGltZU9wdGlvbnMhOiBTdXBwb3J0VGltZU9wdGlvbnMgfCBudWxsO1xuICBASW5wdXQoKSBkaXNhYmxlZERhdGU/OiBEaXNhYmxlZERhdGVGbjtcbiAgQElucHV0KCkgZGF0ZVJlbmRlcj86IHN0cmluZyB8IFRlbXBsYXRlUmVmPERhdGU+IHwgRnVuY3Rpb25Qcm9wPFRlbXBsYXRlUmVmPERhdGU+IHwgc3RyaW5nPjtcbiAgQElucHV0KCkgc2VsZWN0ZWRWYWx1ZSE6IENhbmR5RGF0ZVtdOyAvLyBSYW5nZSBPTkxZXG4gIEBJbnB1dCgpIGhvdmVyVmFsdWUhOiBDYW5keURhdGVbXTsgLy8gUmFuZ2UgT05MWVxuICBASW5wdXQoKSB2YWx1ZSE6IENhbmR5RGF0ZTtcbiAgQElucHV0KCkgcGFydFR5cGUhOiBSYW5nZVBhcnRUeXBlO1xuXG4gIEBPdXRwdXQoKSByZWFkb25seSBwYW5lbE1vZGVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPE56RGF0ZU1vZGU+KCk7XG5cbiAgLy8gVE9ETzogbmFtZSBpcyBub3QgcHJvcGVyXG4gIEBPdXRwdXQoKSByZWFkb25seSBoZWFkZXJDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPENhbmR5RGF0ZT4oKTsgLy8gRW1pdHRlZCB3aGVuIHVzZXIgY2hhbmdlZCB0aGUgaGVhZGVyJ3MgdmFsdWVcbiAgQE91dHB1dCgpIHJlYWRvbmx5IHNlbGVjdERhdGUgPSBuZXcgRXZlbnRFbWl0dGVyPENhbmR5RGF0ZT4oKTsgLy8gRW1pdHRlZCB3aGVuIHRoZSBkYXRlIGlzIHNlbGVjdGVkIGJ5IGNsaWNrIHRoZSBkYXRlIHBhbmVsXG4gIEBPdXRwdXQoKSByZWFkb25seSBzZWxlY3RUaW1lID0gbmV3IEV2ZW50RW1pdHRlcjxDYW5keURhdGU+KCk7XG4gIEBPdXRwdXQoKSByZWFkb25seSBkYXlIb3ZlciA9IG5ldyBFdmVudEVtaXR0ZXI8Q2FuZHlEYXRlPigpOyAvLyBFbWl0dGVkIHdoZW4gaG92ZXIgb24gYSBkYXkgYnkgbW91c2UgZW50ZXJcblxuICBwcmVmaXhDbHM6IHN0cmluZyA9IFBSRUZJWF9DTEFTUztcblxuICAvKipcbiAgICogSGlkZSBcIm5leHRcIiBhcnJvdyBpbiBsZWZ0IHBhbmVsLFxuICAgKiBoaWRlIFwicHJldlwiIGFycm93IGluIHJpZ2h0IHBhbmVsXG4gICAqIEBwYXJhbSBkaXJlY3Rpb25cbiAgICogQHBhcmFtIHBhbmVsTW9kZVxuICAgKi9cbiAgZW5hYmxlUHJldk5leHQoZGlyZWN0aW9uOiAncHJldicgfCAnbmV4dCcsIHBhbmVsTW9kZTogTnpEYXRlTW9kZSk6IGJvb2xlYW4ge1xuICAgIGlmIChcbiAgICAgICF0aGlzLnNob3dUaW1lUGlja2VyICYmXG4gICAgICBwYW5lbE1vZGUgPT09IHRoaXMuZW5kUGFuZWxNb2RlICYmXG4gICAgICAoKHRoaXMucGFydFR5cGUgPT09ICdsZWZ0JyAmJiBkaXJlY3Rpb24gPT09ICduZXh0JykgfHwgKHRoaXMucGFydFR5cGUgPT09ICdyaWdodCcgJiYgZGlyZWN0aW9uID09PSAncHJldicpKVxuICAgICkge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIG9uU2VsZWN0VGltZShkYXRlOiBEYXRlKTogdm9pZCB7XG4gICAgdGhpcy5zZWxlY3RUaW1lLmVtaXQobmV3IENhbmR5RGF0ZShkYXRlKSk7XG4gIH1cblxuICAvLyBUaGUgdmFsdWUgcmVhbCBjaGFuZ2VkIHRvIG91dHNpZGVcbiAgb25TZWxlY3REYXRlKGRhdGU6IENhbmR5RGF0ZSB8IERhdGUpOiB2b2lkIHtcbiAgICBjb25zdCB2YWx1ZSA9IGRhdGUgaW5zdGFuY2VvZiBDYW5keURhdGUgPyBkYXRlIDogbmV3IENhbmR5RGF0ZShkYXRlKTtcbiAgICBjb25zdCB0aW1lVmFsdWUgPSB0aGlzLnRpbWVPcHRpb25zICYmIHRoaXMudGltZU9wdGlvbnMubnpEZWZhdWx0T3BlblZhbHVlO1xuXG4gICAgLy8gRGlzcGxheSB0aW1lVmFsdWUgd2hlbiB2YWx1ZSBpcyBudWxsXG4gICAgaWYgKCF0aGlzLnZhbHVlICYmIHRpbWVWYWx1ZSkge1xuICAgICAgdmFsdWUuc2V0SG1zKHRpbWVWYWx1ZS5nZXRIb3VycygpLCB0aW1lVmFsdWUuZ2V0TWludXRlcygpLCB0aW1lVmFsdWUuZ2V0U2Vjb25kcygpKTtcbiAgICB9XG5cbiAgICB0aGlzLnNlbGVjdERhdGUuZW1pdCh2YWx1ZSk7XG4gIH1cblxuICBvbkNob29zZU1vbnRoKHZhbHVlOiBDYW5keURhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmFjdGl2ZURhdGUuc2V0TW9udGgodmFsdWUuZ2V0TW9udGgoKSk7XG4gICAgaWYgKHRoaXMuZW5kUGFuZWxNb2RlID09PSAnbW9udGgnKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnNlbGVjdERhdGUuZW1pdCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5wYW5lbE1vZGVDaGFuZ2UuZW1pdCh0aGlzLmVuZFBhbmVsTW9kZSk7XG4gICAgfVxuICB9XG5cbiAgb25DaG9vc2VZZWFyKHZhbHVlOiBDYW5keURhdGUpOiB2b2lkIHtcbiAgICB0aGlzLmFjdGl2ZURhdGUgPSB0aGlzLmFjdGl2ZURhdGUuc2V0WWVhcih2YWx1ZS5nZXRZZWFyKCkpO1xuICAgIGlmICh0aGlzLmVuZFBhbmVsTW9kZSA9PT0gJ3llYXInKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICB0aGlzLnNlbGVjdERhdGUuZW1pdCh2YWx1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMuaGVhZGVyQ2hhbmdlLmVtaXQodmFsdWUpO1xuICAgICAgdGhpcy5wYW5lbE1vZGVDaGFuZ2UuZW1pdCh0aGlzLmVuZFBhbmVsTW9kZSk7XG4gICAgfVxuICB9XG5cbiAgb25DaG9vc2VEZWNhZGUodmFsdWU6IENhbmR5RGF0ZSk6IHZvaWQge1xuICAgIHRoaXMuYWN0aXZlRGF0ZSA9IHRoaXMuYWN0aXZlRGF0ZS5zZXRZZWFyKHZhbHVlLmdldFllYXIoKSk7XG4gICAgaWYgKHRoaXMuZW5kUGFuZWxNb2RlID09PSAnZGVjYWRlJykge1xuICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlO1xuICAgICAgdGhpcy5zZWxlY3REYXRlLmVtaXQodmFsdWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aGlzLmhlYWRlckNoYW5nZS5lbWl0KHZhbHVlKTtcbiAgICAgIHRoaXMucGFuZWxNb2RlQ2hhbmdlLmVtaXQoJ3llYXInKTtcbiAgICB9XG4gIH1cblxuICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKTogdm9pZCB7XG4gICAgaWYgKGNoYW5nZXMuYWN0aXZlRGF0ZSAmJiAhY2hhbmdlcy5hY3RpdmVEYXRlLmN1cnJlbnRWYWx1ZSkge1xuICAgICAgdGhpcy5hY3RpdmVEYXRlID0gbmV3IENhbmR5RGF0ZSgpO1xuICAgIH1cbiAgICAvLyBOZXcgQW50ZCB2ZXNpb24gaGFzIG1lcmdlZCAnZGF0ZScgYW50ICd0aW1lJyB0byBvbmUgcGFuZWwsXG4gICAgLy8gU28gdGhlcmUgaXMgbm90ICd0aW1lJyBwYW5lbFxuICAgIGlmIChjaGFuZ2VzLnBhbmVsTW9kZSAmJiBjaGFuZ2VzLnBhbmVsTW9kZS5jdXJyZW50VmFsdWUgPT09ICd0aW1lJykge1xuICAgICAgdGhpcy5wYW5lbE1vZGUgPSAnZGF0ZSc7XG4gICAgfVxuICB9XG59XG4iXX0=