carbon-components-angular
Version:
Next generation components
194 lines • 21.5 kB
JavaScript
import { Component, Input, HostBinding } from "@angular/core";
import { isObservable, of } from "rxjs";
import { BaseNotification } from "./base-notification.component";
import * as i0 from "@angular/core";
import * as i1 from "./notification-display.service";
import * as i2 from "carbon-components-angular/i18n";
import * as i3 from "carbon-components-angular/button";
import * as i4 from "@angular/common";
import * as i5 from "carbon-components-angular/link";
import * as i6 from "carbon-components-angular/icon";
import * as i7 from "./actionable-button.directive";
import * as i8 from "./actionable-title.directive";
import * as i9 from "./actionable-subtitle.directive";
/**
* Actionable notification allows for interactive elements within a notification. There are two variants offered, inline & toast.
*
* [See demo](../../?path=/story/components-notification--actionable-notification)
*/
export class ActionableNotification extends BaseNotification {
constructor(notificationDisplayService, i18n) {
super(notificationDisplayService, i18n);
this.notificationDisplayService = notificationDisplayService;
this.i18n = i18n;
this.notificationID = `notification-${ActionableNotification.notificationCount++}`;
this.notificationClass = true;
/**
* Set default variant & role, alternatives can be provided through notificationObj property
*/
this.defaultNotificationObj = {
...this.defaultNotificationObj,
variant: "inline",
role: "alertdialog"
};
}
/**
* Can have `type`, `title`, and `message` members.
*
* `type` can be one of `"error"`, `"info"`, `"info-square"`, `"warning"`, `"warning-alt"`, or `"success"`
*
* `message` is the message to display
*/
get notificationObj() {
return this._notificationObj;
}
set notificationObj(obj) {
if (obj.closeLabel && !isObservable(obj.closeLabel)) {
obj.closeLabel = of(obj.closeLabel);
}
this._notificationObj = Object.assign({}, this.defaultNotificationObj, obj);
}
get toastVariant() { return this.notificationObj.variant === "toast"; }
get isError() { return this.notificationObj.type === "error"; }
get isInfo() { return this.notificationObj.type === "info"; }
get isInfoSquare() { return this.notificationObj.type === "info-square"; }
get isSuccess() { return this.notificationObj.type === "success"; }
get isWarning() { return this.notificationObj.type === "warning"; }
get isWarningAlt() { return this.notificationObj.type === "warning-alt"; }
get isLowContrast() { return this.notificationObj.lowContrast; }
get isCloseHidden() { return !this._notificationObj.showClose; }
}
ActionableNotification.notificationCount = 0;
ActionableNotification.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ActionableNotification, deps: [{ token: i1.NotificationDisplayService }, { token: i2.I18n }], target: i0.ɵɵFactoryTarget.Component });
ActionableNotification.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: ActionableNotification, selector: "cds-actionable-notification, ibm-actionable-notification", inputs: { notificationObj: "notificationObj" }, host: { properties: { "attr.id": "this.notificationID", "class.cds--actionable-notification": "this.notificationClass", "class.cds--actionable-notification--toast": "this.toastVariant", "class.cds--actionable-notification--error": "this.isError", "class.cds--actionable-notification--info": "this.isInfo", "class.cds--actionable-notification--info-square": "this.isInfoSquare", "class.cds--actionable-notification--success": "this.isSuccess", "class.cds--actionable-notification--warning": "this.isWarning", "class.cds--actionable-notification--warning-alt": "this.isWarningAlt", "class.cds--actionable-notification--low-contrast": "this.isLowContrast", "class.cds--actionable-notification--hide-close-button": "this.isCloseHidden" } }, usesInheritance: true, ngImport: i0, template: `
<div class="cds--actionable-notification__details">
<svg
[cdsIcon]="iconDictionary[notificationObj.type]"
size="20"
*ngIf="notificationObj.type"
[ngClass]="{
'cds--inline-notification__icon': notificationObj.variant === 'inline',
'cds--toast-notification__icon': notificationObj.variant === 'toast'
}"
class="cds--actionable-notification__icon">
</svg>
<div class="cds--actionable-notification__text-wrapper">
<div class="cds--actionable-notification__content">
<div *ngIf="!notificationObj.template" cdsActionableTitle [innerHTML]="notificationObj.title"></div>
<div *ngIf="!notificationObj.template" cdsActionableSubtitle>
<span [innerHTML]="notificationObj.message"></span>
<ng-container *ngFor="let link of notificationObj.links">
<a cdsLink [href]="link.href">{{link.text}}</a>
</ng-container>
</div>
<ng-container *ngTemplateOutlet="notificationObj.template; context: { $implicit: notificationObj }"></ng-container>
</div>
</div>
</div>
<ng-container *ngIf="!notificationObj.actionsTemplate">
<button
*ngFor="let action of notificationObj.actions"
(click)="onClick(action, $event)"
[cdsButton]="notificationObj.variant === 'inline' ? 'ghost' : 'tertiary'"
size="sm"
cdsActionableButton>
{{action.text}}
</button>
</ng-container>
<ng-container *ngTemplateOutlet="notificationObj.actionsTemplate; context: { $implicit: notificationObj }"></ng-container>
<button
*ngIf="!isCloseHidden"
(click)="onClose()"
class="cds--actionable-notification__close-button"
[attr.aria-label]="notificationObj.closeLabel | async"
type="button">
<svg cdsIcon="close" size="16" class="cds--actionable-notification__close-icon"></svg>
</button>
`, isInline: true, dependencies: [{ kind: "directive", type: i3.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "directive", type: i4.NgClass, selector: "[ngClass]", inputs: ["class", "ngClass"] }, { kind: "directive", type: i4.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i4.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.NgTemplateOutlet, selector: "[ngTemplateOutlet]", inputs: ["ngTemplateOutletContext", "ngTemplateOutlet", "ngTemplateOutletInjector"] }, { kind: "directive", type: i5.Link, selector: "[cdsLink], [ibmLink]", inputs: ["inline", "disabled"] }, { kind: "directive", type: i6.IconDirective, selector: "[cdsIcon], [ibmIcon]", inputs: ["ibmIcon", "cdsIcon", "size", "title", "ariaLabel", "ariaLabelledBy", "ariaHidden", "isFocusable"] }, { kind: "directive", type: i7.ActionableButton, selector: "[cdsActionableButton], [ibmActionableButton]" }, { kind: "directive", type: i8.ActionableTitle, selector: "[cdsActionableTitle], [ibmActionableTitle]" }, { kind: "directive", type: i9.ActionableSubtitle, selector: "[cdsActionableSubtitle], [ibmActionableSubtitle]" }, { kind: "pipe", type: i4.AsyncPipe, name: "async" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: ActionableNotification, decorators: [{
type: Component,
args: [{
selector: "cds-actionable-notification, ibm-actionable-notification",
template: `
<div class="cds--actionable-notification__details">
<svg
[cdsIcon]="iconDictionary[notificationObj.type]"
size="20"
*ngIf="notificationObj.type"
[ngClass]="{
'cds--inline-notification__icon': notificationObj.variant === 'inline',
'cds--toast-notification__icon': notificationObj.variant === 'toast'
}"
class="cds--actionable-notification__icon">
</svg>
<div class="cds--actionable-notification__text-wrapper">
<div class="cds--actionable-notification__content">
<div *ngIf="!notificationObj.template" cdsActionableTitle [innerHTML]="notificationObj.title"></div>
<div *ngIf="!notificationObj.template" cdsActionableSubtitle>
<span [innerHTML]="notificationObj.message"></span>
<ng-container *ngFor="let link of notificationObj.links">
<a cdsLink [href]="link.href">{{link.text}}</a>
</ng-container>
</div>
<ng-container *ngTemplateOutlet="notificationObj.template; context: { $implicit: notificationObj }"></ng-container>
</div>
</div>
</div>
<ng-container *ngIf="!notificationObj.actionsTemplate">
<button
*ngFor="let action of notificationObj.actions"
(click)="onClick(action, $event)"
[cdsButton]="notificationObj.variant === 'inline' ? 'ghost' : 'tertiary'"
size="sm"
cdsActionableButton>
{{action.text}}
</button>
</ng-container>
<ng-container *ngTemplateOutlet="notificationObj.actionsTemplate; context: { $implicit: notificationObj }"></ng-container>
<button
*ngIf="!isCloseHidden"
(click)="onClose()"
class="cds--actionable-notification__close-button"
[attr.aria-label]="notificationObj.closeLabel | async"
type="button">
<svg cdsIcon="close" size="16" class="cds--actionable-notification__close-icon"></svg>
</button>
`
}]
}], ctorParameters: function () { return [{ type: i1.NotificationDisplayService }, { type: i2.I18n }]; }, propDecorators: { notificationObj: [{
type: Input
}], notificationID: [{
type: HostBinding,
args: ["attr.id"]
}], notificationClass: [{
type: HostBinding,
args: ["class.cds--actionable-notification"]
}], toastVariant: [{
type: HostBinding,
args: ["class.cds--actionable-notification--toast"]
}], isError: [{
type: HostBinding,
args: ["class.cds--actionable-notification--error"]
}], isInfo: [{
type: HostBinding,
args: ["class.cds--actionable-notification--info"]
}], isInfoSquare: [{
type: HostBinding,
args: ["class.cds--actionable-notification--info-square"]
}], isSuccess: [{
type: HostBinding,
args: ["class.cds--actionable-notification--success"]
}], isWarning: [{
type: HostBinding,
args: ["class.cds--actionable-notification--warning"]
}], isWarningAlt: [{
type: HostBinding,
args: ["class.cds--actionable-notification--warning-alt"]
}], isLowContrast: [{
type: HostBinding,
args: ["class.cds--actionable-notification--low-contrast"]
}], isCloseHidden: [{
type: HostBinding,
args: ["class.cds--actionable-notification--hide-close-button"]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uYWJsZS1ub3RpZmljYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vdGlmaWNhdGlvbi9hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7OztBQUVqRTs7OztHQUlHO0FBaURILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxnQkFBZ0I7SUF3QzNELFlBQXNCLDBCQUFzRCxFQUFZLElBQVU7UUFDakcsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRG5CLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFBWSxTQUFJLEdBQUosSUFBSSxDQUFNO1FBckIxRSxtQkFBYyxHQUFHLGdCQUFnQixzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDbkQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDO1FBVzVFOztXQUVHO1FBQ0gsMkJBQXNCLEdBQUc7WUFDeEIsR0FBRyxJQUFJLENBQUMsc0JBQXNCO1lBQzlCLE9BQU8sRUFBRSxRQUFnQztZQUN6QyxJQUFJLEVBQUUsYUFBYTtTQUNuQixDQUFDO0lBSUYsQ0FBQztJQXhDRDs7Ozs7O09BTUc7SUFDSCxJQUFhLGVBQWU7UUFDM0IsT0FBTyxJQUFJLENBQUMsZ0JBQWdCLENBQUM7SUFDOUIsQ0FBQztJQUNELElBQUksZUFBZSxDQUFDLEdBQXNCO1FBQ3pDLElBQUksR0FBRyxDQUFDLFVBQVUsSUFBSSxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLEVBQUU7WUFDcEQsR0FBRyxDQUFDLFVBQVUsR0FBRyxFQUFFLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxDQUFDO1NBQ3BDO1FBQ0QsSUFBSSxDQUFDLGdCQUFnQixHQUFHLE1BQU0sQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFLElBQUksQ0FBQyxzQkFBc0IsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUM3RSxDQUFDO0lBSUQsSUFBOEQsWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxPQUFPLEtBQUssT0FBTyxDQUFDLENBQUMsQ0FBQztJQUNqSSxJQUE4RCxPQUFPLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ3pILElBQTZELE1BQU0sS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLE1BQU0sQ0FBQyxDQUFDLENBQUM7SUFDdEgsSUFBb0UsWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMxSSxJQUFnRSxTQUFTLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxTQUFTLENBQUMsQ0FBQyxDQUFDO0lBQy9ILElBQWdFLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0gsSUFBb0UsWUFBWSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssYUFBYSxDQUFDLENBQUMsQ0FBQztJQUMxSSxJQUFxRSxhQUFhLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUM7SUFDakksSUFBMEUsYUFBYSxLQUFLLE9BQU8sQ0FBQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsU0FBUyxDQUFDLENBQUMsQ0FBQzs7QUE1QnZILHdDQUFpQixHQUFHLENBQUUsQ0FBQTttSEFEekIsc0JBQXNCO3VHQUF0QixzQkFBc0IsdzRCQTlDeEI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0VBNENUOzJGQUVXLHNCQUFzQjtrQkFoRGxDLFNBQVM7bUJBQUM7b0JBQ1YsUUFBUSxFQUFFLDBEQUEwRDtvQkFDcEUsUUFBUSxFQUFFOzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTRDVDtpQkFDRDtvSUFVYSxlQUFlO3NCQUEzQixLQUFLO2dCQVVrQixjQUFjO3NCQUFyQyxXQUFXO3VCQUFDLFNBQVM7Z0JBQzZCLGlCQUFpQjtzQkFBbkUsV0FBVzt1QkFBQyxvQ0FBb0M7Z0JBQ2EsWUFBWTtzQkFBekUsV0FBVzt1QkFBQywyQ0FBMkM7Z0JBQ00sT0FBTztzQkFBcEUsV0FBVzt1QkFBQywyQ0FBMkM7Z0JBQ0ssTUFBTTtzQkFBbEUsV0FBVzt1QkFBQywwQ0FBMEM7Z0JBQ2EsWUFBWTtzQkFBL0UsV0FBVzt1QkFBQyxpREFBaUQ7Z0JBQ0UsU0FBUztzQkFBeEUsV0FBVzt1QkFBQyw2Q0FBNkM7Z0JBQ00sU0FBUztzQkFBeEUsV0FBVzt1QkFBQyw2Q0FBNkM7Z0JBQ1UsWUFBWTtzQkFBL0UsV0FBVzt1QkFBQyxpREFBaUQ7Z0JBQ08sYUFBYTtzQkFBakYsV0FBVzt1QkFBQyxrREFBa0Q7Z0JBQ1csYUFBYTtzQkFBdEYsV0FBVzt1QkFBQyx1REFBdUQiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdElucHV0LFxuXHRIb3N0QmluZGluZ1xufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuXG5pbXBvcnQgeyBpc09ic2VydmFibGUsIG9mIH0gZnJvbSBcInJ4anNcIjtcbmltcG9ydCB7IEFjdGlvbmFibGVDb250ZW50LCBOb3RpZmljYXRpb25WYXJpYW50cyB9IGZyb20gXCIuL25vdGlmaWNhdGlvbi1jb250ZW50LmludGVyZmFjZVwiO1xuaW1wb3J0IHsgSTE4biB9IGZyb20gXCJjYXJib24tY29tcG9uZW50cy1hbmd1bGFyL2kxOG5cIjtcbmltcG9ydCB7IE5vdGlmaWNhdGlvbkRpc3BsYXlTZXJ2aWNlIH0gZnJvbSBcIi4vbm90aWZpY2F0aW9uLWRpc3BsYXkuc2VydmljZVwiO1xuaW1wb3J0IHsgQmFzZU5vdGlmaWNhdGlvbiB9IGZyb20gXCIuL2Jhc2Utbm90aWZpY2F0aW9uLmNvbXBvbmVudFwiO1xuXG4vKipcbiAqIEFjdGlvbmFibGUgbm90aWZpY2F0aW9uIGFsbG93cyBmb3IgaW50ZXJhY3RpdmUgZWxlbWVudHMgd2l0aGluIGEgbm90aWZpY2F0aW9uLiBUaGVyZSBhcmUgdHdvIHZhcmlhbnRzIG9mZmVyZWQsIGlubGluZSAmIHRvYXN0LlxuICpcbiAqIFtTZWUgZGVtb10oLi4vLi4vP3BhdGg9L3N0b3J5L2NvbXBvbmVudHMtbm90aWZpY2F0aW9uLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbilcbiAqL1xuQENvbXBvbmVudCh7XG5cdHNlbGVjdG9yOiBcImNkcy1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbiwgaWJtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uXCIsXG5cdHRlbXBsYXRlOiBgXG5cdFx0PGRpdiBjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX2RldGFpbHNcIj5cblx0XHRcdDxzdmdcblx0XHRcdFx0W2Nkc0ljb25dPVwiaWNvbkRpY3Rpb25hcnlbbm90aWZpY2F0aW9uT2JqLnR5cGVdXCJcblx0XHRcdFx0c2l6ZT1cIjIwXCJcblx0XHRcdFx0Km5nSWY9XCJub3RpZmljYXRpb25PYmoudHlwZVwiXG5cdFx0XHRcdFtuZ0NsYXNzXT1cIntcblx0XHRcdFx0XHQnY2RzLS1pbmxpbmUtbm90aWZpY2F0aW9uX19pY29uJzogbm90aWZpY2F0aW9uT2JqLnZhcmlhbnQgPT09ICdpbmxpbmUnLFxuXHRcdFx0XHRcdCdjZHMtLXRvYXN0LW5vdGlmaWNhdGlvbl9faWNvbic6IG5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSAndG9hc3QnXG5cdFx0XHRcdH1cIlxuXHRcdFx0XHRjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX2ljb25cIj5cblx0XHRcdDwvc3ZnPlxuXHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX3RleHQtd3JhcHBlclwiPlxuXHRcdFx0XHQ8ZGl2IGNsYXNzPVwiY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbl9fY29udGVudFwiPlxuXHRcdFx0XHRcdDxkaXYgKm5nSWY9XCIhbm90aWZpY2F0aW9uT2JqLnRlbXBsYXRlXCIgY2RzQWN0aW9uYWJsZVRpdGxlIFtpbm5lckhUTUxdPVwibm90aWZpY2F0aW9uT2JqLnRpdGxlXCI+PC9kaXY+XG5cdFx0XHRcdFx0PGRpdiAqbmdJZj1cIiFub3RpZmljYXRpb25PYmoudGVtcGxhdGVcIiBjZHNBY3Rpb25hYmxlU3VidGl0bGU+XG5cdFx0XHRcdFx0XHQ8c3BhbiBbaW5uZXJIVE1MXT1cIm5vdGlmaWNhdGlvbk9iai5tZXNzYWdlXCI+PC9zcGFuPlxuXHRcdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgbGluayBvZiBub3RpZmljYXRpb25PYmoubGlua3NcIj5cblx0XHRcdFx0XHRcdFx0PGEgY2RzTGluayBbaHJlZl09XCJsaW5rLmhyZWZcIj57e2xpbmsudGV4dH19PC9hPlxuXHRcdFx0XHRcdFx0PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdFx0PC9kaXY+XG5cdFx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdUZW1wbGF0ZU91dGxldD1cIm5vdGlmaWNhdGlvbk9iai50ZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IG5vdGlmaWNhdGlvbk9iaiB9XCI+PC9uZy1jb250YWluZXI+XG5cdFx0XHRcdDwvZGl2PlxuXHRcdFx0PC9kaXY+XG5cdFx0PC9kaXY+XG5cdFx0PG5nLWNvbnRhaW5lciAqbmdJZj1cIiFub3RpZmljYXRpb25PYmouYWN0aW9uc1RlbXBsYXRlXCI+XG5cdFx0XHQ8YnV0dG9uXG5cdFx0XHRcdCpuZ0Zvcj1cImxldCBhY3Rpb24gb2Ygbm90aWZpY2F0aW9uT2JqLmFjdGlvbnNcIlxuXHRcdFx0XHQoY2xpY2spPVwib25DbGljayhhY3Rpb24sICRldmVudClcIlxuXHRcdFx0XHRbY2RzQnV0dG9uXT1cIm5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSAnaW5saW5lJyA/ICdnaG9zdCcgOiAndGVydGlhcnknXCJcblx0XHRcdFx0c2l6ZT1cInNtXCJcblx0XHRcdFx0Y2RzQWN0aW9uYWJsZUJ1dHRvbj5cblx0XHRcdFx0e3thY3Rpb24udGV4dH19XG5cdFx0XHQ8L2J1dHRvbj5cblx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm90aWZpY2F0aW9uT2JqLmFjdGlvbnNUZW1wbGF0ZTsgY29udGV4dDogeyAkaW1wbGljaXQ6IG5vdGlmaWNhdGlvbk9iaiB9XCI+PC9uZy1jb250YWluZXI+XG5cdFx0PGJ1dHRvblxuXHRcdFx0Km5nSWY9XCIhaXNDbG9zZUhpZGRlblwiXG5cdFx0XHQoY2xpY2spPVwib25DbG9zZSgpXCJcblx0XHRcdGNsYXNzPVwiY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbl9fY2xvc2UtYnV0dG9uXCJcblx0XHRcdFthdHRyLmFyaWEtbGFiZWxdPVwibm90aWZpY2F0aW9uT2JqLmNsb3NlTGFiZWwgfCBhc3luY1wiXG5cdFx0XHR0eXBlPVwiYnV0dG9uXCI+XG5cdFx0XHQ8c3ZnIGNkc0ljb249XCJjbG9zZVwiIHNpemU9XCIxNlwiIGNsYXNzPVwiY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbl9fY2xvc2UtaWNvblwiPjwvc3ZnPlxuXHRcdDwvYnV0dG9uPlxuXHRgXG59KVxuZXhwb3J0IGNsYXNzIEFjdGlvbmFibGVOb3RpZmljYXRpb24gZXh0ZW5kcyBCYXNlTm90aWZpY2F0aW9uIHtcblx0cHJpdmF0ZSBzdGF0aWMgbm90aWZpY2F0aW9uQ291bnQgPSAwO1xuXHQvKipcblx0ICogQ2FuIGhhdmUgYHR5cGVgLCBgdGl0bGVgLCBhbmQgYG1lc3NhZ2VgIG1lbWJlcnMuXG5cdCAqXG5cdCAqIGB0eXBlYCBjYW4gYmUgb25lIG9mIGBcImVycm9yXCJgLCBgXCJpbmZvXCJgLCBgXCJpbmZvLXNxdWFyZVwiYCwgYFwid2FybmluZ1wiYCwgYFwid2FybmluZy1hbHRcImAsIG9yIGBcInN1Y2Nlc3NcImBcblx0ICpcblx0ICogYG1lc3NhZ2VgIGlzIHRoZSBtZXNzYWdlIHRvIGRpc3BsYXlcblx0ICovXG5cdEBJbnB1dCgpIGdldCBub3RpZmljYXRpb25PYmooKTogQWN0aW9uYWJsZUNvbnRlbnQge1xuXHRcdHJldHVybiB0aGlzLl9ub3RpZmljYXRpb25PYmo7XG5cdH1cblx0c2V0IG5vdGlmaWNhdGlvbk9iaihvYmo6IEFjdGlvbmFibGVDb250ZW50KSB7XG5cdFx0aWYgKG9iai5jbG9zZUxhYmVsICYmICFpc09ic2VydmFibGUob2JqLmNsb3NlTGFiZWwpKSB7XG5cdFx0XHRvYmouY2xvc2VMYWJlbCA9IG9mKG9iai5jbG9zZUxhYmVsKTtcblx0XHR9XG5cdFx0dGhpcy5fbm90aWZpY2F0aW9uT2JqID0gT2JqZWN0LmFzc2lnbih7fSwgdGhpcy5kZWZhdWx0Tm90aWZpY2F0aW9uT2JqLCBvYmopO1xuXHR9XG5cblx0QEhvc3RCaW5kaW5nKFwiYXR0ci5pZFwiKSBub3RpZmljYXRpb25JRCA9IGBub3RpZmljYXRpb24tJHtBY3Rpb25hYmxlTm90aWZpY2F0aW9uLm5vdGlmaWNhdGlvbkNvdW50Kyt9YDtcblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvblwiKSBub3RpZmljYXRpb25DbGFzcyA9IHRydWU7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLXRvYXN0XCIpIGdldCB0b2FzdFZhcmlhbnQoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSBcInRvYXN0XCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0tZXJyb3JcIikgZ2V0IGlzRXJyb3IoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcImVycm9yXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0taW5mb1wiKSBnZXQgaXNJbmZvKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJpbmZvXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0taW5mby1zcXVhcmVcIikgZ2V0IGlzSW5mb1NxdWFyZSgpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLnR5cGUgPT09IFwiaW5mby1zcXVhcmVcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS1zdWNjZXNzXCIpIGdldCBpc1N1Y2Nlc3MoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcInN1Y2Nlc3NcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS13YXJuaW5nXCIpIGdldCBpc1dhcm5pbmcoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcIndhcm5pbmdcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS13YXJuaW5nLWFsdFwiKSBnZXQgaXNXYXJuaW5nQWx0KCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJ3YXJuaW5nLWFsdFwiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWxvdy1jb250cmFzdFwiKSBnZXQgaXNMb3dDb250cmFzdCgpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLmxvd0NvbnRyYXN0OyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWhpZGUtY2xvc2UtYnV0dG9uXCIpIGdldCBpc0Nsb3NlSGlkZGVuKCkgeyByZXR1cm4gIXRoaXMuX25vdGlmaWNhdGlvbk9iai5zaG93Q2xvc2U7IH1cblxuXHQvKipcblx0ICogU2V0IGRlZmF1bHQgdmFyaWFudCAmIHJvbGUsIGFsdGVybmF0aXZlcyBjYW4gYmUgcHJvdmlkZWQgdGhyb3VnaCBub3RpZmljYXRpb25PYmogcHJvcGVydHlcblx0ICovXG5cdGRlZmF1bHROb3RpZmljYXRpb25PYmogPSB7XG5cdFx0Li4udGhpcy5kZWZhdWx0Tm90aWZpY2F0aW9uT2JqLFxuXHRcdHZhcmlhbnQ6IFwiaW5saW5lXCIgYXMgTm90aWZpY2F0aW9uVmFyaWFudHMsXG5cdFx0cm9sZTogXCJhbGVydGRpYWxvZ1wiXG5cdH07XG5cblx0Y29uc3RydWN0b3IocHJvdGVjdGVkIG5vdGlmaWNhdGlvbkRpc3BsYXlTZXJ2aWNlOiBOb3RpZmljYXRpb25EaXNwbGF5U2VydmljZSwgcHJvdGVjdGVkIGkxOG46IEkxOG4pIHtcblx0XHRzdXBlcihub3RpZmljYXRpb25EaXNwbGF5U2VydmljZSwgaTE4bik7XG5cdH1cbn1cbiJdfQ==