UNPKG

@nova-ui/bits

Version:

SolarWinds Nova Framework

133 lines 28.6 kB
// © 2022 SolarWinds Worldwide, LLC. All rights reserved. // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to // deal in the Software without restriction, including without limitation the // rights to use, copy, modify, merge, publish, distribute, sublicense, and/or // sell copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in // all copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN // THE SOFTWARE. import { FocusMonitor } from "@angular/cdk/a11y"; import { CdkStepHeader, STEP_STATE } from "@angular/cdk/stepper"; import { ChangeDetectionStrategy, Component, ElementRef, Inject, Input, Optional, ViewEncapsulation, } from "@angular/core"; import assign from "lodash/assign"; import { WIZARD_CONFIG, WIZARD_CONFIG_DEFAULT, } from "../../../constants/wizard.constants"; import { WizardStepV2Component } from "../wizard-step/wizard-step.component"; import { WizardStepLabelDirective } from "../wizard-step-label.directive"; import * as i0 from "@angular/core"; import * as i1 from "@angular/cdk/a11y"; import * as i2 from "@angular/common"; import * as i3 from "../../icon/icon.component"; import * as i4 from "../../tooltip/tooltip.directive"; /** @ignore */ export class WizardStepHeaderComponent extends CdkStepHeader { constructor(_focusMonitor, _elementRef, config) { super(_elementRef); this._focusMonitor = _focusMonitor; this.config = config; /** Label that is rendered below optional steps. */ this.optionalLabel = $localize `Optional`; this.wizardConfig = { ...WIZARD_CONFIG_DEFAULT }; if (this.config) { this.updateStepStateConfig(this.config.stepState); } this.createStepStateConfigMap(); } ngOnChanges(changes) { if (changes?.stepStateConfig?.currentValue) { this.updateStepStateConfig(changes?.stepStateConfig?.currentValue); this.createStepStateConfigMap(); } this.stepState = this.getStepState(this.step); } ngAfterViewInit() { this._focusMonitor.monitor(this._elementRef, true); } ngOnDestroy() { this._focusMonitor.stopMonitoring(this._elementRef); } /** Focuses the step header. */ focus() { this._focusMonitor.focusVia(this._elementRef, "program"); } /** Returns string label of given step if it is a text label. */ get stringLabel() { return this.label instanceof WizardStepLabelDirective ? null : this.label; } /** Returns WizardStepLabel if the label of given step is a template label. */ get templateLabel() { return this.label instanceof WizardStepLabelDirective ? this.label : null; } updateStepStateConfig(stepStateConfig) { this.wizardConfig.stepState = assign({ ...this.wizardConfig.stepState }, stepStateConfig); } createStepStateConfigMap() { this.stepStateConfigMap = { [STEP_STATE.NUMBER]: this.wizardConfig.stepState?.initial, [STEP_STATE.DONE]: this.wizardConfig.stepState?.visited, [STEP_STATE.EDIT]: this.wizardConfig.stepState?.active, [STEP_STATE.ERROR]: this.wizardConfig.stepState?.error, }; } getStepState(step) { const isSelected = this.selected; if (step.hasError && isSelected) { return STEP_STATE.ERROR; } if (isSelected) { return STEP_STATE.EDIT; } if (step.completed) { return STEP_STATE.DONE; } return STEP_STATE.NUMBER; } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WizardStepHeaderComponent, deps: [{ token: i1.FocusMonitor }, { token: i0.ElementRef }, { token: WIZARD_CONFIG, optional: true }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: WizardStepHeaderComponent, selector: "nui-wizard-step-header", inputs: { stepStateConfig: "stepStateConfig", label: "label", optionalLabel: "optionalLabel", errorMessage: "errorMessage", index: "index", selected: "selected", active: "active", step: "step" }, host: { attributes: { "role": "tab" }, properties: { "class.nui-wizard-step-header--selected": "selected", "class.nui-wizard-step-header--optional": "step.optional", "class.nui-wizard-step-header--completed": "stepState === 'done'" }, classAttribute: "nui-wizard-step-header" }, usesInheritance: true, usesOnChanges: true, ngImport: i0, template: "<div\n class=\"nui-wizard-step-header__label\"\n [nuiTooltip]=\"stringLabel ? stringLabel : ''\"\n [class.nui-wizard-step-header__label--active]=\"step.completed\"\n [class.nui-wizard-step-header__label--selected]=\"selected\"\n [class.nui-wizard-step-header__label--error]=\"stepState === 'error'\"\n>\n <!-- If there is a label template, use it. -->\n <ng-container\n *ngIf=\"templateLabel\"\n [ngTemplateOutlet]=\"templateLabel?.template\"\n ></ng-container>\n\n <!-- If there is no label template, fall back to the text label. -->\n <div class=\"nui-wizard-step-header__text-label\" *ngIf=\"stringLabel\">\n {{ label }}\n </div>\n\n <div\n class=\"nui-wizard-step-header__label--optional\"\n *ngIf=\"step.optional && stepState !== 'error'\"\n >\n {{ optionalLabel }}\n </div>\n <div\n class=\"nui-wizard-step-header__label--error\"\n *ngIf=\"stepState === 'error'\"\n >\n {{ errorMessage }}\n </div>\n</div>\n\n<div\n class=\"nui-wizard-step-header-icon nui-step-header-icon-state--{{\n stepState\n }}\"\n>\n <div class=\"nui-wizard-step-header-icon-container\">\n <span class=\"nui-wizard-step-header-icon-content\">\n <ng-container>\n <nui-icon\n [icon]=\"stepStateConfigMap[stepState].icon\"\n [iconColor]=\"stepStateConfigMap[stepState].iconColor\"\n ></nui-icon>\n </ng-container>\n </span>\n </div>\n</div>\n", styles: [".nui-wizard-step-header{overflow:hidden;outline:none;cursor:pointer;position:relative;color:var(--nui-color-text-default,#111);width:145px}.nui-wizard-step-header--completed{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header:focus{outline:none;box-shadow:inset 0 0 0 2px #00c4d280;border-radius:3px}.nui-wizard-step-header:focus:not(:focus-visible){box-shadow:unset;border-radius:unset}.nui-wizard-step-header-icon{height:16px;width:16px;position:relative}.nui-popover-container__content .nui-wizard-step-header-icon{display:flex;align-self:flex-end}.nui-wizard-step-header-icon-content{font-size:16px;height:16px;width:16px;position:relative;top:4px}.nui-wizard-step-header-icon-container .nui-icon{position:relative;top:50%;left:50%;transform:translate(-50%,-50%)}.nui-wizard-step-header__label{display:inline-block;min-width:50px;max-width:130px;vertical-align:middle;padding-bottom:5px;line-height:14px;font-size:11px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.nui-wizard-step-header__label--active{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header__label--selected{color:var(--nui-color-text-default,#111)}.nui-popover-container__content .nui-wizard-step-header__label{padding:0}.nui-wizard-step-header__text-label{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}\n"], dependencies: [{ kind: "directive", type: i2.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "component", type: i3.IconComponent, selector: "nui-icon", inputs: ["iconColor", "brushType", "iconHoverColor", "iconSize", "cssClass", "fillContainer", "status", "childStatus", "icon", "counter"] }, { kind: "directive", type: i4.TooltipDirective, selector: "[nuiTooltip]", inputs: ["tooltipPlacement", "nuiTooltipDisabled", "nuiTooltipEllipsis", "nuiTooltip"], exportAs: ["nuiTooltip"] }], changeDetection: i0.ChangeDetectionStrategy.OnPush, encapsulation: i0.ViewEncapsulation.None }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: WizardStepHeaderComponent, decorators: [{ type: Component, args: [{ selector: "nui-wizard-step-header", host: { class: "nui-wizard-step-header", "[class.nui-wizard-step-header--selected]": "selected", "[class.nui-wizard-step-header--optional]": "step.optional", "[class.nui-wizard-step-header--completed]": "stepState === 'done'", role: "tab", }, encapsulation: ViewEncapsulation.None, changeDetection: ChangeDetectionStrategy.OnPush, template: "<div\n class=\"nui-wizard-step-header__label\"\n [nuiTooltip]=\"stringLabel ? stringLabel : ''\"\n [class.nui-wizard-step-header__label--active]=\"step.completed\"\n [class.nui-wizard-step-header__label--selected]=\"selected\"\n [class.nui-wizard-step-header__label--error]=\"stepState === 'error'\"\n>\n <!-- If there is a label template, use it. -->\n <ng-container\n *ngIf=\"templateLabel\"\n [ngTemplateOutlet]=\"templateLabel?.template\"\n ></ng-container>\n\n <!-- If there is no label template, fall back to the text label. -->\n <div class=\"nui-wizard-step-header__text-label\" *ngIf=\"stringLabel\">\n {{ label }}\n </div>\n\n <div\n class=\"nui-wizard-step-header__label--optional\"\n *ngIf=\"step.optional && stepState !== 'error'\"\n >\n {{ optionalLabel }}\n </div>\n <div\n class=\"nui-wizard-step-header__label--error\"\n *ngIf=\"stepState === 'error'\"\n >\n {{ errorMessage }}\n </div>\n</div>\n\n<div\n class=\"nui-wizard-step-header-icon nui-step-header-icon-state--{{\n stepState\n }}\"\n>\n <div class=\"nui-wizard-step-header-icon-container\">\n <span class=\"nui-wizard-step-header-icon-content\">\n <ng-container>\n <nui-icon\n [icon]=\"stepStateConfigMap[stepState].icon\"\n [iconColor]=\"stepStateConfigMap[stepState].iconColor\"\n ></nui-icon>\n </ng-container>\n </span>\n </div>\n</div>\n", styles: [".nui-wizard-step-header{overflow:hidden;outline:none;cursor:pointer;position:relative;color:var(--nui-color-text-default,#111);width:145px}.nui-wizard-step-header--completed{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header:focus{outline:none;box-shadow:inset 0 0 0 2px #00c4d280;border-radius:3px}.nui-wizard-step-header:focus:not(:focus-visible){box-shadow:unset;border-radius:unset}.nui-wizard-step-header-icon{height:16px;width:16px;position:relative}.nui-popover-container__content .nui-wizard-step-header-icon{display:flex;align-self:flex-end}.nui-wizard-step-header-icon-content{font-size:16px;height:16px;width:16px;position:relative;top:4px}.nui-wizard-step-header-icon-container .nui-icon{position:relative;top:50%;left:50%;transform:translate(-50%,-50%)}.nui-wizard-step-header__label{display:inline-block;min-width:50px;max-width:130px;vertical-align:middle;padding-bottom:5px;line-height:14px;font-size:11px;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;color:var(--nui-color-text-secondary,rgba(17, 17, 17, .6))}.nui-wizard-step-header__label--active{color:var(--nui-color-text-link,#0079aa)}.nui-wizard-step-header__label--selected{color:var(--nui-color-text-default,#111)}.nui-popover-container__content .nui-wizard-step-header__label{padding:0}.nui-wizard-step-header__text-label{white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis}\n"] }] }], ctorParameters: () => [{ type: i1.FocusMonitor }, { type: i0.ElementRef }, { type: undefined, decorators: [{ type: Optional }, { type: Inject, args: [WIZARD_CONFIG] }] }], propDecorators: { stepStateConfig: [{ type: Input }], label: [{ type: Input }], optionalLabel: [{ type: Input }], errorMessage: [{ type: Input }], index: [{ type: Input }], selected: [{ type: Input }], active: [{ type: Input }], step: [{ type: Input }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2l6YXJkLXN0ZXAtaGVhZGVyLmNvbXBvbmVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9saWIvd2l6YXJkLXYyL3dpemFyZC1zdGVwLWhlYWRlci93aXphcmQtc3RlcC1oZWFkZXIuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vc3JjL2xpYi93aXphcmQtdjIvd2l6YXJkLXN0ZXAtaGVhZGVyL3dpemFyZC1zdGVwLWhlYWRlci5jb21wb25lbnQuaHRtbCJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSx5REFBeUQ7QUFDekQsRUFBRTtBQUNGLCtFQUErRTtBQUMvRSw0RUFBNEU7QUFDNUUsOEVBQThFO0FBQzlFLCtFQUErRTtBQUMvRSw4RUFBOEU7QUFDOUUsNERBQTREO0FBQzVELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsdURBQXVEO0FBQ3ZELEVBQUU7QUFDRiw2RUFBNkU7QUFDN0UsNEVBQTRFO0FBQzVFLCtFQUErRTtBQUMvRSwwRUFBMEU7QUFDMUUsaUZBQWlGO0FBQ2pGLDZFQUE2RTtBQUM3RSxpQkFBaUI7QUFFakIsT0FBTyxFQUFFLFlBQVksRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2pELE9BQU8sRUFBRSxhQUFhLEVBQWEsVUFBVSxFQUFFLE1BQU0sc0JBQXNCLENBQUM7QUFDNUUsT0FBTyxFQUVILHVCQUF1QixFQUN2QixTQUFTLEVBQ1QsVUFBVSxFQUNWLE1BQU0sRUFDTixLQUFLLEVBR0wsUUFBUSxFQUVSLGlCQUFpQixHQUNwQixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLE1BQU0sTUFBTSxlQUFlLENBQUM7QUFFbkMsT0FBTyxFQUNILGFBQWEsRUFDYixxQkFBcUIsR0FDeEIsTUFBTSxxQ0FBcUMsQ0FBQztBQUU3QyxPQUFPLEVBQUUscUJBQXFCLEVBQUUsTUFBTSxzQ0FBc0MsQ0FBQztBQUM3RSxPQUFPLEVBQUUsd0JBQXdCLEVBQUUsTUFBTSxnQ0FBZ0MsQ0FBQzs7Ozs7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LENBQUMsS0FBSyxDQUFDO1NBQzNCO1FBRUQsSUFBSSxVQUFVLEVBQUU7WUFDWixPQUFPLFVBQVUsQ0FBQyxJQUFJLENBQUM7U0FDMUI7UUFFRCxJQUFJLElBQUksQ0FBQyxTQUFTLEVBQUU7WUFDaEIsT0FBTyxVQUFVLENBQUMsSUFBSSxDQUFDO1NBQzFCO1FBRUQsT0FBTyxVQUFVLENBQUMsTUFBTSxDQUFDO0lBQzdCLENBQUM7K0dBdEhRLHlCQUF5Qix3RUFzQ3RCLGFBQWE7bUdBdENoQix5QkFBeUIscWtCQzVEdEMscWhEQWdEQTs7NEZEWWEseUJBQXlCO2tCQWRyQyxTQUFTOytCQUNJLHdCQUF3QixRQUc1Qjt3QkFDRixLQUFLLEVBQUUsd0JBQXdCO3dCQUMvQiwwQ0FBMEMsRUFBRSxVQUFVO3dCQUN0RCwwQ0FBMEMsRUFBRSxlQUFlO3dCQUMzRCwyQ0FBMkMsRUFBRSxzQkFBc0I7d0JBQ25FLElBQUksRUFBRSxLQUFLO3FCQUNkLGlCQUNjLGlCQUFpQixDQUFDLElBQUksbUJBQ3BCLHVCQUF1QixDQUFDLE1BQU07OzBCQXVDMUMsUUFBUTs7MEJBQ1IsTUFBTTsyQkFBQyxhQUFhO3lDQTlCaEIsZUFBZTtzQkFBdkIsS0FBSztnQkFHRyxLQUFLO3NCQUFiLEtBQUs7Z0JBR0csYUFBYTtzQkFBckIsS0FBSztnQkFHRyxZQUFZO3NCQUFwQixLQUFLO2dCQUdHLEtBQUs7c0JBQWIsS0FBSztnQkFHRyxRQUFRO3NCQUFoQixLQUFLO2dCQUdHLE1BQU07c0JBQWQsS0FBSztnQkFFRyxJQUFJO3NCQUFaLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyDCqSAyMDIyIFNvbGFyV2luZHMgV29ybGR3aWRlLCBMTEMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weVxuLy8gIG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlIFwiU29mdHdhcmVcIiksIHRvXG4vLyAgZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vICByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Jcbi8vICBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXQgcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpc1xuLy8gIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vICBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SXG4vLyAgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFksXG4vLyAgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyAgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUlxuLy8gIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1IgT1RIRVJXSVNFLCBBUklTSU5HIEZST00sXG4vLyAgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTlxuLy8gIFRIRSBTT0ZUV0FSRS5cblxuaW1wb3J0IHsgRm9jdXNNb25pdG9yIH0gZnJvbSBcIkBhbmd1bGFyL2Nkay9hMTF5XCI7XG5pbXBvcnQgeyBDZGtTdGVwSGVhZGVyLCBTdGVwU3RhdGUsIFNURVBfU1RBVEUgfSBmcm9tIFwiQGFuZ3VsYXIvY2RrL3N0ZXBwZXJcIjtcbmltcG9ydCB7XG4gICAgQWZ0ZXJWaWV3SW5pdCxcbiAgICBDaGFuZ2VEZXRlY3Rpb25TdHJhdGVneSxcbiAgICBDb21wb25lbnQsXG4gICAgRWxlbWVudFJlZixcbiAgICBJbmplY3QsXG4gICAgSW5wdXQsXG4gICAgT25DaGFuZ2VzLFxuICAgIE9uRGVzdHJveSxcbiAgICBPcHRpb25hbCxcbiAgICBTaW1wbGVDaGFuZ2VzLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IGFzc2lnbiBmcm9tIFwibG9kYXNoL2Fzc2lnblwiO1xuXG5pbXBvcnQge1xuICAgIFdJWkFSRF9DT05GSUcsXG4gICAgV0laQVJEX0NPTkZJR19ERUZBVUxULFxufSBmcm9tIFwiLi4vLi4vLi4vY29uc3RhbnRzL3dpemFyZC5jb25zdGFudHNcIjtcbmltcG9ydCB7IElXaXphcmRDb25maWcsIFdpemFyZFN0ZXBTdGF0ZUNvbmZpZyB9IGZyb20gXCIuLi90eXBlc1wiO1xuaW1wb3J0IHsgV2l6YXJkU3RlcFYyQ29tcG9uZW50IH0gZnJvbSBcIi4uL3dpemFyZC1zdGVwL3dpemFyZC1zdGVwLmNvbXBvbmVudFwiO1xuaW1wb3J0IHsgV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlIH0gZnJvbSBcIi4uL3dpemFyZC1zdGVwLWxhYmVsLmRpcmVjdGl2ZVwiO1xuXG4vKiogQGlnbm9yZSAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXdpemFyZC1zdGVwLWhlYWRlclwiLFxuICAgIHRlbXBsYXRlVXJsOiBcIndpemFyZC1zdGVwLWhlYWRlci5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wid2l6YXJkLXN0ZXAtaGVhZGVyLmNvbXBvbmVudC5sZXNzXCJdLFxuICAgIGhvc3Q6IHtcbiAgICAgICAgY2xhc3M6IFwibnVpLXdpemFyZC1zdGVwLWhlYWRlclwiLFxuICAgICAgICBcIltjbGFzcy5udWktd2l6YXJkLXN0ZXAtaGVhZGVyLS1zZWxlY3RlZF1cIjogXCJzZWxlY3RlZFwiLFxuICAgICAgICBcIltjbGFzcy5udWktd2l6YXJkLXN0ZXAtaGVhZGVyLS1vcHRpb25hbF1cIjogXCJzdGVwLm9wdGlvbmFsXCIsXG4gICAgICAgIFwiW2NsYXNzLm51aS13aXphcmQtc3RlcC1oZWFkZXItLWNvbXBsZXRlZF1cIjogXCJzdGVwU3RhdGUgPT09ICdkb25lJ1wiLFxuICAgICAgICByb2xlOiBcInRhYlwiLFxuICAgIH0sXG4gICAgZW5jYXBzdWxhdGlvbjogVmlld0VuY2Fwc3VsYXRpb24uTm9uZSxcbiAgICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgV2l6YXJkU3RlcEhlYWRlckNvbXBvbmVudFxuICAgIGV4dGVuZHMgQ2RrU3RlcEhlYWRlclxuICAgIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCwgT25EZXN0cm95LCBPbkNoYW5nZXNcbntcbiAgICAvKiogU3RhdGUgb2YgdGhlIGdpdmVuIHN0ZXAuICovXG4gICAgcHVibGljIHN0ZXBTdGF0ZTogU3RlcFN0YXRlO1xuXG4gICAgLyoqIEN1c3RvbSBpY29uIGNvbmZpZyByZWNlaXZlZCBmcm9tIHRoZSB3aXphcmQgc3RlcC4gQWxsb3dzIHRvIGN1c3RvbWl6ZSBzdGF0ZSBpY29ucyBmb3IgYSBwYXJ0aWN1bGFyIHdpemFyZCBzdGVwICovXG4gICAgQElucHV0KCkgc3RlcFN0YXRlQ29uZmlnOiBQYXJ0aWFsPFdpemFyZFN0ZXBTdGF0ZUNvbmZpZz47XG5cbiAgICAvKiogTGFiZWwgb2YgdGhlIGdpdmVuIHN0ZXAuICovXG4gICAgQElucHV0KCkgbGFiZWw6IFdpemFyZFN0ZXBMYWJlbERpcmVjdGl2ZSB8IHN0cmluZztcblxuICAgIC8qKiBMYWJlbCB0aGF0IGlzIHJlbmRlcmVkIGJlbG93IG9wdGlvbmFsIHN0ZXBzLiAqL1xuICAgIEBJbnB1dCgpIG9wdGlvbmFsTGFiZWw6IHN0cmluZyA9ICRsb2NhbGl6ZWBPcHRpb25hbGA7XG5cbiAgICAvKiogRXJyb3IgbWVzc2FnZSB0byBkaXNwbGF5IHdoZW4gdGhlcmUncyBhbiBlcnJvci4gKi9cbiAgICBASW5wdXQoKSBlcnJvck1lc3NhZ2U6IHN0cmluZztcblxuICAgIC8qKiBJbmRleCBvZiB0aGUgZ2l2ZW4gc3RlcC4gKi9cbiAgICBASW5wdXQoKSBpbmRleDogbnVtYmVyO1xuXG4gICAgLyoqIFdoZXRoZXIgdGhlIGdpdmVuIHN0ZXAgaXMgc2VsZWN0ZWQuICovXG4gICAgQElucHV0KCkgc2VsZWN0ZWQ6IGJvb2xlYW47XG5cbiAgICAvKiogV2hldGhlciB0aGUgZ2l2ZW4gc3RlcCBsYWJlbCBpcyBhY3RpdmUuICovXG4gICAgQElucHV0KCkgYWN0aXZlOiBib29sZWFuO1xuXG4gICAgQElucHV0KCkgc3RlcDogV2l6YXJkU3RlcFYyQ29tcG9uZW50O1xuXG4gICAgcHVibGljIHN0ZXBTdGF0ZUNvbmZpZ01hcDogV2l6YXJkU3RlcFN0YXRlQ29uZmlnO1xuXG4gICAgcHJpdmF0ZSB3aXphcmRDb25maWc6IElXaXphcmRDb25maWcgPSB7IC4uLldJWkFSRF9DT05GSUdfREVGQVVMVCB9O1xuXG4gICAgY29uc3RydWN0b3IoXG4gICAgICAgIHByaXZhdGUgX2ZvY3VzTW9uaXRvcjogRm9jdXNNb25pdG9yLFxuICAgICAgICBfZWxlbWVudFJlZjogRWxlbWVudFJlZjxIVE1MRWxlbWVudD4sXG4gICAgICAgIEBPcHRpb25hbCgpXG4gICAgICAgIEBJbmplY3QoV0laQVJEX0NPTkZJRylcbiAgICAgICAgcHVibGljIHJlYWRvbmx5IGNvbmZpZz86IElXaXphcmRDb25maWdcbiAgICApIHtcbiAgICAgICAgc3VwZXIoX2VsZW1lbnRSZWYpO1xuXG4gICAgICAgIGlmICh0aGlzLmNvbmZpZykge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVTdGVwU3RhdGVDb25maWcodGhpcy5jb25maWcuc3RlcFN0YXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuY3JlYXRlU3RlcFN0YXRlQ29uZmlnTWFwKCk7XG4gICAgfVxuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKGNoYW5nZXM6IFNpbXBsZUNoYW5nZXMpOiB2b2lkIHtcbiAgICAgICAgaWYgKGNoYW5nZXM/LnN0ZXBTdGF0ZUNvbmZpZz8uY3VycmVudFZhbHVlKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVN0ZXBTdGF0ZUNvbmZpZyhjaGFuZ2VzPy5zdGVwU3RhdGVDb25maWc/LmN1cnJlbnRWYWx1ZSk7XG4gICAgICAgICAgICB0aGlzLmNyZWF0ZVN0ZXBTdGF0ZUNvbmZpZ01hcCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGVwU3RhdGUgPSB0aGlzLmdldFN0ZXBTdGF0ZSh0aGlzLnN0ZXApO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ0FmdGVyVmlld0luaXQoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5tb25pdG9yKHRoaXMuX2VsZW1lbnRSZWYsIHRydWUpO1xuICAgIH1cblxuICAgIHB1YmxpYyBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5fZm9jdXNNb25pdG9yLnN0b3BNb25pdG9yaW5nKHRoaXMuX2VsZW1lbnRSZWYpO1xuICAgIH1cblxuICAgIC8qKiBGb2N1c2VzIHRoZSBzdGVwIGhlYWRlci4gKi9cbiAgICBwdWJsaWMgZm9jdXMoKTogdm9pZCB7XG4gICAgICAgIHRoaXMuX2ZvY3VzTW9uaXRvci5mb2N1c1ZpYSh0aGlzLl9lbGVtZW50UmVmLCBcInByb2dyYW1cIik7XG4gICAgfVxuXG4gICAgLyoqIFJldHVybnMgc3RyaW5nIGxhYmVsIG9mIGdpdmVuIHN0ZXAgaWYgaXQgaXMgYSB0ZXh0IGxhYmVsLiAqL1xuICAgIHB1YmxpYyBnZXQgc3RyaW5nTGFiZWwoKTogc3RyaW5nIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsIGluc3RhbmNlb2YgV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlXG4gICAgICAgICAgICA/IG51bGxcbiAgICAgICAgICAgIDogdGhpcy5sYWJlbDtcbiAgICB9XG5cbiAgICAvKiogUmV0dXJucyBXaXphcmRTdGVwTGFiZWwgaWYgdGhlIGxhYmVsIG9mIGdpdmVuIHN0ZXAgaXMgYSB0ZW1wbGF0ZSBsYWJlbC4gKi9cbiAgICBwdWJsaWMgZ2V0IHRlbXBsYXRlTGFiZWwoKTogV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlIHwgbnVsbCB7XG4gICAgICAgIHJldHVybiB0aGlzLmxhYmVsIGluc3RhbmNlb2YgV2l6YXJkU3RlcExhYmVsRGlyZWN0aXZlXG4gICAgICAgICAgICA/IHRoaXMubGFiZWxcbiAgICAgICAgICAgIDogbnVsbDtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVN0ZXBTdGF0ZUNvbmZpZyhzdGVwU3RhdGVDb25maWc6IFdpemFyZFN0ZXBTdGF0ZUNvbmZpZykge1xuICAgICAgICB0aGlzLndpemFyZENvbmZpZy5zdGVwU3RhdGUgPSBhc3NpZ24oXG4gICAgICAgICAgICB7IC4uLnRoaXMud2l6YXJkQ29uZmlnLnN0ZXBTdGF0ZSB9LFxuICAgICAgICAgICAgc3RlcFN0YXRlQ29uZmlnXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBjcmVhdGVTdGVwU3RhdGVDb25maWdNYXAoKSB7XG4gICAgICAgIHRoaXMuc3RlcFN0YXRlQ29uZmlnTWFwID0ge1xuICAgICAgICAgICAgW1NURVBfU1RBVEUuTlVNQkVSXTogdGhpcy53aXphcmRDb25maWcuc3RlcFN0YXRlPy5pbml0aWFsLFxuICAgICAgICAgICAgW1NURVBfU1RBVEUuRE9ORV06IHRoaXMud2l6YXJkQ29uZmlnLnN0ZXBTdGF0ZT8udmlzaXRlZCxcbiAgICAgICAgICAgIFtTVEVQX1NUQVRFLkVESVRdOiB0aGlzLndpemFyZENvbmZpZy5zdGVwU3RhdGU/LmFjdGl2ZSxcbiAgICAgICAgICAgIFtTVEVQX1NUQVRFLkVSUk9SXTogdGhpcy53aXphcmRDb25maWcuc3RlcFN0YXRlPy5lcnJvcixcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldFN0ZXBTdGF0ZShzdGVwOiBXaXphcmRTdGVwVjJDb21wb25lbnQpOiBTdGVwU3RhdGUge1xuICAgICAgICBjb25zdCBpc1NlbGVjdGVkID0gdGhpcy5zZWxlY3RlZDtcblxuICAgICAgICBpZiAoc3RlcC5oYXNFcnJvciAmJiBpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5FUlJPUjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChpc1NlbGVjdGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5FRElUO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHN0ZXAuY29tcGxldGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gU1RFUF9TVEFURS5ET05FO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFNURVBfU1RBVEUuTlVNQkVSO1xuICAgIH1cbn1cbiIsIjxkaXZcbiAgICBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXJfX2xhYmVsXCJcbiAgICBbbnVpVG9vbHRpcF09XCJzdHJpbmdMYWJlbCA/IHN0cmluZ0xhYmVsIDogJydcIlxuICAgIFtjbGFzcy5udWktd2l6YXJkLXN0ZXAtaGVhZGVyX19sYWJlbC0tYWN0aXZlXT1cInN0ZXAuY29tcGxldGVkXCJcbiAgICBbY2xhc3MubnVpLXdpemFyZC1zdGVwLWhlYWRlcl9fbGFiZWwtLXNlbGVjdGVkXT1cInNlbGVjdGVkXCJcbiAgICBbY2xhc3MubnVpLXdpemFyZC1zdGVwLWhlYWRlcl9fbGFiZWwtLWVycm9yXT1cInN0ZXBTdGF0ZSA9PT0gJ2Vycm9yJ1wiXG4+XG4gICAgPCEtLSBJZiB0aGVyZSBpcyBhIGxhYmVsIHRlbXBsYXRlLCB1c2UgaXQuIC0tPlxuICAgIDxuZy1jb250YWluZXJcbiAgICAgICAgKm5nSWY9XCJ0ZW1wbGF0ZUxhYmVsXCJcbiAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwidGVtcGxhdGVMYWJlbD8udGVtcGxhdGVcIlxuICAgID48L25nLWNvbnRhaW5lcj5cblxuICAgIDwhLS0gSWYgdGhlcmUgaXMgbm8gbGFiZWwgdGVtcGxhdGUsIGZhbGwgYmFjayB0byB0aGUgdGV4dCBsYWJlbC4gLS0+XG4gICAgPGRpdiBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXJfX3RleHQtbGFiZWxcIiAqbmdJZj1cInN0cmluZ0xhYmVsXCI+XG4gICAgICAgIHt7IGxhYmVsIH19XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICAgIGNsYXNzPVwibnVpLXdpemFyZC1zdGVwLWhlYWRlcl9fbGFiZWwtLW9wdGlvbmFsXCJcbiAgICAgICAgKm5nSWY9XCJzdGVwLm9wdGlvbmFsICYmIHN0ZXBTdGF0ZSAhPT0gJ2Vycm9yJ1wiXG4gICAgPlxuICAgICAgICB7eyBvcHRpb25hbExhYmVsIH19XG4gICAgPC9kaXY+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXJfX2xhYmVsLS1lcnJvclwiXG4gICAgICAgICpuZ0lmPVwic3RlcFN0YXRlID09PSAnZXJyb3InXCJcbiAgICA+XG4gICAgICAgIHt7IGVycm9yTWVzc2FnZSB9fVxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxkaXZcbiAgICBjbGFzcz1cIm51aS13aXphcmQtc3RlcC1oZWFkZXItaWNvbiBudWktc3RlcC1oZWFkZXItaWNvbi1zdGF0ZS0te3tcbiAgICAgICAgc3RlcFN0YXRlXG4gICAgfX1cIlxuPlxuICAgIDxkaXYgY2xhc3M9XCJudWktd2l6YXJkLXN0ZXAtaGVhZGVyLWljb24tY29udGFpbmVyXCI+XG4gICAgICAgIDxzcGFuIGNsYXNzPVwibnVpLXdpemFyZC1zdGVwLWhlYWRlci1pY29uLWNvbnRlbnRcIj5cbiAgICAgICAgICAgIDxuZy1jb250YWluZXI+XG4gICAgICAgICAgICAgICAgPG51aS1pY29uXG4gICAgICAgICAgICAgICAgICAgIFtpY29uXT1cInN0ZXBTdGF0ZUNvbmZpZ01hcFtzdGVwU3RhdGVdLmljb25cIlxuICAgICAgICAgICAgICAgICAgICBbaWNvbkNvbG9yXT1cInN0ZXBTdGF0ZUNvbmZpZ01hcFtzdGVwU3RhdGVdLmljb25Db2xvclwiXG4gICAgICAgICAgICAgICAgPjwvbnVpLWljb24+XG4gICAgICAgICAgICA8L25nLWNvbnRhaW5lcj5cbiAgICAgICAgPC9zcGFuPlxuICAgIDwvZGl2PlxuPC9kaXY+XG4iXX0=