@nova-ui/bits
Version:
SolarWinds Nova Framework
74 lines • 20.7 kB
JavaScript
// © 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 { Component, EventEmitter, Input, Output, TemplateRef, ViewEncapsulation, } from "@angular/core";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "../button/button.component";
import * as i3 from "../tooltip/tooltip.directive";
/**
* <example-url>./../examples/index.html#/progress</example-url>
*/
export class ProgressComponent {
constructor() {
this.showProgress = true;
this.ariaLabel = "Progress bar";
this.cancel = new EventEmitter();
this.isIndeterminate = false;
}
ngOnChanges() {
this.isIndeterminate = this.percent === undefined;
}
cancelProgress() {
this.cancel.emit();
}
static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProgressComponent, deps: [], target: i0.ɵɵFactoryTarget.Component }); }
static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "17.3.12", type: ProgressComponent, selector: "nui-progress", inputs: { show: "show", showProgress: "showProgress", message: "message", showNumber: "showNumber", percent: "percent", allowCancel: "allowCancel", cancelText: "cancelText", helpText: "helpText", stacked: "stacked", compactMode: "compactMode", ariaLabel: "ariaLabel", helpTemplateRef: "helpTemplateRef" }, outputs: { cancel: "cancel" }, usesOnChanges: true, ngImport: i0, template: "<div class=\"nui-progress\" [class.nui-progress--shown]=\"show\">\n <div\n class=\"nui-progress__header\"\n *ngIf=\"message && !compactMode\"\n [ngClass]=\"{ 'nui-progress__header--stacked': stacked }\"\n >\n <span\n class=\"nui-progress__message nui-text-label nui-progress__header-item\"\n >{{ message }}</span\n >\n </div>\n\n <div\n *ngIf=\"show && showProgress\"\n class=\"nui-progress__container\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-valuenow]=\"percent || null\"\n >\n <div\n class=\"nui-progress__bar\"\n [ngClass]=\"{\n 'nui-progress--indeterminate': isIndeterminate,\n 'nui-progress__bar--compact': compactMode\n }\"\n >\n <div\n class=\"nui-progress__bar-value\"\n [ngStyle]=\"{ 'width.%': percent }\"\n ></div>\n </div>\n\n <div\n *ngIf=\"showNumber && !compactMode\"\n class=\"nui-progress__number nui-progress__header-item nui-text-small\"\n >\n {{ percent }}%\n </div>\n\n <button\n nui-button\n type=\"button\"\n class=\"nui-progress__cancel\"\n icon=\"close\"\n *ngIf=\"allowCancel && !compactMode\"\n (click)=\"cancelProgress()\"\n displayStyle=\"action\"\n [nuiTooltip]=\"'Cancel'\"\n ></button>\n </div>\n\n <div\n *ngIf=\"!compactMode\"\n class=\"nui-progress__hint\"\n [class.nui-progress__hint--stacked]=\"stacked\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n helpTemplateRef ? helpTemplateRef : defaultHelpTemplateRef\n \"\n ></ng-container>\n </div>\n</div>\n\n<ng-template #defaultHelpTemplateRef>\n <span class=\"nui-text-small-secondary\">{{ helpText }}</span>\n</ng-template>\n", styles: [".nui-progress{display:none}.nui-progress--shown{display:block}.nui-progress__header{text-align:center}.nui-progress__header--stacked{text-align:left}.nui-progress__bar{width:100%;background-color:var(--nui-color-bg-workspace,#f0f0f0);height:5px;margin:5px 0}.nui-progress__bar-value{width:0;height:100%;background-color:var(--nui-color-progress,#00c4d2);transition:1s linear;position:relative;overflow:hidden}.nui-progress__bar--compact{margin:0}.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:before,.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:after{content:\"\";position:absolute;width:5px;height:5px;background-color:var(--nui-progress-ripple-color,rgba(255, 255, 255, .4));opacity:0;transform:scale(1);border-radius:100%;transform-origin:0 50%;transition:all .5s ease-in-out}.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:before{animation:progress-bar-ripple 1.2s ease-in-out .2s infinite}.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:after{animation:progress-bar-ripple 1.2s ease-in-out .4s infinite}@keyframes progress-bar-ripple{0%{transform:scaleX(0);opacity:.8}30%{opacity:.3}50%{transform:scaleX(200);opacity:0}to{transform:scaleX(200);opacity:0}}.nui-progress__message{display:block}.nui-progress__hint{text-align:center}.nui-progress__hint--stacked{text-align:left}.nui-progress__hint .nui-text-small-secondary{display:block}.nui-progress__number{position:relative;top:-1px;margin-left:5px}.nui-progress__container{max-height:15px;display:flex;align-items:center}.nui-progress--indeterminate .nui-progress__bar-value{animation-name:indeterminate-progress;animation-duration:1.6s;animation-iteration-count:infinite;animation-timing-function:cubic-bezier(.3,.5,.3,.9)}@keyframes indeterminate-progress{50%{margin-left:25%;width:50%}to{margin-left:100%}}.nui-progress__cancel.nui-button{position:relative;top:-1px;margin-left:5px}\n"], dependencies: [{ kind: "directive", type: i1.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i1.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i1.NgStyle, selector: "[ngStyle]", inputs: ["ngStyle"] }, { kind: "component", type: i2.ButtonComponent, selector: "[nui-button]", inputs: ["displayStyle", "icon", "iconColor", "iconRight", "isBusy", "isEmpty", "ariaLabel", "isRepeat", "size"] }, { kind: "directive", type: i3.TooltipDirective, selector: "[nuiTooltip]", inputs: ["tooltipPlacement", "nuiTooltipDisabled", "nuiTooltipEllipsis", "nuiTooltip"], exportAs: ["nuiTooltip"] }], encapsulation: i0.ViewEncapsulation.None }); }
}
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "17.3.12", ngImport: i0, type: ProgressComponent, decorators: [{
type: Component,
args: [{ selector: "nui-progress", encapsulation: ViewEncapsulation.None, template: "<div class=\"nui-progress\" [class.nui-progress--shown]=\"show\">\n <div\n class=\"nui-progress__header\"\n *ngIf=\"message && !compactMode\"\n [ngClass]=\"{ 'nui-progress__header--stacked': stacked }\"\n >\n <span\n class=\"nui-progress__message nui-text-label nui-progress__header-item\"\n >{{ message }}</span\n >\n </div>\n\n <div\n *ngIf=\"show && showProgress\"\n class=\"nui-progress__container\"\n role=\"progressbar\"\n aria-valuemin=\"0\"\n aria-valuemax=\"100\"\n [attr.aria-label]=\"ariaLabel\"\n [attr.aria-valuenow]=\"percent || null\"\n >\n <div\n class=\"nui-progress__bar\"\n [ngClass]=\"{\n 'nui-progress--indeterminate': isIndeterminate,\n 'nui-progress__bar--compact': compactMode\n }\"\n >\n <div\n class=\"nui-progress__bar-value\"\n [ngStyle]=\"{ 'width.%': percent }\"\n ></div>\n </div>\n\n <div\n *ngIf=\"showNumber && !compactMode\"\n class=\"nui-progress__number nui-progress__header-item nui-text-small\"\n >\n {{ percent }}%\n </div>\n\n <button\n nui-button\n type=\"button\"\n class=\"nui-progress__cancel\"\n icon=\"close\"\n *ngIf=\"allowCancel && !compactMode\"\n (click)=\"cancelProgress()\"\n displayStyle=\"action\"\n [nuiTooltip]=\"'Cancel'\"\n ></button>\n </div>\n\n <div\n *ngIf=\"!compactMode\"\n class=\"nui-progress__hint\"\n [class.nui-progress__hint--stacked]=\"stacked\"\n >\n <ng-container\n [ngTemplateOutlet]=\"\n helpTemplateRef ? helpTemplateRef : defaultHelpTemplateRef\n \"\n ></ng-container>\n </div>\n</div>\n\n<ng-template #defaultHelpTemplateRef>\n <span class=\"nui-text-small-secondary\">{{ helpText }}</span>\n</ng-template>\n", styles: [".nui-progress{display:none}.nui-progress--shown{display:block}.nui-progress__header{text-align:center}.nui-progress__header--stacked{text-align:left}.nui-progress__bar{width:100%;background-color:var(--nui-color-bg-workspace,#f0f0f0);height:5px;margin:5px 0}.nui-progress__bar-value{width:0;height:100%;background-color:var(--nui-color-progress,#00c4d2);transition:1s linear;position:relative;overflow:hidden}.nui-progress__bar--compact{margin:0}.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:before,.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:after{content:\"\";position:absolute;width:5px;height:5px;background-color:var(--nui-progress-ripple-color,rgba(255, 255, 255, .4));opacity:0;transform:scale(1);border-radius:100%;transform-origin:0 50%;transition:all .5s ease-in-out}.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:before{animation:progress-bar-ripple 1.2s ease-in-out .2s infinite}.nui-progress__bar:not(.nui-progress--indeterminate) .nui-progress__bar-value:after{animation:progress-bar-ripple 1.2s ease-in-out .4s infinite}@keyframes progress-bar-ripple{0%{transform:scaleX(0);opacity:.8}30%{opacity:.3}50%{transform:scaleX(200);opacity:0}to{transform:scaleX(200);opacity:0}}.nui-progress__message{display:block}.nui-progress__hint{text-align:center}.nui-progress__hint--stacked{text-align:left}.nui-progress__hint .nui-text-small-secondary{display:block}.nui-progress__number{position:relative;top:-1px;margin-left:5px}.nui-progress__container{max-height:15px;display:flex;align-items:center}.nui-progress--indeterminate .nui-progress__bar-value{animation-name:indeterminate-progress;animation-duration:1.6s;animation-iteration-count:infinite;animation-timing-function:cubic-bezier(.3,.5,.3,.9)}@keyframes indeterminate-progress{50%{margin-left:25%;width:50%}to{margin-left:100%}}.nui-progress__cancel.nui-button{position:relative;top:-1px;margin-left:5px}\n"] }]
}], propDecorators: { show: [{
type: Input
}], showProgress: [{
type: Input
}], message: [{
type: Input
}], showNumber: [{
type: Input
}], percent: [{
type: Input
}], allowCancel: [{
type: Input
}], cancelText: [{
type: Input
}], helpText: [{
type: Input
}], stacked: [{
type: Input
}], compactMode: [{
type: Input
}], ariaLabel: [{
type: Input
}], helpTemplateRef: [{
type: Input
}], cancel: [{
type: Output
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicHJvZ3Jlc3MuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vLi4vc3JjL2xpYi9wcm9ncmVzcy9wcm9ncmVzcy5jb21wb25lbnQudHMiLCIuLi8uLi8uLi8uLi9zcmMvbGliL3Byb2dyZXNzL3Byb2dyZXNzLmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLHlEQUF5RDtBQUN6RCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLDRFQUE0RTtBQUM1RSw4RUFBOEU7QUFDOUUsK0VBQStFO0FBQy9FLDhFQUE4RTtBQUM5RSw0REFBNEQ7QUFDNUQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSx1REFBdUQ7QUFDdkQsRUFBRTtBQUNGLDZFQUE2RTtBQUM3RSw0RUFBNEU7QUFDNUUsK0VBQStFO0FBQy9FLDBFQUEwRTtBQUMxRSxpRkFBaUY7QUFDakYsNkVBQTZFO0FBQzdFLGlCQUFpQjtBQUVqQixPQUFPLEVBQ0gsU0FBUyxFQUNULFlBQVksRUFDWixLQUFLLEVBRUwsTUFBTSxFQUNOLFdBQVcsRUFDWCxpQkFBaUIsR0FDcEIsTUFBTSxlQUFlLENBQUM7Ozs7O0FBRXZCOztHQUVHO0FBT0gsTUFBTSxPQUFPLGlCQUFpQjtJQU45QjtRQVFvQixpQkFBWSxHQUFHLElBQUksQ0FBQztRQVNwQixjQUFTLEdBQVcsY0FBYyxDQUFDO1FBU2xDLFdBQU0sR0FBRyxJQUFJLFlBQVksRUFBRSxDQUFDO1FBRXRDLG9CQUFlLEdBQUcsS0FBSyxDQUFDO0tBVWxDO0lBUFUsV0FBVztRQUNkLElBQUksQ0FBQyxlQUFlLEdBQUcsSUFBSSxDQUFDLE9BQU8sS0FBSyxTQUFTLENBQUM7SUFDdEQsQ0FBQztJQUVNLGNBQWM7UUFDakIsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQztJQUN2QixDQUFDOytHQS9CUSxpQkFBaUI7bUdBQWpCLGlCQUFpQiwwWkN2QzlCLDBpRUFxRUE7OzRGRDlCYSxpQkFBaUI7a0JBTjdCLFNBQVM7K0JBQ0ksY0FBYyxpQkFHVCxpQkFBaUIsQ0FBQyxJQUFJOzhCQUdyQixJQUFJO3NCQUFuQixLQUFLO2dCQUNVLFlBQVk7c0JBQTNCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLE9BQU87c0JBQXRCLEtBQUs7Z0JBQ1UsV0FBVztzQkFBMUIsS0FBSztnQkFDVSxVQUFVO3NCQUF6QixLQUFLO2dCQUNVLFFBQVE7c0JBQXZCLEtBQUs7Z0JBQ1UsT0FBTztzQkFBdEIsS0FBSztnQkFDVSxXQUFXO3NCQUExQixLQUFLO2dCQUNVLFNBQVM7c0JBQXhCLEtBQUs7Z0JBT0csZUFBZTtzQkFBdkIsS0FBSztnQkFFVyxNQUFNO3NCQUF0QixNQUFNIiwic291cmNlc0NvbnRlbnQiOlsiLy8gwqkgMjAyMiBTb2xhcldpbmRzIFdvcmxkd2lkZSwgTExDLiBBbGwgcmlnaHRzIHJlc2VydmVkLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhIGNvcHlcbi8vICBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlXG4vLyAgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCwgZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yXG4vLyAgc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vICBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkIGluXG4vLyAgYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTUyBPUlxuLy8gIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRVxuLy8gIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sIERBTUFHRVMgT1IgT1RIRVJcbi8vICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLFxuLy8gIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU5cbi8vICBUSEUgU09GVFdBUkUuXG5cbmltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPbkNoYW5nZXMsXG4gICAgT3V0cHV0LFxuICAgIFRlbXBsYXRlUmVmLFxuICAgIFZpZXdFbmNhcHN1bGF0aW9uLFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG4vKipcbiAqIDxleGFtcGxlLXVybD4uLy4uL2V4YW1wbGVzL2luZGV4Lmh0bWwjL3Byb2dyZXNzPC9leGFtcGxlLXVybD5cbiAqL1xuQENvbXBvbmVudCh7XG4gICAgc2VsZWN0b3I6IFwibnVpLXByb2dyZXNzXCIsXG4gICAgdGVtcGxhdGVVcmw6IFwiLi9wcm9ncmVzcy5jb21wb25lbnQuaHRtbFwiLFxuICAgIHN0eWxlVXJsczogW1wiLi9wcm9ncmVzcy5jb21wb25lbnQubGVzc1wiXSxcbiAgICBlbmNhcHN1bGF0aW9uOiBWaWV3RW5jYXBzdWxhdGlvbi5Ob25lLFxufSlcbmV4cG9ydCBjbGFzcyBQcm9ncmVzc0NvbXBvbmVudCBpbXBsZW1lbnRzIE9uQ2hhbmdlcyB7XG4gICAgQElucHV0KCkgcHVibGljIHNob3c6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIHNob3dQcm9ncmVzcyA9IHRydWU7XG4gICAgQElucHV0KCkgcHVibGljIG1lc3NhZ2U6IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgc2hvd051bWJlcjogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgcGVyY2VudDogbnVtYmVyO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBhbGxvd0NhbmNlbDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY2FuY2VsVGV4dDogc3RyaW5nO1xuICAgIEBJbnB1dCgpIHB1YmxpYyBoZWxwVGV4dD86IHN0cmluZztcbiAgICBASW5wdXQoKSBwdWJsaWMgc3RhY2tlZDogYm9vbGVhbjtcbiAgICBASW5wdXQoKSBwdWJsaWMgY29tcGFjdE1vZGU6IGJvb2xlYW47XG4gICAgQElucHV0KCkgcHVibGljIGFyaWFMYWJlbDogc3RyaW5nID0gXCJQcm9ncmVzcyBiYXJcIjtcblxuICAgIC8qKlxuICAgICAqIEhlbHAgdGVtcGxhdGUgY29udGVudCBkaXNwbGF5ZWQgdW5kZXIgdGhlIHByb2dyZXNzIGJhci5cbiAgICAgKiBUaGlzIGNhbiBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGhlbHBUZXh0IHN0cmluZyBpbnB1dCBmb3IgY3VzdG9tXG4gICAgICogaGVscCB0ZXh0IHN0eWxpbmcuXG4gICAgICovXG4gICAgQElucHV0KCkgaGVscFRlbXBsYXRlUmVmOiBUZW1wbGF0ZVJlZjxhbnk+O1xuXG4gICAgQE91dHB1dCgpIHB1YmxpYyBjYW5jZWwgPSBuZXcgRXZlbnRFbWl0dGVyKCk7XG5cbiAgICBwdWJsaWMgaXNJbmRldGVybWluYXRlID0gZmFsc2U7XG4gICAgcHVibGljIGFyaWFWYWx1ZU5vdzogc3RyaW5nIHwgdW5kZWZpbmVkO1xuXG4gICAgcHVibGljIG5nT25DaGFuZ2VzKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzSW5kZXRlcm1pbmF0ZSA9IHRoaXMucGVyY2VudCA9PT0gdW5kZWZpbmVkO1xuICAgIH1cblxuICAgIHB1YmxpYyBjYW5jZWxQcm9ncmVzcygpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5jYW5jZWwuZW1pdCgpO1xuICAgIH1cbn1cbiIsIjxkaXYgY2xhc3M9XCJudWktcHJvZ3Jlc3NcIiBbY2xhc3MubnVpLXByb2dyZXNzLS1zaG93bl09XCJzaG93XCI+XG4gICAgPGRpdlxuICAgICAgICBjbGFzcz1cIm51aS1wcm9ncmVzc19faGVhZGVyXCJcbiAgICAgICAgKm5nSWY9XCJtZXNzYWdlICYmICFjb21wYWN0TW9kZVwiXG4gICAgICAgIFtuZ0NsYXNzXT1cInsgJ251aS1wcm9ncmVzc19faGVhZGVyLS1zdGFja2VkJzogc3RhY2tlZCB9XCJcbiAgICA+XG4gICAgICAgIDxzcGFuXG4gICAgICAgICAgICBjbGFzcz1cIm51aS1wcm9ncmVzc19fbWVzc2FnZSBudWktdGV4dC1sYWJlbCBudWktcHJvZ3Jlc3NfX2hlYWRlci1pdGVtXCJcbiAgICAgICAgICAgID57eyBtZXNzYWdlIH19PC9zcGFuXG4gICAgICAgID5cbiAgICA8L2Rpdj5cblxuICAgIDxkaXZcbiAgICAgICAgKm5nSWY9XCJzaG93ICYmIHNob3dQcm9ncmVzc1wiXG4gICAgICAgIGNsYXNzPVwibnVpLXByb2dyZXNzX19jb250YWluZXJcIlxuICAgICAgICByb2xlPVwicHJvZ3Jlc3NiYXJcIlxuICAgICAgICBhcmlhLXZhbHVlbWluPVwiMFwiXG4gICAgICAgIGFyaWEtdmFsdWVtYXg9XCIxMDBcIlxuICAgICAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImFyaWFMYWJlbFwiXG4gICAgICAgIFthdHRyLmFyaWEtdmFsdWVub3ddPVwicGVyY2VudCB8fCBudWxsXCJcbiAgICA+XG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgIGNsYXNzPVwibnVpLXByb2dyZXNzX19iYXJcIlxuICAgICAgICAgICAgW25nQ2xhc3NdPVwie1xuICAgICAgICAgICAgICAgICdudWktcHJvZ3Jlc3MtLWluZGV0ZXJtaW5hdGUnOiBpc0luZGV0ZXJtaW5hdGUsXG4gICAgICAgICAgICAgICAgJ251aS1wcm9ncmVzc19fYmFyLS1jb21wYWN0JzogY29tcGFjdE1vZGVcbiAgICAgICAgICAgIH1cIlxuICAgICAgICA+XG4gICAgICAgICAgICA8ZGl2XG4gICAgICAgICAgICAgICAgY2xhc3M9XCJudWktcHJvZ3Jlc3NfX2Jhci12YWx1ZVwiXG4gICAgICAgICAgICAgICAgW25nU3R5bGVdPVwieyAnd2lkdGguJSc6IHBlcmNlbnQgfVwiXG4gICAgICAgICAgICA+PC9kaXY+XG4gICAgICAgIDwvZGl2PlxuXG4gICAgICAgIDxkaXZcbiAgICAgICAgICAgICpuZ0lmPVwic2hvd051bWJlciAmJiAhY29tcGFjdE1vZGVcIlxuICAgICAgICAgICAgY2xhc3M9XCJudWktcHJvZ3Jlc3NfX251bWJlciBudWktcHJvZ3Jlc3NfX2hlYWRlci1pdGVtIG51aS10ZXh0LXNtYWxsXCJcbiAgICAgICAgPlxuICAgICAgICAgICAge3sgcGVyY2VudCB9fSVcbiAgICAgICAgPC9kaXY+XG5cbiAgICAgICAgPGJ1dHRvblxuICAgICAgICAgICAgbnVpLWJ1dHRvblxuICAgICAgICAgICAgdHlwZT1cImJ1dHRvblwiXG4gICAgICAgICAgICBjbGFzcz1cIm51aS1wcm9ncmVzc19fY2FuY2VsXCJcbiAgICAgICAgICAgIGljb249XCJjbG9zZVwiXG4gICAgICAgICAgICAqbmdJZj1cImFsbG93Q2FuY2VsICYmICFjb21wYWN0TW9kZVwiXG4gICAgICAgICAgICAoY2xpY2spPVwiY2FuY2VsUHJvZ3Jlc3MoKVwiXG4gICAgICAgICAgICBkaXNwbGF5U3R5bGU9XCJhY3Rpb25cIlxuICAgICAgICAgICAgW251aVRvb2x0aXBdPVwiJ0NhbmNlbCdcIlxuICAgICAgICA+PC9idXR0b24+XG4gICAgPC9kaXY+XG5cbiAgICA8ZGl2XG4gICAgICAgICpuZ0lmPVwiIWNvbXBhY3RNb2RlXCJcbiAgICAgICAgY2xhc3M9XCJudWktcHJvZ3Jlc3NfX2hpbnRcIlxuICAgICAgICBbY2xhc3MubnVpLXByb2dyZXNzX19oaW50LS1zdGFja2VkXT1cInN0YWNrZWRcIlxuICAgID5cbiAgICAgICAgPG5nLWNvbnRhaW5lclxuICAgICAgICAgICAgW25nVGVtcGxhdGVPdXRsZXRdPVwiXG4gICAgICAgICAgICAgICAgaGVscFRlbXBsYXRlUmVmID8gaGVscFRlbXBsYXRlUmVmIDogZGVmYXVsdEhlbHBUZW1wbGF0ZVJlZlxuICAgICAgICAgICAgXCJcbiAgICAgICAgPjwvbmctY29udGFpbmVyPlxuICAgIDwvZGl2PlxuPC9kaXY+XG5cbjxuZy10ZW1wbGF0ZSAjZGVmYXVsdEhlbHBUZW1wbGF0ZVJlZj5cbiAgICA8c3BhbiBjbGFzcz1cIm51aS10ZXh0LXNtYWxsLXNlY29uZGFyeVwiPnt7IGhlbHBUZXh0IH19PC9zcGFuPlxuPC9uZy10ZW1wbGF0ZT5cbiJdfQ==