UNPKG

@asoftwareworld/form-builder-pro

Version:

ASW Form Builder Pro helps you with rapid development and designed web forms which includes several controls. The key feature of Form Builder is to make your content attractive and effective. We can customize our control at run time and preview the same b

118 lines 23 kB
import { Attribute, ChangeDetectionStrategy, Component, ContentChild, Directive, Input, ViewChild, ViewEncapsulation } from '@angular/core'; import { coerceBooleanProperty } from '@angular/cdk/coercion'; import { merge, of as observableOf, Subscription } from 'rxjs'; import { Icons } from '@asoftwareworld/form-builder-pro/common'; import * as i0 from "@angular/core"; import * as i1 from "../datetimepicker-intl"; import * as i2 from "@angular/common"; import * as i3 from "@angular/material/button"; import * as i4 from "@asoftwareworld/form-builder-pro/common"; /** Can be used to override the icon of a `aswDatetimepickerToggle`. */ export class AswDatetimepickerToggleIcon { static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepickerToggleIcon, deps: [], target: i0.ɵɵFactoryTarget.Directive }); static ɵdir = i0.ɵɵngDeclareDirective({ minVersion: "14.0.0", version: "18.2.8", type: AswDatetimepickerToggleIcon, selector: "[aswDatetimepickerToggleIcon]", ngImport: i0 }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepickerToggleIcon, decorators: [{ type: Directive, args: [{ selector: '[aswDatetimepickerToggleIcon]' }] }] }); export class AswDatetimepickerToggle { _intl; _changeDetectorRef; _stateChanges = Subscription.EMPTY; icons = Icons; /** Datetimepicker instance that the button will toggle. */ datetimepicker; /** Tabindex for the toggle. */ tabIndex; /** Screen-reader label for the button. */ ariaLabel; /** Whether the toggle button is disabled. */ get disabled() { return this._disabled === undefined ? this.datetimepicker.disabled : !!this._disabled; } set disabled(value) { this._disabled = coerceBooleanProperty(value); } _disabled; /** Whether ripples on the toggle should be disabled. */ disableRipple; /** Custom icon set by the consumer. */ _customIcon; /** Underlying button element. */ _button; constructor(_intl, _changeDetectorRef, defaultTabIndex) { this._intl = _intl; this._changeDetectorRef = _changeDetectorRef; const parsedTabIndex = Number(defaultTabIndex); this.tabIndex = parsedTabIndex || parsedTabIndex === 0 ? parsedTabIndex : null; } ngOnChanges(changes) { if (changes.datetimepicker) { this._watchStateChanges(); } } ngOnDestroy() { this._stateChanges.unsubscribe(); } ngAfterContentInit() { this._watchStateChanges(); } _open(event) { if (this.datetimepicker && !this.disabled) { this.datetimepicker.open(); event.stopPropagation(); } } _watchStateChanges() { const datetimepickerDisabled = this.datetimepicker ? this.datetimepicker._disabledChange : observableOf(); const inputDisabled = this.datetimepicker && this.datetimepicker.datetimepickerInput ? this.datetimepicker.datetimepickerInput._disabledChange : observableOf(); const datetimepickerToggled = this.datetimepicker ? merge(this.datetimepicker.openedStream, this.datetimepicker.closedStream) : observableOf(); this._stateChanges.unsubscribe(); this._stateChanges = merge(this._intl.changes, datetimepickerDisabled, inputDisabled, datetimepickerToggled).subscribe(() => this._changeDetectorRef.markForCheck()); } static ngAcceptInputType_disabled; static ngAcceptInputType_disableRipple; static ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepickerToggle, deps: [{ token: i1.AswDatetimepickerIntl }, { token: i0.ChangeDetectorRef }, { token: 'tabindex', attribute: true }], target: i0.ɵɵFactoryTarget.Component }); static ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.8", type: AswDatetimepickerToggle, selector: "asw-datetimepicker-toggle", inputs: { datetimepicker: ["for", "datetimepicker"], tabIndex: "tabIndex", ariaLabel: ["aria-label", "ariaLabel"], disabled: "disabled", disableRipple: "disableRipple" }, host: { listeners: { "click": "_open($event)" }, properties: { "attr.tabindex": "null", "class.asw-datetimepicker-toggle-active": "datetimepicker && datetimepicker.opened", "class.mat-accent": "datetimepicker && datetimepicker.color === \"accent\"", "class.mat-warn": "datetimepicker && datetimepicker.color === \"warn\"", "attr.data-asw-calendar": "datetimepicker ? datetimepicker.id : null" }, classAttribute: "asw-datetimepicker-toggle" }, queries: [{ propertyName: "_customIcon", first: true, predicate: AswDatetimepickerToggleIcon, descendants: true }], viewQueries: [{ propertyName: "_button", first: true, predicate: ["button"], descendants: true }], exportAs: ["aswDatetimepickerToggle"], usesOnChanges: true, ngImport: i0, template: "<button #button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.aria-haspopup]=\"datetimepicker ? 'dialog' : null\"\r\n [attr.aria-label]=\"ariaLabel || _intl.openCalendarLabel\"\r\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\r\n [disabled]=\"disabled\"\r\n [disableRipple]=\"disableRipple\">\r\n <ng-container *ngIf=\"!_customIcon\" [ngSwitch]=\"datetimepicker.type\">\r\n <span *ngSwitchCase=\"'time'\" [innerHTML]=\"icons.time | aswSafeHtml\"></span>\r\n <span *ngSwitchCase=\"'datetime'\" [innerHTML]=\"icons.dateTime | aswSafeHtml\"></span>\r\n <span *ngSwitchDefault [innerHTML]=\"icons.today | aswSafeHtml\"></span>\r\n </ng-container>\r\n <ng-content select=\"[aswDatetimepickerToggleIcon]\"></ng-content>\r\n</button>\r\n", styles: [".mat-form-field-appearance-legacy .mat-form-field-prefix .asw-datetimepicker-toggle-default-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .asw-datetimepicker-toggle-default-icon{width:1em}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .asw-datetimepicker-toggle-default-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .asw-datetimepicker-toggle-default-icon{display:block;width:1.5em;height:1.5em}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .asw-datetimepicker-toggle-default-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .asw-datetimepicker-toggle-default-icon{margin:auto}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgSwitch, selector: "[ngSwitch]", inputs: ["ngSwitch"] }, { kind: "directive", type: i2.NgSwitchCase, selector: "[ngSwitchCase]", inputs: ["ngSwitchCase"] }, { kind: "directive", type: i2.NgSwitchDefault, selector: "[ngSwitchDefault]" }, { kind: "component", type: i3.MatIconButton, selector: "button[mat-icon-button]", exportAs: ["matButton"] }, { kind: "pipe", type: i4.AswSafeHtmlPipe, name: "aswSafeHtml" }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.8", ngImport: i0, type: AswDatetimepickerToggle, decorators: [{ type: Component, args: [{ selector: 'asw-datetimepicker-toggle', host: { class: 'asw-datetimepicker-toggle', '[attr.tabindex]': 'null', '[class.asw-datetimepicker-toggle-active]': 'datetimepicker && datetimepicker.opened', '[class.mat-accent]': 'datetimepicker && datetimepicker.color === "accent"', '[class.mat-warn]': 'datetimepicker && datetimepicker.color === "warn"', // Used by the test harness to tie this toggle to its datetimepicker. '[attr.data-asw-calendar]': 'datetimepicker ? datetimepicker.id : null', // Bind the `click` on the host, rather than the inner `button`, so that we can call // `stopPropagation` on it without affecting the user's `click` handlers. We need to stop // it so that the input doesn't get focused automatically by the form field (See #21836). '(click)': '_open($event)' }, exportAs: 'aswDatetimepickerToggle', encapsulation: ViewEncapsulation.None, preserveWhitespaces: false, changeDetection: ChangeDetectionStrategy.OnPush, template: "<button #button\r\n mat-icon-button\r\n type=\"button\"\r\n [attr.aria-haspopup]=\"datetimepicker ? 'dialog' : null\"\r\n [attr.aria-label]=\"ariaLabel || _intl.openCalendarLabel\"\r\n [attr.tabindex]=\"disabled ? -1 : tabIndex\"\r\n [disabled]=\"disabled\"\r\n [disableRipple]=\"disableRipple\">\r\n <ng-container *ngIf=\"!_customIcon\" [ngSwitch]=\"datetimepicker.type\">\r\n <span *ngSwitchCase=\"'time'\" [innerHTML]=\"icons.time | aswSafeHtml\"></span>\r\n <span *ngSwitchCase=\"'datetime'\" [innerHTML]=\"icons.dateTime | aswSafeHtml\"></span>\r\n <span *ngSwitchDefault [innerHTML]=\"icons.today | aswSafeHtml\"></span>\r\n </ng-container>\r\n <ng-content select=\"[aswDatetimepickerToggleIcon]\"></ng-content>\r\n</button>\r\n", styles: [".mat-form-field-appearance-legacy .mat-form-field-prefix .asw-datetimepicker-toggle-default-icon,.mat-form-field-appearance-legacy .mat-form-field-suffix .asw-datetimepicker-toggle-default-icon{width:1em}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .asw-datetimepicker-toggle-default-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .asw-datetimepicker-toggle-default-icon{display:block;width:1.5em;height:1.5em}.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-prefix .mat-icon-button .asw-datetimepicker-toggle-default-icon,.mat-form-field:not(.mat-form-field-appearance-legacy) .mat-form-field-suffix .mat-icon-button .asw-datetimepicker-toggle-default-icon{margin:auto}\n"] }] }], ctorParameters: () => [{ type: i1.AswDatetimepickerIntl }, { type: i0.ChangeDetectorRef }, { type: undefined, decorators: [{ type: Attribute, args: ['tabindex'] }] }], propDecorators: { datetimepicker: [{ type: Input, args: ['for'] }], tabIndex: [{ type: Input }], ariaLabel: [{ type: Input, args: ['aria-label'] }], disabled: [{ type: Input }], disableRipple: [{ type: Input }], _customIcon: [{ type: ContentChild, args: [AswDatetimepickerToggleIcon] }], _button: [{ type: ViewChild, args: ['button'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0ZXRpbWVwaWNrZXItdG9nZ2xlLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvZGF0ZXRpbWVwaWNrZXIvZGF0ZXRpbWVwaWNrZXItdG9nZ2xlL2RhdGV0aW1lcGlja2VyLXRvZ2dsZS50cyIsIi4uLy4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2RhdGV0aW1lcGlja2VyL2RhdGV0aW1lcGlja2VyLXRvZ2dsZS9kYXRldGltZXBpY2tlci10b2dnbGUuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQW9CLFNBQVMsRUFBRSx1QkFBdUIsRUFBcUIsU0FBUyxFQUFFLFlBQVksRUFBRSxTQUFTLEVBQUUsS0FBSyxFQUF1QyxTQUFTLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFDdE4sT0FBTyxFQUFnQixxQkFBcUIsRUFBRSxNQUFNLHVCQUF1QixDQUFDO0FBRTVFLE9BQU8sRUFBRSxLQUFLLEVBQUUsRUFBRSxJQUFJLFlBQVksRUFBRSxZQUFZLEVBQWMsTUFBTSxNQUFNLENBQUM7QUFHM0UsT0FBTyxFQUFFLEtBQUssRUFBRSxNQUFNLHlDQUF5QyxDQUFDOzs7Ozs7QUFFaEUsdUVBQXVFO0FBSXZFLE1BQU0sT0FBTywyQkFBMkI7dUdBQTNCLDJCQUEyQjsyRkFBM0IsMkJBQTJCOzsyRkFBM0IsMkJBQTJCO2tCQUh2QyxTQUFTO21CQUFDO29CQUNQLFFBQVEsRUFBRSwrQkFBK0I7aUJBQzVDOztBQXlCRCxNQUFNLE9BQU8sdUJBQXVCO0lBZ0NyQjtJQUNDO0lBaENKLGFBQWEsR0FBRyxZQUFZLENBQUMsS0FBSyxDQUFDO0lBQzNDLEtBQUssR0FBRyxLQUFLLENBQUM7SUFDZCwyREFBMkQ7SUFDN0MsY0FBYyxDQUF3QjtJQUVwRCwrQkFBK0I7SUFDdEIsUUFBUSxDQUFnQjtJQUVqQywwQ0FBMEM7SUFDckIsU0FBUyxDQUFVO0lBRXhDLDZDQUE2QztJQUM3QyxJQUNJ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QUcvQjt3QkFDRixLQUFLLEVBQUUsMkJBQTJCO3dCQUNsQyxpQkFBaUIsRUFBRSxNQUFNO3dCQUN6QiwwQ0FBMEMsRUFBRSx5Q0FBeUM7d0JBQ3JGLG9CQUFvQixFQUFFLHFEQUFxRDt3QkFDM0Usa0JBQWtCLEVBQUUsbURBQW1EO3dCQUN2RSxxRUFBcUU7d0JBQ3JFLDBCQUEwQixFQUFFLDJDQUEyQzt3QkFDdkUsb0ZBQW9GO3dCQUNwRix5RkFBeUY7d0JBQ3pGLHlGQUF5Rjt3QkFDekYsU0FBUyxFQUFFLGVBQWU7cUJBQzdCLFlBQ1MseUJBQXlCLGlCQUNwQixpQkFBaUIsQ0FBQyxJQUFJLHVCQUNoQixLQUFLLG1CQUNULHVCQUF1QixDQUFDLE1BQU07OzBCQW9DMUMsU0FBUzsyQkFBQyxVQUFVO3lDQTlCWCxjQUFjO3NCQUEzQixLQUFLO3VCQUFDLEtBQUs7Z0JBR0gsUUFBUTtzQkFBaEIsS0FBSztnQkFHZSxTQUFTO3NCQUE3QixLQUFLO3VCQUFDLFlBQVk7Z0JBSWYsUUFBUTtzQkFEWCxLQUFLO2dCQVVHLGFBQWE7c0JBQXJCLEtBQUs7Z0JBR3FDLFdBQVc7c0JBQXJELFlBQVk7dUJBQUMsMkJBQTJCO2dCQUdwQixPQUFPO3NCQUEzQixTQUFTO3VCQUFDLFFBQVEiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBBZnRlckNvbnRlbnRJbml0LCBBdHRyaWJ1dGUsIENoYW5nZURldGVjdGlvblN0cmF0ZWd5LCBDaGFuZ2VEZXRlY3RvclJlZiwgQ29tcG9uZW50LCBDb250ZW50Q2hpbGQsIERpcmVjdGl2ZSwgSW5wdXQsIE9uQ2hhbmdlcywgT25EZXN0cm95LCBTaW1wbGVDaGFuZ2VzLCBWaWV3Q2hpbGQsIFZpZXdFbmNhcHN1bGF0aW9uIH0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5pbXBvcnQgeyBCb29sZWFuSW5wdXQsIGNvZXJjZUJvb2xlYW5Qcm9wZXJ0eSB9IGZyb20gJ0Bhbmd1bGFyL2Nkay9jb2VyY2lvbic7XG5pbXBvcnQgeyBNYXRCdXR0b24gfSBmcm9tICdAYW5ndWxhci9tYXRlcmlhbC9idXR0b24nO1xuaW1wb3J0IHsgbWVyZ2UsIG9mIGFzIG9ic2VydmFibGVPZiwgU3Vic2NyaXB0aW9uLCBPYnNlcnZhYmxlIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBBc3dEYXRldGltZXBpY2tlciB9IGZyb20gJy4uL2RhdGV0aW1lcGlja2VyJztcbmltcG9ydCB7IEFzd0RhdGV0aW1lcGlja2VySW50bCB9IGZyb20gJy4uL2RhdGV0aW1lcGlja2VyLWludGwnO1xuaW1wb3J0IHsgSWNvbnMgfSBmcm9tICdAYXNvZnR3YXJld29ybGQvZm9ybS1idWlsZGVyLXByby9jb21tb24nO1xuXG4vKiogQ2FuIGJlIHVzZWQgdG8gb3ZlcnJpZGUgdGhlIGljb24gb2YgYSBgYXN3RGF0ZXRpbWVwaWNrZXJUb2dnbGVgLiAqL1xuQERpcmVjdGl2ZSh7XG4gICAgc2VsZWN0b3I6ICdbYXN3RGF0ZXRpbWVwaWNrZXJUb2dnbGVJY29uXSdcbn0pXG5leHBvcnQgY2xhc3MgQXN3RGF0ZXRpbWVwaWNrZXJUb2dnbGVJY29uIHt9XG5cbkBDb21wb25lbnQoe1xuICAgIHNlbGVjdG9yOiAnYXN3LWRhdGV0aW1lcGlja2VyLXRvZ2dsZScsXG4gICAgdGVtcGxhdGVVcmw6ICdkYXRldGltZXBpY2tlci10b2dnbGUuaHRtbCcsXG4gICAgc3R5bGVVcmxzOiBbJy4vZGF0ZXRpbWVwaWNrZXItdG9nZ2xlLnNjc3MnXSxcbiAgICBob3N0OiB7XG4gICAgICAgIGNsYXNzOiAnYXN3LWRhdGV0aW1lcGlja2VyLXRvZ2dsZScsXG4gICAgICAgICdbYXR0ci50YWJpbmRleF0nOiAnbnVsbCcsXG4gICAgICAgICdbY2xhc3MuYXN3LWRhdGV0aW1lcGlja2VyLXRvZ2dsZS1hY3RpdmVdJzogJ2RhdGV0aW1lcGlja2VyICYmIGRhdGV0aW1lcGlja2VyLm9wZW5lZCcsXG4gICAgICAgICdbY2xhc3MubWF0LWFjY2VudF0nOiAnZGF0ZXRpbWVwaWNrZXIgJiYgZGF0ZXRpbWVwaWNrZXIuY29sb3IgPT09IFwiYWNjZW50XCInLFxuICAgICAgICAnW2NsYXNzLm1hdC13YXJuXSc6ICdkYXRldGltZXBpY2tlciAmJiBkYXRldGltZXBpY2tlci5jb2xvciA9PT0gXCJ3YXJuXCInLFxuICAgICAgICAvLyBVc2VkIGJ5IHRoZSB0ZXN0IGhhcm5lc3MgdG8gdGllIHRoaXMgdG9nZ2xlIHRvIGl0cyBkYXRldGltZXBpY2tlci5cbiAgICAgICAgJ1thdHRyLmRhdGEtYXN3LWNhbGVuZGFyXSc6ICdkYXRldGltZXBpY2tlciA/IGRhdGV0aW1lcGlja2VyLmlkIDogbnVsbCcsXG4gICAgICAgIC8vIEJpbmQgdGhlIGBjbGlja2Agb24gdGhlIGhvc3QsIHJhdGhlciB0aGFuIHRoZSBpbm5lciBgYnV0dG9uYCwgc28gdGhhdCB3ZSBjYW4gY2FsbFxuICAgICAgICAvLyBgc3RvcFByb3BhZ2F0aW9uYCBvbiBpdCB3aXRob3V0IGFmZmVjdGluZyB0aGUgdXNlcidzIGBjbGlja2AgaGFuZGxlcnMuIFdlIG5lZWQgdG8gc3RvcFxuICAgICAgICAvLyBpdCBzbyB0aGF0IHRoZSBpbnB1dCBkb2Vzbid0IGdldCBmb2N1c2VkIGF1dG9tYXRpY2FsbHkgYnkgdGhlIGZvcm0gZmllbGQgKFNlZSAjMjE4MzYpLlxuICAgICAgICAnKGNsaWNrKSc6ICdfb3BlbigkZXZlbnQpJ1xuICAgIH0sXG4gICAgZXhwb3J0QXM6ICdhc3dEYXRldGltZXBpY2tlclRvZ2dsZScsXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBwcmVzZXJ2ZVdoaXRlc3BhY2VzOiBmYWxzZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaFxufSlcbmV4cG9ydCBjbGFzcyBBc3dEYXRldGltZXBpY2tlclRvZ2dsZTxEPiBpbXBsZW1lbnRzIEFmdGVyQ29udGVudEluaXQsIE9uQ2hhbmdlcywgT25EZXN0cm95IHtcbiAgICBwcml2YXRlIF9zdGF0ZUNoYW5nZXMgPSBTdWJzY3JpcHRpb24uRU1QVFk7XG4gICAgaWNvbnMgPSBJY29ucztcbiAgICAvKiogRGF0ZXRpbWVwaWNrZXIgaW5zdGFuY2UgdGhhdCB0aGUgYnV0dG9uIHdpbGwgdG9nZ2xlLiAqL1xuICAgIEBJbnB1dCgnZm9yJykgZGF0ZXRpbWVwaWNrZXIhOiBBc3dEYXRldGltZXBpY2tlcjxEPjtcblxuICAgIC8qKiBUYWJpbmRleCBmb3IgdGhlIHRvZ2dsZS4gKi9cbiAgICBASW5wdXQoKSB0YWJJbmRleDogbnVtYmVyIHwgbnVsbDtcblxuICAgIC8qKiBTY3JlZW4tcmVhZGVyIGxhYmVsIGZvciB0aGUgYnV0dG9uLiAqL1xuICAgIEBJbnB1dCgnYXJpYS1sYWJlbCcpIGFyaWFMYWJlbD86IHN0cmluZztcblxuICAgIC8qKiBXaGV0aGVyIHRoZSB0b2dnbGUgYnV0dG9uIGlzIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpXG4gICAgZ2V0IGRpc2FibGVkKCk6IGJvb2xlYW4ge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlzYWJsZWQgPT09IHVuZGVmaW5lZCA/IHRoaXMuZGF0ZXRpbWVwaWNrZXIuZGlzYWJsZWQgOiAhIXRoaXMuX2Rpc2FibGVkO1xuICAgIH1cbiAgICBzZXQgZGlzYWJsZWQodmFsdWU6IGJvb2xlYW4pIHtcbiAgICAgICAgdGhpcy5fZGlzYWJsZWQgPSBjb2VyY2VCb29sZWFuUHJvcGVydHkodmFsdWUpO1xuICAgIH1cbiAgICBwcml2YXRlIF9kaXNhYmxlZCE6IGJvb2xlYW47XG5cbiAgICAvKiogV2hldGhlciByaXBwbGVzIG9uIHRoZSB0b2dnbGUgc2hvdWxkIGJlIGRpc2FibGVkLiAqL1xuICAgIEBJbnB1dCgpIGRpc2FibGVSaXBwbGUhOiBib29sZWFuO1xuXG4gICAgLyoqIEN1c3RvbSBpY29uIHNldCBieSB0aGUgY29uc3VtZXIuICovXG4gICAgQENvbnRlbnRDaGlsZChBc3dEYXRldGltZXBpY2tlclRvZ2dsZUljb24pIF9jdXN0b21JY29uITogQXN3RGF0ZXRpbWVwaWNrZXJUb2dnbGVJY29uO1xuXG4gICAgLyoqIFVuZGVybHlpbmcgYnV0dG9uIGVsZW1lbnQuICovXG4gICAgQFZpZXdDaGlsZCgnYnV0dG9uJykgX2J1dHRvbiE6IE1hdEJ1dHRvbjtcblxuICAgIGNvbnN0cnVjdG9yKFxuICAgICAgICBwdWJsaWMgX2ludGw6IEFzd0RhdGV0aW1lcGlja2VySW50bCxcbiAgICAgICAgcHJpdmF0ZSBfY2hhbmdlRGV0ZWN0b3JSZWY6IENoYW5nZURldGVjdG9yUmVmLFxuICAgICAgICBAQXR0cmlidXRlKCd0YWJpbmRleCcpIGRlZmF1bHRUYWJJbmRleDogc3RyaW5nXG4gICAgKSB7XG4gICAgICAgIGNvbnN0IHBhcnNlZFRhYkluZGV4ID0gTnVtYmVyKGRlZmF1bHRUYWJJbmRleCk7XG4gICAgICAgIHRoaXMudGFiSW5kZXggPSBwYXJzZWRUYWJJbmRleCB8fCBwYXJzZWRUYWJJbmRleCA9PT0gMCA/IHBhcnNlZFRhYkluZGV4IDogbnVsbDtcbiAgICB9XG5cbiAgICBuZ09uQ2hhbmdlcyhjaGFuZ2VzOiBTaW1wbGVDaGFuZ2VzKSB7XG4gICAgICAgIGlmIChjaGFuZ2VzLmRhdGV0aW1lcGlja2VyKSB7XG4gICAgICAgICAgICB0aGlzLl93YXRjaFN0YXRlQ2hhbmdlcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgbmdPbkRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcy51bnN1YnNjcmliZSgpO1xuICAgIH1cblxuICAgIG5nQWZ0ZXJDb250ZW50SW5pdCgpIHtcbiAgICAgICAgdGhpcy5fd2F0Y2hTdGF0ZUNoYW5nZXMoKTtcbiAgICB9XG5cbiAgICBfb3BlbihldmVudDogRXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZGF0ZXRpbWVwaWNrZXIgJiYgIXRoaXMuZGlzYWJsZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZGF0ZXRpbWVwaWNrZXIub3BlbigpO1xuICAgICAgICAgICAgZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwcml2YXRlIF93YXRjaFN0YXRlQ2hhbmdlcygpIHtcbiAgICAgICAgY29uc3QgZGF0ZXRpbWVwaWNrZXJEaXNhYmxlZCA9IHRoaXMuZGF0ZXRpbWVwaWNrZXIgPyB0aGlzLmRhdGV0aW1lcGlja2VyLl9kaXNhYmxlZENoYW5nZSA6IG9ic2VydmFibGVPZigpO1xuICAgICAgICBjb25zdCBpbnB1dERpc2FibGVkID0gdGhpcy5kYXRldGltZXBpY2tlciAmJiB0aGlzLmRhdGV0aW1lcGlja2VyLmRhdGV0aW1lcGlja2VySW5wdXQgPyB0aGlzLmRhdGV0aW1lcGlja2VyLmRhdGV0aW1lcGlja2VySW5wdXQuX2Rpc2FibGVkQ2hhbmdlIDogb2JzZXJ2YWJsZU9mKCk7XG4gICAgICAgIGNvbnN0IGRhdGV0aW1lcGlja2VyVG9nZ2xlZCA9IHRoaXMuZGF0ZXRpbWVwaWNrZXIgPyBtZXJnZSh0aGlzLmRhdGV0aW1lcGlja2VyLm9wZW5lZFN0cmVhbSwgdGhpcy5kYXRldGltZXBpY2tlci5jbG9zZWRTdHJlYW0pIDogb2JzZXJ2YWJsZU9mKCk7XG5cbiAgICAgICAgdGhpcy5fc3RhdGVDaGFuZ2VzLnVuc3Vic2NyaWJlKCk7XG4gICAgICAgIHRoaXMuX3N0YXRlQ2hhbmdlcyA9IG1lcmdlKHRoaXMuX2ludGwuY2hhbmdlcywgZGF0ZXRpbWVwaWNrZXJEaXNhYmxlZCBhcyBPYnNlcnZhYmxlPHZvaWQ+LCBpbnB1dERpc2FibGVkIGFzIE9ic2VydmFibGU8dm9pZD4sIGRhdGV0aW1lcGlja2VyVG9nZ2xlZCkuc3Vic2NyaWJlKCgpID0+IHRoaXMuX2NoYW5nZURldGVjdG9yUmVmLm1hcmtGb3JDaGVjaygpKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZWQ6IEJvb2xlYW5JbnB1dDtcbiAgICBzdGF0aWMgbmdBY2NlcHRJbnB1dFR5cGVfZGlzYWJsZVJpcHBsZTogQm9vbGVhbklucHV0O1xufVxuIiwiPGJ1dHRvbiAjYnV0dG9uXHJcbiAgICAgIG1hdC1pY29uLWJ1dHRvblxyXG4gICAgICB0eXBlPVwiYnV0dG9uXCJcclxuICAgICAgW2F0dHIuYXJpYS1oYXNwb3B1cF09XCJkYXRldGltZXBpY2tlciA/ICdkaWFsb2cnIDogbnVsbFwiXHJcbiAgICAgIFthdHRyLmFyaWEtbGFiZWxdPVwiYXJpYUxhYmVsIHx8IF9pbnRsLm9wZW5DYWxlbmRhckxhYmVsXCJcclxuICAgICAgW2F0dHIudGFiaW5kZXhdPVwiZGlzYWJsZWQgPyAtMSA6IHRhYkluZGV4XCJcclxuICAgICAgW2Rpc2FibGVkXT1cImRpc2FibGVkXCJcclxuICAgICAgW2Rpc2FibGVSaXBwbGVdPVwiZGlzYWJsZVJpcHBsZVwiPlxyXG4gICAgICA8bmctY29udGFpbmVyICpuZ0lmPVwiIV9jdXN0b21JY29uXCIgW25nU3dpdGNoXT1cImRhdGV0aW1lcGlja2VyLnR5cGVcIj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoQ2FzZT1cIid0aW1lJ1wiIFtpbm5lckhUTUxdPVwiaWNvbnMudGltZSB8IGFzd1NhZmVIdG1sXCI+PC9zcGFuPlxyXG4gICAgICAgICAgICA8c3BhbiAqbmdTd2l0Y2hDYXNlPVwiJ2RhdGV0aW1lJ1wiIFtpbm5lckhUTUxdPVwiaWNvbnMuZGF0ZVRpbWUgfCBhc3dTYWZlSHRtbFwiPjwvc3Bhbj5cclxuICAgICAgICAgICAgPHNwYW4gKm5nU3dpdGNoRGVmYXVsdCBbaW5uZXJIVE1MXT1cImljb25zLnRvZGF5IHwgYXN3U2FmZUh0bWxcIj48L3NwYW4+XHJcbiAgICAgIDwvbmctY29udGFpbmVyPlxyXG4gICAgICA8bmctY29udGVudCBzZWxlY3Q9XCJbYXN3RGF0ZXRpbWVwaWNrZXJUb2dnbGVJY29uXVwiPjwvbmctY29udGVudD5cclxuPC9idXR0b24+XHJcbiJdfQ==