@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
JavaScript
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==