UNPKG

ng-zorro-antd

Version:

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

305 lines 33.2 kB
import { __decorate } from "tslib"; /** * 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, forwardRef, Input, ViewEncapsulation } from '@angular/core'; import { NG_ASYNC_VALIDATORS, NG_VALUE_ACCESSOR, Validators } from '@angular/forms'; import { of, Subject } from 'rxjs'; import { takeUntil } from 'rxjs/operators'; import { parseExpression } from 'cron-parser'; import { InputBoolean } from 'ng-zorro-antd/core/util'; import * as i0 from "@angular/core"; import * as i1 from "@angular/forms"; import * as i2 from "ng-zorro-antd/i18n"; import * as i3 from "@angular/common"; import * as i4 from "./cron-expression-label.component"; import * as i5 from "./cron-expression-input.component"; import * as i6 from "./cron-expression-preview.component"; export class NzCronExpressionComponent { constructor(formBuilder, cdr, i18n) { this.formBuilder = formBuilder; this.cdr = cdr; this.i18n = i18n; this.nzSize = 'default'; this.nzType = 'linux'; this.nzCollapseDisable = false; this.nzExtra = null; this.nzSemantic = null; this.focus = false; this.labelFocus = null; this.validLabel = null; this.labels = []; this.nextTimeList = []; this.destroy$ = new Subject(); this.onChange = () => { }; this.onTouch = () => null; this.checkValid = (control) => { if (control.value) { try { const cron = []; this.labels.forEach(label => { label === this.validLabel ? cron.push(control.value) : cron.push('*'); }); parseExpression(cron.join(' ')); } catch (err) { return of({ error: true }); } } return of(null); }; } convertFormat(value) { const values = value.split(' '); const valueObject = {}; this.labels.map((a, b) => { valueObject[a] = values[b]; }); this.validateForm.patchValue(valueObject); } writeValue(value) { if (value) { this.convertFormat(value); } } registerOnChange(fn) { this.onChange = fn; } registerOnTouched(fn) { this.onTouch = fn; } validate() { if (this.validateForm.valid) { return of(null); } else { return of({ error: true }); } } ngOnInit() { if (this.nzType === 'spring') { this.labels = ['second', 'minute', 'hour', 'day', 'month', 'week']; this.validateForm = this.formBuilder.group({ second: ['0', Validators.required, this.checkValid], minute: ['*', Validators.required, this.checkValid], hour: ['*', Validators.required, this.checkValid], day: ['*', Validators.required, this.checkValid], month: ['*', Validators.required, this.checkValid], week: ['*', Validators.required, this.checkValid] }); } else { this.labels = ['minute', 'hour', 'day', 'month', 'week']; this.validateForm = this.formBuilder.group({ minute: ['*', Validators.required, this.checkValid], hour: ['*', Validators.required, this.checkValid], day: ['*', Validators.required, this.checkValid], month: ['*', Validators.required, this.checkValid], week: ['*', Validators.required, this.checkValid] }); } this.i18n.localeChange.pipe(takeUntil(this.destroy$)).subscribe(() => { this.locale = this.i18n.getLocaleData('CronExpression'); this.cdr.markForCheck(); }); this.previewDate(this.validateForm.value); this.validateForm.valueChanges.pipe(takeUntil(this.destroy$)).subscribe(value => { this.onChange(Object.values(value).join(' ')); this.previewDate(value); this.cdr.markForCheck(); }); } previewDate(value) { try { this.interval = parseExpression(Object.values(value).join(' ')); this.nextTimeList = [ this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate() ]; } catch (err) { return; } } loadMorePreview() { this.nextTimeList = [ ...this.nextTimeList, this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate(), this.interval.next().toDate() ]; this.cdr.markForCheck(); } focusEffect(value) { this.focus = true; this.labelFocus = value; this.cdr.markForCheck(); } blurEffect() { this.focus = false; this.labelFocus = null; this.cdr.markForCheck(); } getValue(item) { this.validLabel = item.label; this.validateForm.controls[item.label].patchValue(item.value); this.cdr.markForCheck(); } ngOnDestroy() { this.destroy$.next(); this.destroy$.complete(); } } NzCronExpressionComponent.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NzCronExpressionComponent, deps: [{ token: i1.UntypedFormBuilder }, { token: i0.ChangeDetectorRef }, { token: i2.NzI18nService }], target: i0.ɵɵFactoryTarget.Component }); NzCronExpressionComponent.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.1.0", type: NzCronExpressionComponent, selector: "nz-cron-expression", inputs: { nzSize: "nzSize", nzType: "nzType", nzCollapseDisable: "nzCollapseDisable", nzExtra: "nzExtra", nzSemantic: "nzSemantic" }, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true } ], exportAs: ["nzCronExpression"], ngImport: i0, template: ` <div class="ant-cron-expression"> <div class="ant-cron-expression-content"> <div class="ant-input ant-cron-expression-input-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-input-sm]="nzSize === 'small'" [class.ant-cron-expression-input-group-focus]="focus" [class.ant-cron-expression-input-group-error]="!validateForm.valid" [class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus" > <ng-container *ngFor="let label of labels"> <nz-cron-expression-input [value]="this.validateForm.controls[label].value" [label]="label" (focusEffect)="focusEffect($event)" (blurEffect)="blurEffect()" (getValue)="getValue($event)" ></nz-cron-expression-input> </ng-container> </div> <div class="ant-cron-expression-label-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-cron-expression-label-group-default]="nzSize === 'default'" [class.ant-input-sm]="nzSize === 'small'" > <ng-container *ngFor="let label of labels"> <nz-cron-expression-label [type]="label" [valid]="this.validateForm.controls[label].valid" [labelFocus]="labelFocus" [locale]="locale" ></nz-cron-expression-label> </ng-container> </div> <nz-cron-expression-preview *ngIf="!nzCollapseDisable" [TimeList]="nextTimeList" [visible]="validateForm.valid" [locale]="locale" [nzSemantic]="nzSemantic" (loadMorePreview)="loadMorePreview()" ></nz-cron-expression-preview> </div> <div class="ant-cron-expression-map" *ngIf="nzExtra"> <ng-template [ngTemplateOutlet]="nzExtra"></ng-template> </div> </div> `, isInline: true, dependencies: [{ kind: "directive", type: i3.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i4.NzCronExpressionLabelComponent, selector: "nz-cron-expression-label", inputs: ["type", "valid", "locale", "labelFocus"], exportAs: ["nzCronExpressionLabel"] }, { kind: "component", type: i5.NzCronExpressionInputComponent, selector: "nz-cron-expression-input", inputs: ["value", "label"], outputs: ["focusEffect", "blurEffect", "getValue"], exportAs: ["nzCronExpressionInput"] }, { kind: "component", type: i6.NzCronExpressionPreviewComponent, selector: "nz-cron-expression-preview", inputs: ["TimeList", "visible", "locale", "nzSemantic"], outputs: ["loadMorePreview"], exportAs: ["nzCronExpressionPreview"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); __decorate([ InputBoolean() ], NzCronExpressionComponent.prototype, "nzCollapseDisable", void 0); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.1.0", ngImport: i0, type: NzCronExpressionComponent, decorators: [{ type: Component, args: [{ changeDetection: ChangeDetectionStrategy.OnPush, encapsulation: ViewEncapsulation.None, selector: 'nz-cron-expression', exportAs: 'nzCronExpression', template: ` <div class="ant-cron-expression"> <div class="ant-cron-expression-content"> <div class="ant-input ant-cron-expression-input-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-input-sm]="nzSize === 'small'" [class.ant-cron-expression-input-group-focus]="focus" [class.ant-cron-expression-input-group-error]="!validateForm.valid" [class.ant-cron-expression-input-group-error-focus]="!validateForm.valid && focus" > <ng-container *ngFor="let label of labels"> <nz-cron-expression-input [value]="this.validateForm.controls[label].value" [label]="label" (focusEffect)="focusEffect($event)" (blurEffect)="blurEffect()" (getValue)="getValue($event)" ></nz-cron-expression-input> </ng-container> </div> <div class="ant-cron-expression-label-group" [class.ant-input-lg]="nzSize === 'large'" [class.ant-cron-expression-label-group-default]="nzSize === 'default'" [class.ant-input-sm]="nzSize === 'small'" > <ng-container *ngFor="let label of labels"> <nz-cron-expression-label [type]="label" [valid]="this.validateForm.controls[label].valid" [labelFocus]="labelFocus" [locale]="locale" ></nz-cron-expression-label> </ng-container> </div> <nz-cron-expression-preview *ngIf="!nzCollapseDisable" [TimeList]="nextTimeList" [visible]="validateForm.valid" [locale]="locale" [nzSemantic]="nzSemantic" (loadMorePreview)="loadMorePreview()" ></nz-cron-expression-preview> </div> <div class="ant-cron-expression-map" *ngIf="nzExtra"> <ng-template [ngTemplateOutlet]="nzExtra"></ng-template> </div> </div> `, providers: [ { provide: NG_ASYNC_VALIDATORS, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true }, { provide: NG_VALUE_ACCESSOR, useExisting: forwardRef(() => NzCronExpressionComponent), multi: true } ] }] }], ctorParameters: function () { return [{ type: i1.UntypedFormBuilder }, { type: i0.ChangeDetectorRef }, { type: i2.NzI18nService }]; }, propDecorators: { nzSize: [{ type: Input }], nzType: [{ type: Input }], nzCollapseDisable: [{ type: Input }], nzExtra: [{ type: Input }], nzSemantic: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3Jvbi1leHByZXNzaW9uLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL2NvbXBvbmVudHMvY3Jvbi1leHByZXNzaW9uL2Nyb24tZXhwcmVzc2lvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IjtBQUFBOzs7R0FHRztBQUVILE9BQU8sRUFDTCx1QkFBdUIsRUFFdkIsU0FBUyxFQUNULFVBQVUsRUFDVixLQUFLLEVBSUwsaUJBQWlCLEVBQ2xCLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFJTCxtQkFBbUIsRUFDbkIsaUJBQWlCLEVBSWpCLFVBQVUsRUFDWCxNQUFNLGdCQUFnQixDQUFDO0FBQ3hCLE9BQU8sRUFBYyxFQUFFLEVBQUUsT0FBTyxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBQy9DLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQztBQUUzQyxPQUFPLEVBQWtCLGVBQWUsRUFBRSxNQUFNLGFBQWEsQ0FBQztBQUc5RCxPQUFPLEVBQUUsWUFBWSxFQUFFLE1BQU0seUJBQXlCLENBQUM7Ozs7Ozs7O0FBeUV2RCxNQUFNLE9BQU8seUJBQXlCO0lBb0RwQyxZQUFvQixXQUErQixFQUFVLEdBQXNCLEVBQVUsSUFBbUI7UUFBNUYsZ0JBQVcsR0FBWCxXQUFXLENBQW9CO1FBQVUsUUFBRyxHQUFILEdBQUcsQ0FBbUI7UUFBVSxTQUFJLEdBQUosSUFBSSxDQUFlO1FBbkR2RyxXQUFNLEdBQXlCLFNBQVMsQ0FBQztRQUN6QyxXQUFNLEdBQXVCLE9BQU8sQ0FBQztRQUNyQixzQkFBaUIsR0FBWSxLQUFLLENBQUM7UUFDbkQsWUFBTyxHQUE4QixJQUFJLENBQUM7UUFDMUMsZUFBVSxHQUE2QixJQUFJLENBQUM7UUFHckQsVUFBSyxHQUFZLEtBQUssQ0FBQztRQUN2QixlQUFVLEdBQW9CLElBQUksQ0FBQztRQUNuQyxlQUFVLEdBQWtCLElBQUksQ0FBQztRQUNqQyxXQUFNLEdBQWUs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LEdBQUcsRUFBRSwwQkFBMEIsQ0FBQzs0QkFDeEQsS0FBSyxFQUFFLElBQUk7eUJBQ1o7cUJBQ0Y7aUJBQ0Y7cUtBRVUsTUFBTTtzQkFBZCxLQUFLO2dCQUNHLE1BQU07c0JBQWQsS0FBSztnQkFDbUIsaUJBQWlCO3NCQUF6QyxLQUFLO2dCQUNHLE9BQU87c0JBQWYsS0FBSztnQkFDRyxVQUFVO3NCQUFsQixLQUFLIiwic291cmNlc0NvbnRlbnQiOlsiLyoqXG4gKiBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhbiBNSVQtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZVxuICogZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZSBhdCBodHRwczovL2dpdGh1Yi5jb20vTkctWk9SUk8vbmctem9ycm8tYW50ZC9ibG9iL21hc3Rlci9MSUNFTlNFXG4gKi9cblxuaW1wb3J0IHtcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENoYW5nZURldGVjdG9yUmVmLFxuICBDb21wb25lbnQsXG4gIGZvcndhcmRSZWYsXG4gIElucHV0LFxuICBPbkRlc3Ryb3ksXG4gIE9uSW5pdCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdFbmNhcHN1bGF0aW9uXG59IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHtcbiAgQXN5bmNWYWxpZGF0b3IsXG4gIENvbnRyb2xWYWx1ZUFjY2Vzc29yLFxuICBGb3JtQ29udHJvbCxcbiAgTkdfQVNZTkNfVkFMSURBVE9SUyxcbiAgTkdfVkFMVUVfQUNDRVNTT1IsXG4gIFVudHlwZWRGb3JtQnVpbGRlcixcbiAgVW50eXBlZEZvcm1Hcm91cCxcbiAgVmFsaWRhdGlvbkVycm9ycyxcbiAgVmFsaWRhdG9yc1xufSBmcm9tICdAYW5ndWxhci9mb3Jtcyc7XG5pbXBvcnQgeyBPYnNlcnZhYmxlLCBvZiwgU3ViamVjdCB9IGZyb20gJ3J4anMnO1xuaW1wb3J0IHsgdGFrZVVudGlsIH0gZnJvbSAncnhqcy9vcGVyYXRvcnMnO1xuXG5pbXBvcnQgeyBDcm9uRXhwcmVzc2lvbiwgcGFyc2VFeHByZXNzaW9uIH0gZnJvbSAnY3Jvbi1wYXJzZXInO1xuXG5pbXBvcnQgeyBOelNhZmVBbnkgfSBmcm9tICduZy16b3Jyby1hbnRkL2NvcmUvdHlwZXMnO1xuaW1wb3J0IHsgSW5wdXRCb29sZWFuIH0gZnJvbSAnbmctem9ycm8tYW50ZC9jb3JlL3V0aWwnO1xuaW1wb3J0IHsgTnpDcm9uRXhwcmVzc2lvbkkxOG5JbnRlcmZhY2UsIE56STE4blNlcnZpY2UgfSBmcm9tICduZy16b3Jyby1hbnRkL2kxOG4nO1xuXG5pbXBvcnQgeyBDcm9uQ2hhbmdlVHlwZSwgQ3JvblR5cGUsIE56Q3JvbkV4cHJlc3Npb25TaXplLCBUaW1lVHlwZSB9IGZyb20gJy4vdHlwaW5ncyc7XG5cbkBDb21wb25lbnQoe1xuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbiAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgc2VsZWN0b3I6ICduei1jcm9uLWV4cHJlc3Npb24nLFxuICBleHBvcnRBczogJ256Q3JvbkV4cHJlc3Npb24nLFxuICB0ZW1wbGF0ZTogYFxuICAgIDxkaXYgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uXCI+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1jb250ZW50XCI+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICBjbGFzcz1cImFudC1pbnB1dCBhbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgICAgIFtjbGFzcy5hbnQtY3Jvbi1leHByZXNzaW9uLWlucHV0LWdyb3VwLWZvY3VzXT1cImZvY3VzXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWNyb24tZXhwcmVzc2lvbi1pbnB1dC1ncm91cC1lcnJvcl09XCIhdmFsaWRhdGVGb3JtLnZhbGlkXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWNyb24tZXhwcmVzc2lvbi1pbnB1dC1ncm91cC1lcnJvci1mb2N1c109XCIhdmFsaWRhdGVGb3JtLnZhbGlkICYmIGZvY3VzXCJcbiAgICAgICAgPlxuICAgICAgICAgIDxuZy1jb250YWluZXIgKm5nRm9yPVwibGV0IGxhYmVsIG9mIGxhYmVsc1wiPlxuICAgICAgICAgICAgPG56LWNyb24tZXhwcmVzc2lvbi1pbnB1dFxuICAgICAgICAgICAgICBbdmFsdWVdPVwidGhpcy52YWxpZGF0ZUZvcm0uY29udHJvbHNbbGFiZWxdLnZhbHVlXCJcbiAgICAgICAgICAgICAgW2xhYmVsXT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgKGZvY3VzRWZmZWN0KT1cImZvY3VzRWZmZWN0KCRldmVudClcIlxuICAgICAgICAgICAgICAoYmx1ckVmZmVjdCk9XCJibHVyRWZmZWN0KClcIlxuICAgICAgICAgICAgICAoZ2V0VmFsdWUpPVwiZ2V0VmFsdWUoJGV2ZW50KVwiXG4gICAgICAgICAgICA+PC9uei1jcm9uLWV4cHJlc3Npb24taW5wdXQ+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8ZGl2XG4gICAgICAgICAgY2xhc3M9XCJhbnQtY3Jvbi1leHByZXNzaW9uLWxhYmVsLWdyb3VwXCJcbiAgICAgICAgICBbY2xhc3MuYW50LWlucHV0LWxnXT1cIm56U2l6ZSA9PT0gJ2xhcmdlJ1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1jcm9uLWV4cHJlc3Npb24tbGFiZWwtZ3JvdXAtZGVmYXVsdF09XCJuelNpemUgPT09ICdkZWZhdWx0J1wiXG4gICAgICAgICAgW2NsYXNzLmFudC1pbnB1dC1zbV09XCJuelNpemUgPT09ICdzbWFsbCdcIlxuICAgICAgICA+XG4gICAgICAgICAgPG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGFiZWwgb2YgbGFiZWxzXCI+XG4gICAgICAgICAgICA8bnotY3Jvbi1leHByZXNzaW9uLWxhYmVsXG4gICAgICAgICAgICAgIFt0eXBlXT1cImxhYmVsXCJcbiAgICAgICAgICAgICAgW3ZhbGlkXT1cInRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2xhYmVsXS52YWxpZFwiXG4gICAgICAgICAgICAgIFtsYWJlbEZvY3VzXT1cImxhYmVsRm9jdXNcIlxuICAgICAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgICA+PC9uei1jcm9uLWV4cHJlc3Npb24tbGFiZWw+XG4gICAgICAgICAgPC9uZy1jb250YWluZXI+XG4gICAgICAgIDwvZGl2PlxuICAgICAgICA8bnotY3Jvbi1leHByZXNzaW9uLXByZXZpZXdcbiAgICAgICAgICAqbmdJZj1cIiFuekNvbGxhcHNlRGlzYWJsZVwiXG4gICAgICAgICAgW1RpbWVMaXN0XT1cIm5leHRUaW1lTGlzdFwiXG4gICAgICAgICAgW3Zpc2libGVdPVwidmFsaWRhdGVGb3JtLnZhbGlkXCJcbiAgICAgICAgICBbbG9jYWxlXT1cImxvY2FsZVwiXG4gICAgICAgICAgW256U2VtYW50aWNdPVwibnpTZW1hbnRpY1wiXG4gICAgICAgICAgKGxvYWRNb3JlUHJldmlldyk9XCJsb2FkTW9yZVByZXZpZXcoKVwiXG4gICAgICAgID48L256LWNyb24tZXhwcmVzc2lvbi1wcmV2aWV3PlxuICAgICAgPC9kaXY+XG4gICAgICA8ZGl2IGNsYXNzPVwiYW50LWNyb24tZXhwcmVzc2lvbi1tYXBcIiAqbmdJZj1cIm56RXh0cmFcIj5cbiAgICAgICAgPG5nLXRlbXBsYXRlIFtuZ1RlbXBsYXRlT3V0bGV0XT1cIm56RXh0cmFcIj48L25nLXRlbXBsYXRlPlxuICAgICAgPC9kaXY+XG4gICAgPC9kaXY+XG4gIGAsXG4gIHByb3ZpZGVyczogW1xuICAgIHtcbiAgICAgIHByb3ZpZGU6IE5HX0FTWU5DX1ZBTElEQVRPUlMsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBOekNyb25FeHByZXNzaW9uQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlXG4gICAgfSxcbiAgICB7XG4gICAgICBwcm92aWRlOiBOR19WQUxVRV9BQ0NFU1NPUixcbiAgICAgIHVzZUV4aXN0aW5nOiBmb3J3YXJkUmVmKCgpID0+IE56Q3JvbkV4cHJlc3Npb25Db21wb25lbnQpLFxuICAgICAgbXVsdGk6IHRydWVcbiAgICB9XG4gIF1cbn0pXG5leHBvcnQgY2xhc3MgTnpDcm9uRXhwcmVzc2lvbkNvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIEFzeW5jVmFsaWRhdG9yLCBPbkRlc3Ryb3kge1xuICBASW5wdXQoKSBuelNpemU6IE56Q3JvbkV4cHJlc3Npb25TaXplID0gJ2RlZmF1bHQnO1xuICBASW5wdXQoKSBuelR5cGU6ICdsaW51eCcgfCAnc3ByaW5nJyA9ICdsaW51eCc7XG4gIEBJbnB1dCgpIEBJbnB1dEJvb2xlYW4oKSBuekNvbGxhcHNlRGlzYWJsZTogYm9vbGVhbiA9IGZhbHNlO1xuICBASW5wdXQoKSBuekV4dHJhPzogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcbiAgQElucHV0KCkgbnpTZW1hbnRpYzogVGVtcGxhdGVSZWY8dm9pZD4gfCBudWxsID0gbnVsbDtcblxuICBsb2NhbGUhOiBOekNyb25FeHByZXNzaW9uSTE4bkludGVyZmFjZTtcbiAgZm9jdXM6IGJvb2xlYW4gPSBmYWxzZTtcbiAgbGFiZWxGb2N1czogVGltZVR5cGUgfCBudWxsID0gbnVsbDtcbiAgdmFsaWRMYWJlbDogc3RyaW5nIHwgbnVsbCA9IG51bGw7XG4gIGxhYmVsczogVGltZVR5cGVbXSA9IFtdO1xuICBpbnRlcnZhbCE6IENyb25FeHByZXNzaW9uPGZhbHNlPjtcbiAgbmV4dFRpbWVMaXN0OiBEYXRlW10gPSBbXTtcbiAgcHJpdmF0ZSBkZXN0cm95JCA9IG5ldyBTdWJqZWN0PHZvaWQ+KCk7XG5cbiAgdmFsaWRhdGVGb3JtITogVW50eXBlZEZvcm1Hcm91cDtcblxuICBvbkNoYW5nZTogTnpTYWZlQW55ID0gKCkgPT4ge307XG4gIG9uVG91Y2g6ICgpID0+IHZvaWQgPSAoKSA9PiBudWxsO1xuXG4gIGNvbnZlcnRGb3JtYXQodmFsdWU6IHN0cmluZyk6IHZvaWQge1xuICAgIGNvbnN0IHZhbHVlcyA9IHZhbHVlLnNwbGl0KCcgJyk7XG4gICAgY29uc3QgdmFsdWVPYmplY3Q6IENyb25UeXBlID0ge307XG4gICAgdGhpcy5sYWJlbHMubWFwKChhLCBiKSA9PiB7XG4gICAgICB2YWx1ZU9iamVjdFthXSA9IHZhbHVlc1tiXTtcbiAgICB9KTtcbiAgICB0aGlzLnZhbGlkYXRlRm9ybS5wYXRjaFZhbHVlKHZhbHVlT2JqZWN0KTtcbiAgfVxuXG4gIHdyaXRlVmFsdWUodmFsdWU6IHN0cmluZyB8IG51bGwpOiB2b2lkIHtcbiAgICBpZiAodmFsdWUpIHtcbiAgICAgIHRoaXMuY29udmVydEZvcm1hdCh2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgcmVnaXN0ZXJPbkNoYW5nZShmbjogTnpTYWZlQW55KTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG5cbiAgcmVnaXN0ZXJPblRvdWNoZWQoZm46IE56U2FmZUFueSk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaCA9IGZuO1xuICB9XG5cbiAgdmFsaWRhdGUoKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4ge1xuICAgIGlmICh0aGlzLnZhbGlkYXRlRm9ybS52YWxpZCkge1xuICAgICAgcmV0dXJuIG9mKG51bGwpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gb2YoeyBlcnJvcjogdHJ1ZSB9KTtcbiAgICB9XG4gIH1cblxuICBjb25zdHJ1Y3Rvcihwcml2YXRlIGZvcm1CdWlsZGVyOiBVbnR5cGVkRm9ybUJ1aWxkZXIsIHByaXZhdGUgY2RyOiBDaGFuZ2VEZXRlY3RvclJlZiwgcHJpdmF0ZSBpMThuOiBOekkxOG5TZXJ2aWNlKSB7fVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIGlmICh0aGlzLm56VHlwZSA9PT0gJ3NwcmluZycpIHtcbiAgICAgIHRoaXMubGFiZWxzID0gWydzZWNvbmQnLCAnbWludXRlJywgJ2hvdXInLCAnZGF5JywgJ21vbnRoJywgJ3dlZWsnXTtcbiAgICAgIHRoaXMudmFsaWRhdGVGb3JtID0gdGhpcy5mb3JtQnVpbGRlci5ncm91cCh7XG4gICAgICAgIHNlY29uZDogWycwJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgbWludXRlOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBob3VyOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICBkYXk6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIG1vbnRoOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdLFxuICAgICAgICB3ZWVrOiBbJyonLCBWYWxpZGF0b3JzLnJlcXVpcmVkLCB0aGlzLmNoZWNrVmFsaWRdXG4gICAgICB9KTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5sYWJlbHMgPSBbJ21pbnV0ZScsICdob3VyJywgJ2RheScsICdtb250aCcsICd3ZWVrJ107XG4gICAgICB0aGlzLnZhbGlkYXRlRm9ybSA9IHRoaXMuZm9ybUJ1aWxkZXIuZ3JvdXAoe1xuICAgICAgICBtaW51dGU6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIGhvdXI6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIGRheTogWycqJywgVmFsaWRhdG9ycy5yZXF1aXJlZCwgdGhpcy5jaGVja1ZhbGlkXSxcbiAgICAgICAgbW9udGg6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF0sXG4gICAgICAgIHdlZWs6IFsnKicsIFZhbGlkYXRvcnMucmVxdWlyZWQsIHRoaXMuY2hlY2tWYWxpZF1cbiAgICAgIH0pO1xuICAgIH1cbiAgICB0aGlzLmkxOG4ubG9jYWxlQ2hhbmdlLnBpcGUodGFrZVVudGlsKHRoaXMuZGVzdHJveSQpKS5zdWJzY3JpYmUoKCkgPT4ge1xuICAgICAgdGhpcy5sb2NhbGUgPSB0aGlzLmkxOG4uZ2V0TG9jYWxlRGF0YSgnQ3JvbkV4cHJlc3Npb24nKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuXG4gICAgdGhpcy5wcmV2aWV3RGF0ZSh0aGlzLnZhbGlkYXRlRm9ybS52YWx1ZSk7XG5cbiAgICB0aGlzLnZhbGlkYXRlRm9ybS52YWx1ZUNoYW5nZXMucGlwZSh0YWtlVW50aWwodGhpcy5kZXN0cm95JCkpLnN1YnNjcmliZSh2YWx1ZSA9PiB7XG4gICAgICB0aGlzLm9uQ2hhbmdlKE9iamVjdC52YWx1ZXModmFsdWUpLmpvaW4oJyAnKSk7XG4gICAgICB0aGlzLnByZXZpZXdEYXRlKHZhbHVlKTtcbiAgICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICAgIH0pO1xuICB9XG5cbiAgcHJldmlld0RhdGUodmFsdWU6IENyb25UeXBlKTogdm9pZCB7XG4gICAgdHJ5IHtcbiAgICAgIHRoaXMuaW50ZXJ2YWwgPSBwYXJzZUV4cHJlc3Npb24oT2JqZWN0LnZhbHVlcyh2YWx1ZSkuam9pbignICcpKTtcbiAgICAgIHRoaXMubmV4dFRpbWVMaXN0ID0gW1xuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKClcbiAgICAgIF07XG4gICAgfSBjYXRjaCAoZXJyOiBOelNhZmVBbnkpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gIH1cblxuICBsb2FkTW9yZVByZXZpZXcoKTogdm9pZCB7XG4gICAgdGhpcy5uZXh0VGltZUxpc3QgPSBbXG4gICAgICAuLi50aGlzLm5leHRUaW1lTGlzdCxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKCksXG4gICAgICB0aGlzLmludGVydmFsLm5leHQoKS50b0RhdGUoKSxcbiAgICAgIHRoaXMuaW50ZXJ2YWwubmV4dCgpLnRvRGF0ZSgpLFxuICAgICAgdGhpcy5pbnRlcnZhbC5uZXh0KCkudG9EYXRlKClcbiAgICBdO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZm9jdXNFZmZlY3QodmFsdWU6IFRpbWVUeXBlKTogdm9pZCB7XG4gICAgdGhpcy5mb2N1cyA9IHRydWU7XG4gICAgdGhpcy5sYWJlbEZvY3VzID0gdmFsdWU7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBibHVyRWZmZWN0KCk6IHZvaWQge1xuICAgIHRoaXMuZm9jdXMgPSBmYWxzZTtcbiAgICB0aGlzLmxhYmVsRm9jdXMgPSBudWxsO1xuICAgIHRoaXMuY2RyLm1hcmtGb3JDaGVjaygpO1xuICB9XG5cbiAgZ2V0VmFsdWUoaXRlbTogQ3JvbkNoYW5nZVR5cGUpOiB2b2lkIHtcbiAgICB0aGlzLnZhbGlkTGFiZWwgPSBpdGVtLmxhYmVsO1xuICAgIHRoaXMudmFsaWRhdGVGb3JtLmNvbnRyb2xzW2l0ZW0ubGFiZWxdLnBhdGNoVmFsdWUoaXRlbS52YWx1ZSk7XG4gICAgdGhpcy5jZHIubWFya0ZvckNoZWNrKCk7XG4gIH1cblxuICBjaGVja1ZhbGlkID0gKGNvbnRyb2w6IEZvcm1Db250cm9sKTogT2JzZXJ2YWJsZTxWYWxpZGF0aW9uRXJyb3JzIHwgbnVsbD4gPT4ge1xuICAgIGlmIChjb250cm9sLnZhbHVlKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBjcm9uOiBzdHJpbmdbXSA9IFtdO1xuICAgICAgICB0aGlzLmxhYmVscy5mb3JFYWNoKGxhYmVsID0+IHtcbiAgICAgICAgICBsYWJlbCA9PT0gdGhpcy52YWxpZExhYmVsID8gY3Jvbi5wdXNoKGNvbnRyb2wudmFsdWUpIDogY3Jvbi5wdXNoKCcqJyk7XG4gICAgICAgIH0pO1xuICAgICAgICBwYXJzZUV4cHJlc3Npb24oY3Jvbi5qb2luKCcgJykpO1xuICAgICAgfSBjYXRjaCAoZXJyOiB1bmtub3duKSB7XG4gICAgICAgIHJldHVybiBvZih7IGVycm9yOiB0cnVlIH0pO1xuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2YobnVsbCk7XG4gIH07XG5cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgdGhpcy5kZXN0cm95JC5uZXh0KCk7XG4gICAgdGhpcy5kZXN0cm95JC5jb21wbGV0ZSgpO1xuICB9XG59XG4iXX0=