carbon-components-angular
Version:
Next generation components
205 lines • 22 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 = `actionable-notification-${ActionableNotification.notificationCount++}`;
this.notificationLabel = this.notificationID;
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.aria-labelledBy": "this.notificationLabel", "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
cdsActionableTitle
*ngIf="!notificationObj.template"
[id]="notificationID"
[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
cdsActionableTitle
*ngIf="!notificationObj.template"
[id]="notificationID"
[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
}], notificationLabel: [{
type: HostBinding,
args: ["attr.aria-labelledBy"]
}], 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,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWN0aW9uYWJsZS1ub3RpZmljYXRpb24uY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL25vdGlmaWNhdGlvbi9hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi5jb21wb25lbnQudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxFQUNOLFNBQVMsRUFDVCxLQUFLLEVBQ0wsV0FBVyxFQUNYLE1BQU0sZUFBZSxDQUFDO0FBRXZCLE9BQU8sRUFBRSxZQUFZLEVBQUUsRUFBRSxFQUFFLE1BQU0sTUFBTSxDQUFDO0FBSXhDLE9BQU8sRUFBRSxnQkFBZ0IsRUFBRSxNQUFNLCtCQUErQixDQUFDOzs7Ozs7Ozs7OztBQUVqRTs7OztHQUlHO0FBc0RILE1BQU0sT0FBTyxzQkFBdUIsU0FBUSxnQkFBZ0I7SUF5QzNELFlBQXNCLDBCQUFzRCxFQUFZLElBQVU7UUFDakcsS0FBSyxDQUFDLDBCQUEwQixFQUFFLElBQUksQ0FBQyxDQUFDO1FBRG5CLCtCQUEwQixHQUExQiwwQkFBMEIsQ0FBNEI7UUFBWSxTQUFJLEdBQUosSUFBSSxDQUFNO1FBdEJsRyxtQkFBYyxHQUFHLDJCQUEyQixzQkFBc0IsQ0FBQyxpQkFBaUIsRUFBRSxFQUFFLENBQUM7UUFDcEQsc0JBQWlCLEdBQUcsSUFBSSxDQUFDLGNBQWMsQ0FBQztRQUMxQixzQkFBaUIsR0FBRyxJQUFJLENBQUM7UUFXNUU7O1dBRUc7UUFDSCwyQkFBc0IsR0FBRztZQUN4QixHQUFHLElBQUksQ0FBQyxzQkFBc0I7WUFDOUIsT0FBTyxFQUFFLFFBQWdDO1lBQ3pDLElBQUksRUFBRSxhQUFhO1NBQ25CLENBQUM7SUFJRixDQUFDO0lBekNEOzs7Ozs7T0FNRztJQUNILElBQWEsZUFBZTtRQUMzQixPQUFPLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQztJQUM5QixDQUFDO0lBQ0QsSUFBSSxlQUFlLENBQUMsR0FBc0I7UUFDekMsSUFBSSxHQUFHLENBQUMsVUFBVSxJQUFJLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsRUFBRTtZQUNwRCxHQUFHLENBQUMsVUFBVSxHQUFHLEVBQUUsQ0FBQyxHQUFHLENBQUMsVUFBVSxDQUFDLENBQUM7U0FDcEM7UUFDRCxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxFQUFFLEVBQUUsSUFBSSxDQUFDLHNCQUFzQixFQUFFLEdBQUcsQ0FBQyxDQUFDO0lBQzdFLENBQUM7SUFLRCxJQUE4RCxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLE9BQU8sS0FBSyxPQUFPLENBQUMsQ0FBQyxDQUFDO0lBQ2pJLElBQThELE9BQU8sS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLE9BQU8sQ0FBQyxDQUFDLENBQUM7SUFDekgsSUFBNkQsTUFBTSxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssTUFBTSxDQUFDLENBQUMsQ0FBQztJQUN0SCxJQUFvRSxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFJLElBQWdFLFNBQVMsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsSUFBSSxLQUFLLFNBQVMsQ0FBQyxDQUFDLENBQUM7SUFDL0gsSUFBZ0UsU0FBUyxLQUFLLE9BQU8sSUFBSSxDQUFDLGVBQWUsQ0FBQyxJQUFJLEtBQUssU0FBUyxDQUFDLENBQUMsQ0FBQztJQUMvSCxJQUFvRSxZQUFZLEtBQUssT0FBTyxJQUFJLENBQUMsZUFBZSxDQUFDLElBQUksS0FBSyxhQUFhLENBQUMsQ0FBQyxDQUFDO0lBQzFJLElBQXFFLGFBQWEsS0FBSyxPQUFPLElBQUksQ0FBQyxlQUFlLENBQUMsV0FBVyxDQUFDLENBQUMsQ0FBQztJQUNqSSxJQUEwRSxhQUFhLEtBQUssT0FBTyxDQUFDLElBQUksQ0FBQyxnQkFBZ0IsQ0FBQyxTQUFTLENBQUMsQ0FBQyxDQUFDOztBQTdCdkgsd0NBQWlCLEdBQUcsQ0FBRSxDQUFBO21IQUR6QixzQkFBc0I7dUdBQXRCLHNCQUFzQix3NUJBbkR4Qjs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlEVDsyRkFFVyxzQkFBc0I7a0JBckRsQyxTQUFTO21CQUFDO29CQUNWLFFBQVEsRUFBRSwwREFBMEQ7b0JBQ3BFLFFBQVEsRUFBRTs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQWlEVDtpQkFDRDtvSUFVYSxlQUFlO3NCQUEzQixLQUFLO2dCQVcrQixpQkFBaUI7c0JBQXJELFdBQVc7dUJBQUMsc0JBQXNCO2dCQUNnQixpQkFBaUI7c0JBQW5FLFdBQVc7dUJBQUMsb0NBQW9DO2dCQUNhLFlBQVk7c0JBQXpFLFdBQVc7dUJBQUMsMkNBQTJDO2dCQUNNLE9BQU87c0JBQXBFLFdBQVc7dUJBQUMsMkNBQTJDO2dCQUNLLE1BQU07c0JBQWxFLFdBQVc7dUJBQUMsMENBQTBDO2dCQUNhLFlBQVk7c0JBQS9FLFdBQVc7dUJBQUMsaURBQWlEO2dCQUNFLFNBQVM7c0JBQXhFLFdBQVc7dUJBQUMsNkNBQTZDO2dCQUNNLFNBQVM7c0JBQXhFLFdBQVc7dUJBQUMsNkNBQTZDO2dCQUNVLFlBQVk7c0JBQS9FLFdBQVc7dUJBQUMsaURBQWlEO2dCQUNPLGFBQWE7c0JBQWpGLFdBQVc7dUJBQUMsa0RBQWtEO2dCQUNXLGFBQWE7c0JBQXRGLFdBQVc7dUJBQUMsdURBQXVEIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcblx0Q29tcG9uZW50LFxuXHRJbnB1dCxcblx0SG9zdEJpbmRpbmdcbn0gZnJvbSBcIkBhbmd1bGFyL2NvcmVcIjtcblxuaW1wb3J0IHsgaXNPYnNlcnZhYmxlLCBvZiB9IGZyb20gXCJyeGpzXCI7XG5pbXBvcnQgeyBBY3Rpb25hYmxlQ29udGVudCwgTm90aWZpY2F0aW9uVmFyaWFudHMgfSBmcm9tIFwiLi9ub3RpZmljYXRpb24tY29udGVudC5pbnRlcmZhY2VcIjtcbmltcG9ydCB7IEkxOG4gfSBmcm9tIFwiY2FyYm9uLWNvbXBvbmVudHMtYW5ndWxhci9pMThuXCI7XG5pbXBvcnQgeyBOb3RpZmljYXRpb25EaXNwbGF5U2VydmljZSB9IGZyb20gXCIuL25vdGlmaWNhdGlvbi1kaXNwbGF5LnNlcnZpY2VcIjtcbmltcG9ydCB7IEJhc2VOb3RpZmljYXRpb24gfSBmcm9tIFwiLi9iYXNlLW5vdGlmaWNhdGlvbi5jb21wb25lbnRcIjtcblxuLyoqXG4gKiBBY3Rpb25hYmxlIG5vdGlmaWNhdGlvbiBhbGxvd3MgZm9yIGludGVyYWN0aXZlIGVsZW1lbnRzIHdpdGhpbiBhIG5vdGlmaWNhdGlvbi4gVGhlcmUgYXJlIHR3byB2YXJpYW50cyBvZmZlcmVkLCBpbmxpbmUgJiB0b2FzdC5cbiAqXG4gKiBbU2VlIGRlbW9dKC4uLy4uLz9wYXRoPS9zdG9yeS9jb21wb25lbnRzLW5vdGlmaWNhdGlvbi0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24pXG4gKi9cbkBDb21wb25lbnQoe1xuXHRzZWxlY3RvcjogXCJjZHMtYWN0aW9uYWJsZS1ub3RpZmljYXRpb24sIGlibS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvblwiLFxuXHR0ZW1wbGF0ZTogYFxuXHRcdDxkaXYgY2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19kZXRhaWxzXCI+XG5cdFx0XHQ8c3ZnXG5cdFx0XHRcdFtjZHNJY29uXT1cImljb25EaWN0aW9uYXJ5W25vdGlmaWNhdGlvbk9iai50eXBlXVwiXG5cdFx0XHRcdHNpemU9XCIyMFwiXG5cdFx0XHRcdCpuZ0lmPVwibm90aWZpY2F0aW9uT2JqLnR5cGVcIlxuXHRcdFx0XHRbbmdDbGFzc109XCJ7XG5cdFx0XHRcdFx0J2Nkcy0taW5saW5lLW5vdGlmaWNhdGlvbl9faWNvbic6IG5vdGlmaWNhdGlvbk9iai52YXJpYW50ID09PSAnaW5saW5lJyxcblx0XHRcdFx0XHQnY2RzLS10b2FzdC1ub3RpZmljYXRpb25fX2ljb24nOiBub3RpZmljYXRpb25PYmoudmFyaWFudCA9PT0gJ3RvYXN0J1xuXHRcdFx0XHR9XCJcblx0XHRcdFx0Y2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19pY29uXCI+XG5cdFx0XHQ8L3N2Zz5cblx0XHRcdDxkaXYgY2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX190ZXh0LXdyYXBwZXJcIj5cblx0XHRcdFx0PGRpdiBjbGFzcz1cImNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25fX2NvbnRlbnRcIj5cblx0XHRcdFx0XHQ8ZGl2XG5cdFx0XHRcdFx0XHRjZHNBY3Rpb25hYmxlVGl0bGVcblx0XHRcdFx0XHRcdCpuZ0lmPVwiIW5vdGlmaWNhdGlvbk9iai50ZW1wbGF0ZVwiXG5cdFx0XHRcdFx0XHRbaWRdPVwibm90aWZpY2F0aW9uSURcIlxuXHRcdFx0XHRcdFx0W2lubmVySFRNTF09XCJub3RpZmljYXRpb25PYmoudGl0bGVcIj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8ZGl2ICpuZ0lmPVwiIW5vdGlmaWNhdGlvbk9iai50ZW1wbGF0ZVwiIGNkc0FjdGlvbmFibGVTdWJ0aXRsZT5cblx0XHRcdFx0XHRcdDxzcGFuIFtpbm5lckhUTUxdPVwibm90aWZpY2F0aW9uT2JqLm1lc3NhZ2VcIj48L3NwYW4+XG5cdFx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ0Zvcj1cImxldCBsaW5rIG9mIG5vdGlmaWNhdGlvbk9iai5saW5rc1wiPlxuXHRcdFx0XHRcdFx0XHQ8YSBjZHNMaW5rIFtocmVmXT1cImxpbmsuaHJlZlwiPnt7bGluay50ZXh0fX08L2E+XG5cdFx0XHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0XHQ8L2Rpdj5cblx0XHRcdFx0XHQ8bmctY29udGFpbmVyICpuZ1RlbXBsYXRlT3V0bGV0PVwibm90aWZpY2F0aW9uT2JqLnRlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbm90aWZpY2F0aW9uT2JqIH1cIj48L25nLWNvbnRhaW5lcj5cblx0XHRcdFx0PC9kaXY+XG5cdFx0XHQ8L2Rpdj5cblx0XHQ8L2Rpdj5cblx0XHQ8bmctY29udGFpbmVyICpuZ0lmPVwiIW5vdGlmaWNhdGlvbk9iai5hY3Rpb25zVGVtcGxhdGVcIj5cblx0XHRcdDxidXR0b25cblx0XHRcdFx0Km5nRm9yPVwibGV0IGFjdGlvbiBvZiBub3RpZmljYXRpb25PYmouYWN0aW9uc1wiXG5cdFx0XHRcdChjbGljayk9XCJvbkNsaWNrKGFjdGlvbiwgJGV2ZW50KVwiXG5cdFx0XHRcdFtjZHNCdXR0b25dPVwibm90aWZpY2F0aW9uT2JqLnZhcmlhbnQgPT09ICdpbmxpbmUnID8gJ2dob3N0JyA6ICd0ZXJ0aWFyeSdcIlxuXHRcdFx0XHRzaXplPVwic21cIlxuXHRcdFx0XHRjZHNBY3Rpb25hYmxlQnV0dG9uPlxuXHRcdFx0XHR7e2FjdGlvbi50ZXh0fX1cblx0XHRcdDwvYnV0dG9uPlxuXHRcdDwvbmctY29udGFpbmVyPlxuXHRcdDxuZy1jb250YWluZXIgKm5nVGVtcGxhdGVPdXRsZXQ9XCJub3RpZmljYXRpb25PYmouYWN0aW9uc1RlbXBsYXRlOyBjb250ZXh0OiB7ICRpbXBsaWNpdDogbm90aWZpY2F0aW9uT2JqIH1cIj48L25nLWNvbnRhaW5lcj5cblx0XHQ8YnV0dG9uXG5cdFx0XHQqbmdJZj1cIiFpc0Nsb3NlSGlkZGVuXCJcblx0XHRcdChjbGljayk9XCJvbkNsb3NlKClcIlxuXHRcdFx0Y2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19jbG9zZS1idXR0b25cIlxuXHRcdFx0W2F0dHIuYXJpYS1sYWJlbF09XCJub3RpZmljYXRpb25PYmouY2xvc2VMYWJlbCB8IGFzeW5jXCJcblx0XHRcdHR5cGU9XCJidXR0b25cIj5cblx0XHRcdDxzdmcgY2RzSWNvbj1cImNsb3NlXCIgc2l6ZT1cIjE2XCIgY2xhc3M9XCJjZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uX19jbG9zZS1pY29uXCI+PC9zdmc+XG5cdFx0PC9idXR0b24+XG5cdGBcbn0pXG5leHBvcnQgY2xhc3MgQWN0aW9uYWJsZU5vdGlmaWNhdGlvbiBleHRlbmRzIEJhc2VOb3RpZmljYXRpb24ge1xuXHRwcml2YXRlIHN0YXRpYyBub3RpZmljYXRpb25Db3VudCA9IDA7XG5cdC8qKlxuXHQgKiBDYW4gaGF2ZSBgdHlwZWAsIGB0aXRsZWAsIGFuZCBgbWVzc2FnZWAgbWVtYmVycy5cblx0ICpcblx0ICogYHR5cGVgIGNhbiBiZSBvbmUgb2YgYFwiZXJyb3JcImAsIGBcImluZm9cImAsIGBcImluZm8tc3F1YXJlXCJgLCBgXCJ3YXJuaW5nXCJgLCBgXCJ3YXJuaW5nLWFsdFwiYCwgb3IgYFwic3VjY2Vzc1wiYFxuXHQgKlxuXHQgKiBgbWVzc2FnZWAgaXMgdGhlIG1lc3NhZ2UgdG8gZGlzcGxheVxuXHQgKi9cblx0QElucHV0KCkgZ2V0IG5vdGlmaWNhdGlvbk9iaigpOiBBY3Rpb25hYmxlQ29udGVudCB7XG5cdFx0cmV0dXJuIHRoaXMuX25vdGlmaWNhdGlvbk9iajtcblx0fVxuXHRzZXQgbm90aWZpY2F0aW9uT2JqKG9iajogQWN0aW9uYWJsZUNvbnRlbnQpIHtcblx0XHRpZiAob2JqLmNsb3NlTGFiZWwgJiYgIWlzT2JzZXJ2YWJsZShvYmouY2xvc2VMYWJlbCkpIHtcblx0XHRcdG9iai5jbG9zZUxhYmVsID0gb2Yob2JqLmNsb3NlTGFiZWwpO1xuXHRcdH1cblx0XHR0aGlzLl9ub3RpZmljYXRpb25PYmogPSBPYmplY3QuYXNzaWduKHt9LCB0aGlzLmRlZmF1bHROb3RpZmljYXRpb25PYmosIG9iaik7XG5cdH1cblxuXHRub3RpZmljYXRpb25JRCA9IGBhY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0ke0FjdGlvbmFibGVOb3RpZmljYXRpb24ubm90aWZpY2F0aW9uQ291bnQrK31gO1xuXHRASG9zdEJpbmRpbmcoXCJhdHRyLmFyaWEtbGFiZWxsZWRCeVwiKSBub3RpZmljYXRpb25MYWJlbCA9IHRoaXMubm90aWZpY2F0aW9uSUQ7XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb25cIikgbm90aWZpY2F0aW9uQ2xhc3MgPSB0cnVlO1xuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS10b2FzdFwiKSBnZXQgdG9hc3RWYXJpYW50KCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudmFyaWFudCA9PT0gXCJ0b2FzdFwiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWVycm9yXCIpIGdldCBpc0Vycm9yKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJlcnJvclwiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWluZm9cIikgZ2V0IGlzSW5mbygpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLnR5cGUgPT09IFwiaW5mb1wiOyB9XG5cdEBIb3N0QmluZGluZyhcImNsYXNzLmNkcy0tYWN0aW9uYWJsZS1ub3RpZmljYXRpb24tLWluZm8tc3F1YXJlXCIpIGdldCBpc0luZm9TcXVhcmUoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai50eXBlID09PSBcImluZm8tc3F1YXJlXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0tc3VjY2Vzc1wiKSBnZXQgaXNTdWNjZXNzKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJzdWNjZXNzXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0td2FybmluZ1wiKSBnZXQgaXNXYXJuaW5nKCkgeyByZXR1cm4gdGhpcy5ub3RpZmljYXRpb25PYmoudHlwZSA9PT0gXCJ3YXJuaW5nXCI7IH1cblx0QEhvc3RCaW5kaW5nKFwiY2xhc3MuY2RzLS1hY3Rpb25hYmxlLW5vdGlmaWNhdGlvbi0td2FybmluZy1hbHRcIikgZ2V0IGlzV2FybmluZ0FsdCgpIHsgcmV0dXJuIHRoaXMubm90aWZpY2F0aW9uT2JqLnR5cGUgPT09IFwid2FybmluZy1hbHRcIjsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS1sb3ctY29udHJhc3RcIikgZ2V0IGlzTG93Q29udHJhc3QoKSB7IHJldHVybiB0aGlzLm5vdGlmaWNhdGlvbk9iai5sb3dDb250cmFzdDsgfVxuXHRASG9zdEJpbmRpbmcoXCJjbGFzcy5jZHMtLWFjdGlvbmFibGUtbm90aWZpY2F0aW9uLS1oaWRlLWNsb3NlLWJ1dHRvblwiKSBnZXQgaXNDbG9zZUhpZGRlbigpIHsgcmV0dXJuICF0aGlzLl9ub3RpZmljYXRpb25PYmouc2hvd0Nsb3NlOyB9XG5cblx0LyoqXG5cdCAqIFNldCBkZWZhdWx0IHZhcmlhbnQgJiByb2xlLCBhbHRlcm5hdGl2ZXMgY2FuIGJlIHByb3ZpZGVkIHRocm91Z2ggbm90aWZpY2F0aW9uT2JqIHByb3BlcnR5XG5cdCAqL1xuXHRkZWZhdWx0Tm90aWZpY2F0aW9uT2JqID0ge1xuXHRcdC4uLnRoaXMuZGVmYXVsdE5vdGlmaWNhdGlvbk9iaixcblx0XHR2YXJpYW50OiBcImlubGluZVwiIGFzIE5vdGlmaWNhdGlvblZhcmlhbnRzLFxuXHRcdHJvbGU6IFwiYWxlcnRkaWFsb2dcIlxuXHR9O1xuXG5cdGNvbnN0cnVjdG9yKHByb3RlY3RlZCBub3RpZmljYXRpb25EaXNwbGF5U2VydmljZTogTm90aWZpY2F0aW9uRGlzcGxheVNlcnZpY2UsIHByb3RlY3RlZCBpMThuOiBJMThuKSB7XG5cdFx0c3VwZXIobm90aWZpY2F0aW9uRGlzcGxheVNlcnZpY2UsIGkxOG4pO1xuXHR9XG59XG4iXX0=