@c8y/ngx-components
Version:
Angular modules for Cumulocity IoT applications
148 lines • 20.8 kB
JavaScript
import { Component, EventEmitter, Input, Output, TemplateRef, ViewChild } from '@angular/core';
import { BsModalRef } from 'ngx-bootstrap/modal';
import { filter } from 'rxjs/operators';
import { WizardOutletComponent } from './wizard-outlet/wizard-outlet.component';
import { WizardService } from './wizard.service';
import * as i0 from "@angular/core";
import * as i1 from "./wizard.service";
import * as i2 from "ngx-bootstrap/modal";
import * as i3 from "@angular/common";
import * as i4 from "../common/icon.directive";
import * as i5 from "../i18n/c8y-translate.directive";
import * as i6 from "./wizard-outlet/wizard-outlet.component";
import * as i7 from "../i18n/c8y-translate.pipe";
/**
* A generic component that is intended to serve as the building block of more wizards.
*
* **Example**
* ```html
* <button
* title="Add application"
* class="btn btn-primary"
* (click)="addApplication()"
* >
* Add application
* </button>
* ```
*
* ```ts
* import { Component } from '@angular/core';
* import { WizardConfig, WizardService, Wizard } from '@c8y/ngx-components';
* import { ModalOptions } from 'ngx-bootstrap/modal';
*
* @Component({
* selector: 'c8y-add-application-wizard',
* templateUrl: './templatePath'
* })
* export class AddApplicationWizardComponent {
* constructor(private wizardService: WizardService) {}
*
* addApplication() {
* const wizardConfig: WizardConfig = {
* headerText: 'Add Application',
* headerIcon: 'c8y-icon-modules',
* bodyHeaderText: 'Select methods',
* bodyHeaderIcon: 'c8y-icon-modules'
* };
*
* const initialState: Wizard = {
* wizardConfig,
* id: 'uploadApplication'
* };
*
* const modalOptions: ModalOptions = { initialState };
*
* this.wizardService.show(modalOptions);
* }
* }
* ```
*/
export class WizardComponent {
constructor(wizardService, bsModalRef) {
this.wizardService = wizardService;
this.bsModalRef = bsModalRef;
/**
* A configuration object that allows you to set header values, both text and icon.
*/
this.wizardConfig = {};
/**
* A state that will be assigned to the actual component contained by the wizard.
*/
this.componentInitialState = {};
/**
* The event that is emitted when the wizard is closed.
*/
this.onClose = new EventEmitter();
/**
* The event that is emitted when the wizard is reseted.
*/
this.onReset = new EventEmitter();
/**
* The event that is emitted when the wizard entry is clicked.
*/
this.onSelect = new EventEmitter();
this.headerTemplate$ = this.wizardService.headerTemplate$.pipe(filter(header => header.wizardId === this.id));
this.bodyTemplate$ = this.wizardService.bodyTemplate$.pipe(filter(body => body.wizardId === this.id));
this.footerTemplate$ = this.wizardService.footerTemplate$.pipe(filter(footer => footer.wizardId === this.id));
}
ngOnInit() {
this.emitTemplates();
}
/**
* Resets the wizard.
* @param result Custom result object which will be emitted via onReset output.
*/
reset(result) {
this.outlet.reset();
this.onReset.emit(result);
this.emitTemplates();
}
/**
* Closes the wizard.
* @param result Custom result object which will be emitted via onClose output.
*/
close(result) {
this.onClose.emit(result);
this.onClose.complete();
this.bsModalRef.hide();
}
onPath() {
this.close();
}
emitTemplates() {
setTimeout(() => {
this.wizardService.headerTemplate$.next({ template: this.header, wizardId: this.id });
this.wizardService.bodyTemplate$.next({ template: this.body, wizardId: this.id });
this.wizardService.footerTemplate$.next({ template: this.footer, wizardId: this.id });
});
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardComponent, deps: [{ token: i1.WizardService }, { token: i2.BsModalRef }], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "18.2.13", type: WizardComponent, selector: "c8y-wizard", inputs: { id: "id", wizardConfig: "wizardConfig" }, outputs: { onClose: "onClose", onReset: "onReset", onSelect: "onSelect" }, viewQueries: [{ propertyName: "header", first: true, predicate: ["headerRef"], descendants: true, static: true }, { propertyName: "body", first: true, predicate: ["bodyRef"], descendants: true, static: true }, { propertyName: "footer", first: true, predicate: ["footerRef"], descendants: true, static: true }, { propertyName: "outlet", first: true, predicate: WizardOutletComponent, descendants: true }], ngImport: i0, template: "<div class=\"viewport-modal animated fadeIn\">\n <ng-template *ngTemplateOutlet=\"(headerTemplate$ | async)?.template\"></ng-template>\n\n <ng-template #headerRef>\n <div class=\"modal-header dialog-header animated fadeIn\">\n <i [c8yIcon]=\"wizardConfig.headerIcon\"></i>\n <h4 id=\"modal-title\">{{ wizardConfig.headerText | translate }}</h4>\n </div>\n </ng-template>\n\n <ng-template *ngTemplateOutlet=\"(bodyTemplate$ | async)?.template\"></ng-template>\n\n <ng-template #bodyRef>\n <div class=\"p-16 p-t-8 text-center\" *ngIf=\"wizardConfig.bodyHeaderText\">\n <div class=\"c8y-wizard-nav\">\n <i [c8yIcon]=\"wizardConfig.bodyHeaderIcon\"></i>\n <span>{{ wizardConfig.bodyHeaderText | translate }}</span>\n </div>\n </div>\n </ng-template>\n <c8y-wizard-outlet\n [initialState]=\"componentInitialState\"\n [id]=\"id\"\n (onSelect)=\"onSelect.emit($event)\"\n (onPath)=\"onPath()\"\n ></c8y-wizard-outlet>\n\n <ng-template *ngTemplateOutlet=\"(footerTemplate$ | async)?.template\"></ng-template>\n <ng-template #footerRef>\n <div class=\"modal-footer animated fadeIn\">\n <button\n (click)=\"close()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n >\n <span translate>Cancel</span>\n </button>\n </div>\n </ng-template>\n</div>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i3.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i4.IconDirective, selector: "[c8yIcon]", inputs: ["c8yIcon"] }, { kind: "directive", type: i5.C8yTranslateDirective, selector: "[translate],[ngx-translate]" }, { kind: "component", type: i6.WizardOutletComponent, selector: "c8y-wizard-outlet", inputs: ["initialState", "id"], outputs: ["onSelect", "onPath"] }, { kind: "pipe", type: i3.AsyncPipe, name: "async" }, { kind: "pipe", type: i7.C8yTranslatePipe, name: "translate" }] }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "18.2.13", ngImport: i0, type: WizardComponent, decorators: [{
type: Component,
args: [{ selector: 'c8y-wizard', template: "<div class=\"viewport-modal animated fadeIn\">\n <ng-template *ngTemplateOutlet=\"(headerTemplate$ | async)?.template\"></ng-template>\n\n <ng-template #headerRef>\n <div class=\"modal-header dialog-header animated fadeIn\">\n <i [c8yIcon]=\"wizardConfig.headerIcon\"></i>\n <h4 id=\"modal-title\">{{ wizardConfig.headerText | translate }}</h4>\n </div>\n </ng-template>\n\n <ng-template *ngTemplateOutlet=\"(bodyTemplate$ | async)?.template\"></ng-template>\n\n <ng-template #bodyRef>\n <div class=\"p-16 p-t-8 text-center\" *ngIf=\"wizardConfig.bodyHeaderText\">\n <div class=\"c8y-wizard-nav\">\n <i [c8yIcon]=\"wizardConfig.bodyHeaderIcon\"></i>\n <span>{{ wizardConfig.bodyHeaderText | translate }}</span>\n </div>\n </div>\n </ng-template>\n <c8y-wizard-outlet\n [initialState]=\"componentInitialState\"\n [id]=\"id\"\n (onSelect)=\"onSelect.emit($event)\"\n (onPath)=\"onPath()\"\n ></c8y-wizard-outlet>\n\n <ng-template *ngTemplateOutlet=\"(footerTemplate$ | async)?.template\"></ng-template>\n <ng-template #footerRef>\n <div class=\"modal-footer animated fadeIn\">\n <button\n (click)=\"close()\"\n type=\"button\"\n class=\"btn btn-default\"\n title=\"{{ 'Cancel' | translate }}\"\n >\n <span translate>Cancel</span>\n </button>\n </div>\n </ng-template>\n</div>\n" }]
}], ctorParameters: () => [{ type: i1.WizardService }, { type: i2.BsModalRef }], propDecorators: { header: [{
type: ViewChild,
args: ['headerRef', { static: true }]
}], body: [{
type: ViewChild,
args: ['bodyRef', { static: true }]
}], footer: [{
type: ViewChild,
args: ['footerRef', { static: true }]
}], outlet: [{
type: ViewChild,
args: [WizardOutletComponent]
}], id: [{
type: Input
}], wizardConfig: [{
type: Input
}], onClose: [{
type: Output
}], onReset: [{
type: Output
}], onSelect: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL2NvcmUvd2l6YXJkL3dpemFyZC5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9jb3JlL3dpemFyZC93aXphcmQuY29tcG9uZW50Lmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNMLFNBQVMsRUFDVCxZQUFZLEVBQ1osS0FBSyxFQUVMLE1BQU0sRUFDTixXQUFXLEVBQ1gsU0FBUyxFQUNWLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxxQkFBcUIsQ0FBQztBQUNqRCxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDeEMsT0FBTyxFQUFFLHFCQUFxQixFQUFFLE1BQU0seUNBQXlDLENBQUM7QUFFaEYsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLGtCQUFrQixDQUFDOzs7Ozs7Ozs7QUFFakQ7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQTZDRztBQU1ILE1BQU0sT0FBTyxlQUFlO0lBd0MxQixZQUFtQixhQUE0QixFQUFTLFVBQXNCO1FBQTNELGtCQUFhLEdBQWIsYUFBYSxDQUFlO1FBQVMsZUFBVSxHQUFWLFVBQVUsQ0FBWTtRQTlCOUU7O1dBRUc7UUFDTSxpQkFBWSxHQUFpQixFQUFFLENBQUM7UUFDekM7O1dBRUc7UUFDSCwwQkFBcUIsR0FBZSxFQUFFLENBQUM7UUFDdkM7O1dBRUc7UUFDTyxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUQ7O1dBRUc7UUFDTyxZQUFPLEdBQXNCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUQ7O1dBRUc7UUFDTyxhQUFRLEdBQThCLElBQUksWUFBWSxFQUFFLENBQUM7UUFDMUQsb0JBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ2hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUM5QyxDQUFDO1FBQ08sa0JBQWEsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGFBQWEsQ0FBQyxJQUFJLENBQzVELE1BQU0sQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLElBQUksQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUMxQyxDQUFDO1FBQ08sb0JBQWUsR0FBRyxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQ2hFLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE1BQU0sQ0FBQyxRQUFRLEtBQUssSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUM5QyxDQUFDO0lBRStFLENBQUM7SUFFbEYsUUFBUTtRQUNOLElBQUksQ0FBQyxhQUFhLEVBQUUsQ0FBQztJQUN2QixDQUFDO0lBRUQ7OztPQUdHO0lBQ0gsS0FBSyxDQUFDLE1BQVk7UUFDaEIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLEVBQUUsQ0FBQztRQUNwQixJQUFJLENBQUMsT0FBTyxDQUFDLElBQUksQ0FBQyxNQUFNLENBQUMsQ0FBQztRQUMxQixJQUFJLENBQUMsYUFBYSxFQUFFLENBQUM7SUFDdkIsQ0FBQztJQUVEOzs7T0FHRztJQUNILEtBQUssQ0FBQyxNQUFZO1FBQ2hCLElBQUksQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLE1BQU0sQ0FBQyxDQUFDO1FBQzFCLElBQUksQ0FBQyxPQUFPLENBQUMsUUFBUSxFQUFFLENBQUM7UUFDeEIsSUFBSSxDQUFDLFVBQVUsQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN6QixDQUFDO0lBRUQsTUFBTTtRQUNKLElBQUksQ0FBQyxLQUFLLEVBQUUsQ0FBQztJQUNmLENBQUM7SUFFTyxhQUFhO1FBQ25CLFVBQVUsQ0FBQyxHQUFHLEVBQUU7WUFDZCxJQUFJLENBQUMsYUFBYSxDQUFDLGVBQWUsQ0FBQyxJQUFJLENBQUMsRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLE1BQU0sRUFBRSxRQUFRLEVBQUUsSUFBSSxDQUFDLEVBQUUsRUFBRSxDQUFDLENBQUM7WUFDdEYsSUFBSSxDQUFDLGFBQWEsQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDO1lBQ2xGLElBQUksQ0FBQyxhQUFhLENBQUMsZUFBZSxDQUFDLElBQUksQ0FBQyxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsTUFBTSxFQUFFLFFBQVEsRUFBRSxJQUFJLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQztRQUN4RixDQUFDLENBQUMsQ0FBQztJQUNMLENBQUM7K0dBNUVVLGVBQWU7bUdBQWYsZUFBZSxpZ0JBSWYscUJBQXFCLGdEQ3RFbEMsMDNDQXlDQTs7NEZEeUJhLGVBQWU7a0JBSjNCLFNBQVM7K0JBQ0UsWUFBWTsyR0FJb0IsTUFBTTtzQkFBL0MsU0FBUzt1QkFBQyxXQUFXLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFO2dCQUNBLElBQUk7c0JBQTNDLFNBQVM7dUJBQUMsU0FBUyxFQUFFLEVBQUUsTUFBTSxFQUFFLElBQUksRUFBRTtnQkFDSSxNQUFNO3NCQUEvQyxTQUFTO3VCQUFDLFdBQVcsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUU7Z0JBQ04sTUFBTTtzQkFBdkMsU0FBUzt1QkFBQyxxQkFBcUI7Z0JBS3ZCLEVBQUU7c0JBQVYsS0FBSztnQkFJRyxZQUFZO3NCQUFwQixLQUFLO2dCQVFJLE9BQU87c0JBQWhCLE1BQU07Z0JBSUcsT0FBTztzQkFBaEIsTUFBTTtnQkFJRyxRQUFRO3NCQUFqQixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQ29tcG9uZW50LFxuICBFdmVudEVtaXR0ZXIsXG4gIElucHV0LFxuICBPbkluaXQsXG4gIE91dHB1dCxcbiAgVGVtcGxhdGVSZWYsXG4gIFZpZXdDaGlsZFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IEJzTW9kYWxSZWYgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbmltcG9ydCB7IGZpbHRlciB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFdpemFyZE91dGxldENvbXBvbmVudCB9IGZyb20gJy4vd2l6YXJkLW91dGxldC93aXphcmQtb3V0bGV0LmNvbXBvbmVudCc7XG5pbXBvcnQgeyBXaXphcmQsIFdpemFyZENvbmZpZywgV2l6YXJkRW50cnkgfSBmcm9tICcuL3dpemFyZC5tb2RlbCc7XG5pbXBvcnQgeyBXaXphcmRTZXJ2aWNlIH0gZnJvbSAnLi93aXphcmQuc2VydmljZSc7XG5cbi8qKlxuICogQSBnZW5lcmljIGNvbXBvbmVudCB0aGF0IGlzIGludGVuZGVkIHRvIHNlcnZlIGFzIHRoZSBidWlsZGluZyBibG9jayBvZiBtb3JlIHdpemFyZHMuXG4gKlxuICogKipFeGFtcGxlKipcbiAqIGBgYGh0bWxcbiAqIDxidXR0b25cbiAqICAgIHRpdGxlPVwiQWRkIGFwcGxpY2F0aW9uXCJcbiAqICAgIGNsYXNzPVwiYnRuIGJ0bi1wcmltYXJ5XCJcbiAqICAgIChjbGljayk9XCJhZGRBcHBsaWNhdGlvbigpXCJcbiAqICA+XG4gKiAgICBBZGQgYXBwbGljYXRpb25cbiAqICA8L2J1dHRvbj5cbiAqIGBgYFxuICpcbiAqIGBgYHRzXG4gKiBpbXBvcnQgeyBDb21wb25lbnQgfSBmcm9tICdAYW5ndWxhci9jb3JlJztcbiAqIGltcG9ydCB7IFdpemFyZENvbmZpZywgV2l6YXJkU2VydmljZSwgV2l6YXJkIH0gZnJvbSAnQGM4eS9uZ3gtY29tcG9uZW50cyc7XG4gKiBpbXBvcnQgeyBNb2RhbE9wdGlvbnMgfSBmcm9tICduZ3gtYm9vdHN0cmFwL21vZGFsJztcbiAqXG4gKiBAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogJ2M4eS1hZGQtYXBwbGljYXRpb24td2l6YXJkJyxcbiAqICB0ZW1wbGF0ZVVybDogJy4vdGVtcGxhdGVQYXRoJ1xuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBBZGRBcHBsaWNhdGlvbldpemFyZENvbXBvbmVudCB7XG4gKiAgIGNvbnN0cnVjdG9yKHByaXZhdGUgd2l6YXJkU2VydmljZTogV2l6YXJkU2VydmljZSkge31cbiAqXG4gKiAgIGFkZEFwcGxpY2F0aW9uKCkge1xuICogICAgIGNvbnN0IHdpemFyZENvbmZpZzogV2l6YXJkQ29uZmlnID0ge1xuICogICAgICAgaGVhZGVyVGV4dDogJ0FkZCBBcHBsaWNhdGlvbicsXG4gKiAgICAgICBoZWFkZXJJY29uOiAnYzh5LWljb24tbW9kdWxlcycsXG4gKiAgICAgICBib2R5SGVhZGVyVGV4dDogJ1NlbGVjdCBtZXRob2RzJyxcbiAqICAgICAgIGJvZHlIZWFkZXJJY29uOiAnYzh5LWljb24tbW9kdWxlcydcbiAqICAgICB9O1xuICpcbiAqICAgICBjb25zdCBpbml0aWFsU3RhdGU6IFdpemFyZCA9IHtcbiAqICAgICAgIHdpemFyZENvbmZpZyxcbiAqICAgICAgIGlkOiAndXBsb2FkQXBwbGljYXRpb24nXG4gKiAgICAgfTtcbiAqXG4gKiAgICAgY29uc3QgbW9kYWxPcHRpb25zOiBNb2RhbE9wdGlvbnMgPSB7IGluaXRpYWxTdGF0ZSB9O1xuICpcbiAqICAgICB0aGlzLndpemFyZFNlcnZpY2Uuc2hvdyhtb2RhbE9wdGlvbnMpO1xuICogICB9XG4gKiB9XG4gKiBgYGBcbiAqL1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICdjOHktd2l6YXJkJyxcbiAgdGVtcGxhdGVVcmw6ICcuL3dpemFyZC5jb21wb25lbnQuaHRtbCdcbn0pXG5leHBvcnQgY2xhc3MgV2l6YXJkQ29tcG9uZW50PFQgPSBhbnk+IGltcGxlbWVudHMgV2l6YXJkPFQ+LCBPbkluaXQge1xuICBAVmlld0NoaWxkKCdoZWFkZXJSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBoZWFkZXI6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoJ2JvZHlSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBib2R5OiBUZW1wbGF0ZVJlZjxhbnk+O1xuICBAVmlld0NoaWxkKCdmb290ZXJSZWYnLCB7IHN0YXRpYzogdHJ1ZSB9KSBmb290ZXI6IFRlbXBsYXRlUmVmPGFueT47XG4gIEBWaWV3Q2hpbGQoV2l6YXJkT3V0bGV0Q29tcG9uZW50KSBvdXRsZXQ6IFdpemFyZE91dGxldENvbXBvbmVudDtcbiAgLyoqXG4gICAqIFRoZSBpZCBwYXJhbWV0ZXIgaWRlbnRpZmllcyB0aGUgcGFydGljdWxhciB3aXphcmQgYW5kIGNhbiBiZSB1c2VkIHRvIHJlZmVyIHRvIGl0IHdoZW4gaG9va2luZyB3aXphcmQgZW50cmllcy5cbiAgICogRXhhbXBsZTogXCJ3aXphcmRJZFwiLlxuICAgKi9cbiAgQElucHV0KCkgaWQ6IHN0cmluZztcbiAgLyoqXG4gICAqIEEgY29uZmlndXJhdGlvbiBvYmplY3QgdGhhdCBhbGxvd3MgeW91IHRvIHNldCBoZWFkZXIgdmFsdWVzLCBib3RoIHRleHQgYW5kIGljb24uXG4gICAqL1xuICBASW5wdXQoKSB3aXphcmRDb25maWc6IFdpemFyZENvbmZpZyA9IHt9O1xuICAvKipcbiAgICogQSBzdGF0ZSB0aGF0IHdpbGwgYmUgYXNzaWduZWQgdG8gdGhlIGFjdHVhbCBjb21wb25lbnQgY29udGFpbmVkIGJ5IHRoZSB3aXphcmQuXG4gICAqL1xuICBjb21wb25lbnRJbml0aWFsU3RhdGU6IFBhcnRpYWw8VD4gPSB7fTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgd2l6YXJkIGlzIGNsb3NlZC5cbiAgICovXG4gIEBPdXRwdXQoKSBvbkNsb3NlOiBFdmVudEVtaXR0ZXI8YW55PiA9IG5ldyBFdmVudEVtaXR0ZXIoKTtcbiAgLyoqXG4gICAqIFRoZSBldmVudCB0aGF0IGlzIGVtaXR0ZWQgd2hlbiB0aGUgd2l6YXJkIGlzIHJlc2V0ZWQuXG4gICAqL1xuICBAT3V0cHV0KCkgb25SZXNldDogRXZlbnRFbWl0dGVyPGFueT4gPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG4gIC8qKlxuICAgKiBUaGUgZXZlbnQgdGhhdCBpcyBlbWl0dGVkIHdoZW4gdGhlIHdpemFyZCBlbnRyeSBpcyBjbGlja2VkLlxuICAgKi9cbiAgQE91dHB1dCgpIG9uU2VsZWN0OiBFdmVudEVtaXR0ZXI8V2l6YXJkRW50cnk+ID0gbmV3IEV2ZW50RW1pdHRlcigpO1xuICByZWFkb25seSBoZWFkZXJUZW1wbGF0ZSQgPSB0aGlzLndpemFyZFNlcnZpY2UuaGVhZGVyVGVtcGxhdGUkLnBpcGUoXG4gICAgZmlsdGVyKGhlYWRlciA9PiBoZWFkZXIud2l6YXJkSWQgPT09IHRoaXMuaWQpXG4gICk7XG4gIHJlYWRvbmx5IGJvZHlUZW1wbGF0ZSQgPSB0aGlzLndpemFyZFNlcnZpY2UuYm9keVRlbXBsYXRlJC5waXBlKFxuICAgIGZpbHRlcihib2R5ID0+IGJvZHkud2l6YXJkSWQgPT09IHRoaXMuaWQpXG4gICk7XG4gIHJlYWRvbmx5IGZvb3RlclRlbXBsYXRlJCA9IHRoaXMud2l6YXJkU2VydmljZS5mb290ZXJUZW1wbGF0ZSQucGlwZShcbiAgICBmaWx0ZXIoZm9vdGVyID0+IGZvb3Rlci53aXphcmRJZCA9PT0gdGhpcy5pZClcbiAgKTtcblxuICBjb25zdHJ1Y3RvcihwdWJsaWMgd2l6YXJkU2VydmljZTogV2l6YXJkU2VydmljZSwgcHVibGljIGJzTW9kYWxSZWY6IEJzTW9kYWxSZWYpIHt9XG5cbiAgbmdPbkluaXQoKSB7XG4gICAgdGhpcy5lbWl0VGVtcGxhdGVzKCk7XG4gIH1cblxuICAvKipcbiAgICogUmVzZXRzIHRoZSB3aXphcmQuXG4gICAqIEBwYXJhbSByZXN1bHQgQ3VzdG9tIHJlc3VsdCBvYmplY3Qgd2hpY2ggd2lsbCBiZSBlbWl0dGVkIHZpYSBvblJlc2V0IG91dHB1dC5cbiAgICovXG4gIHJlc2V0KHJlc3VsdD86IGFueSkge1xuICAgIHRoaXMub3V0bGV0LnJlc2V0KCk7XG4gICAgdGhpcy5vblJlc2V0LmVtaXQocmVzdWx0KTtcbiAgICB0aGlzLmVtaXRUZW1wbGF0ZXMoKTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDbG9zZXMgdGhlIHdpemFyZC5cbiAgICogQHBhcmFtIHJlc3VsdCBDdXN0b20gcmVzdWx0IG9iamVjdCB3aGljaCB3aWxsIGJlIGVtaXR0ZWQgdmlhIG9uQ2xvc2Ugb3V0cHV0LlxuICAgKi9cbiAgY2xvc2UocmVzdWx0PzogYW55KSB7XG4gICAgdGhpcy5vbkNsb3NlLmVtaXQocmVzdWx0KTtcbiAgICB0aGlzLm9uQ2xvc2UuY29tcGxldGUoKTtcbiAgICB0aGlzLmJzTW9kYWxSZWYuaGlkZSgpO1xuICB9XG5cbiAgb25QYXRoKCkge1xuICAgIHRoaXMuY2xvc2UoKTtcbiAgfVxuXG4gIHByaXZhdGUgZW1pdFRlbXBsYXRlcygpIHtcbiAgICBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgIHRoaXMud2l6YXJkU2VydmljZS5oZWFkZXJUZW1wbGF0ZSQubmV4dCh7IHRlbXBsYXRlOiB0aGlzLmhlYWRlciwgd2l6YXJkSWQ6IHRoaXMuaWQgfSk7XG4gICAgICB0aGlzLndpemFyZFNlcnZpY2UuYm9keVRlbXBsYXRlJC5uZXh0KHsgdGVtcGxhdGU6IHRoaXMuYm9keSwgd2l6YXJkSWQ6IHRoaXMuaWQgfSk7XG4gICAgICB0aGlzLndpemFyZFNlcnZpY2UuZm9vdGVyVGVtcGxhdGUkLm5leHQoeyB0ZW1wbGF0ZTogdGhpcy5mb290ZXIsIHdpemFyZElkOiB0aGlzLmlkIH0pO1xuICAgIH0pO1xuICB9XG59XG4iLCI8ZGl2IGNsYXNzPVwidmlld3BvcnQtbW9kYWwgYW5pbWF0ZWQgZmFkZUluXCI+XG4gIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIihoZWFkZXJUZW1wbGF0ZSQgfCBhc3luYyk/LnRlbXBsYXRlXCI+PC9uZy10ZW1wbGF0ZT5cblxuICA8bmctdGVtcGxhdGUgI2hlYWRlclJlZj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtaGVhZGVyIGRpYWxvZy1oZWFkZXIgYW5pbWF0ZWQgZmFkZUluXCI+XG4gICAgICA8aSBbYzh5SWNvbl09XCJ3aXphcmRDb25maWcuaGVhZGVySWNvblwiPjwvaT5cbiAgICAgIDxoNCBpZD1cIm1vZGFsLXRpdGxlXCI+e3sgd2l6YXJkQ29uZmlnLmhlYWRlclRleHQgfCB0cmFuc2xhdGUgfX08L2g0PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuXG4gIDxuZy10ZW1wbGF0ZSAqbmdUZW1wbGF0ZU91dGxldD1cIihib2R5VGVtcGxhdGUkIHwgYXN5bmMpPy50ZW1wbGF0ZVwiPjwvbmctdGVtcGxhdGU+XG5cbiAgPG5nLXRlbXBsYXRlICNib2R5UmVmPlxuICAgIDxkaXYgY2xhc3M9XCJwLTE2IHAtdC04IHRleHQtY2VudGVyXCIgKm5nSWY9XCJ3aXphcmRDb25maWcuYm9keUhlYWRlclRleHRcIj5cbiAgICAgIDxkaXYgY2xhc3M9XCJjOHktd2l6YXJkLW5hdlwiPlxuICAgICAgICA8aSBbYzh5SWNvbl09XCJ3aXphcmRDb25maWcuYm9keUhlYWRlckljb25cIj48L2k+XG4gICAgICAgIDxzcGFuPnt7IHdpemFyZENvbmZpZy5ib2R5SGVhZGVyVGV4dCB8IHRyYW5zbGF0ZSB9fTwvc3Bhbj5cbiAgICAgIDwvZGl2PlxuICAgIDwvZGl2PlxuICA8L25nLXRlbXBsYXRlPlxuICA8Yzh5LXdpemFyZC1vdXRsZXRcbiAgICBbaW5pdGlhbFN0YXRlXT1cImNvbXBvbmVudEluaXRpYWxTdGF0ZVwiXG4gICAgW2lkXT1cImlkXCJcbiAgICAob25TZWxlY3QpPVwib25TZWxlY3QuZW1pdCgkZXZlbnQpXCJcbiAgICAob25QYXRoKT1cIm9uUGF0aCgpXCJcbiAgPjwvYzh5LXdpemFyZC1vdXRsZXQ+XG5cbiAgPG5nLXRlbXBsYXRlICpuZ1RlbXBsYXRlT3V0bGV0PVwiKGZvb3RlclRlbXBsYXRlJCB8IGFzeW5jKT8udGVtcGxhdGVcIj48L25nLXRlbXBsYXRlPlxuICA8bmctdGVtcGxhdGUgI2Zvb3RlclJlZj5cbiAgICA8ZGl2IGNsYXNzPVwibW9kYWwtZm9vdGVyIGFuaW1hdGVkIGZhZGVJblwiPlxuICAgICAgPGJ1dHRvblxuICAgICAgICAoY2xpY2spPVwiY2xvc2UoKVwiXG4gICAgICAgIHR5cGU9XCJidXR0b25cIlxuICAgICAgICBjbGFzcz1cImJ0biBidG4tZGVmYXVsdFwiXG4gICAgICAgIHRpdGxlPVwie3sgJ0NhbmNlbCcgfCB0cmFuc2xhdGUgfX1cIlxuICAgICAgPlxuICAgICAgICA8c3BhbiB0cmFuc2xhdGU+Q2FuY2VsPC9zcGFuPlxuICAgICAgPC9idXR0b24+XG4gICAgPC9kaXY+XG4gIDwvbmctdGVtcGxhdGU+XG48L2Rpdj5cbiJdfQ==