carbon-components-angular
Version:
Next generation components
212 lines • 18 kB
JavaScript
import { Component, Inject, ViewChild, Optional } from "@angular/core";
import { BaseModal } from "./base-modal.class";
import * as i0 from "@angular/core";
import * as i1 from "@angular/common";
import * as i2 from "carbon-components-angular/forms";
import * as i3 from "./modal.component";
import * as i4 from "./modal-header.component";
import * as i5 from "./modal-footer.component";
import * as i6 from "./modal-content.directive";
import * as i7 from "./modal-header-heading.directive";
import * as i8 from "./modal-header-label.directive";
/**
* Component to create standard modals for presenting content or asking for user's input.
* It can show as a passive modal showing only text or show as a transactional modal with
* multiple buttons for different actions for the user to choose from.
*
* Using a modal in your application requires `cds-placeholder` which would generally be
* placed near the end of your app component template (app.component.ts or app.component.html) as:
*
* ```html
* <cds-placeholder></cds-placeholder>
* ```
*
* Example of opening the modal:
*
* ```typescript
* \@Component({
* selector: "app-modal-demo",
* template: `
* <button class="btn--primary" (click)="openModal()">Open modal</button>
* <cds-placeholder></cds-placeholder>`
* })
* export class ModalDemo {
* openModal() {
* this.modalService.show({
* modalType: "default",
* label: "optional header text",
* title: "Modal title",
* text: "Modal text",
* buttons: [{
* text: "Button text",
* type: "primary",
* click: clickFunction
* }]
* });
* }
* }
* ```
*/
export class AlertModal extends BaseModal {
/**
* Creates an instance of `AlertModal`.
*/
constructor(type = "default", label, title, content, size, hasScrollingContent = null, buttons = [], onClose, showCloseButton = true) {
super();
this.type = type;
this.label = label;
this.title = title;
this.content = content;
this.size = size;
this.hasScrollingContent = hasScrollingContent;
this.buttons = buttons;
this.onClose = onClose;
this.showCloseButton = showCloseButton;
for (let i = 0; i < this.buttons.length; i++) {
const button = this.buttons[i];
if (!button.id) {
button.id = `alert-modal-button-${i}`;
}
if (!button.type) {
button.type = "secondary";
}
}
}
ngAfterViewInit() {
if (!this.modalContent) {
return false;
}
const element = this.modalContent.nativeElement;
if (element.scrollHeight > element.clientHeight) {
element.tabIndex = 0;
}
else {
element.tabIndex = -1;
}
}
buttonClicked(buttonIndex) {
const button = this.buttons[buttonIndex];
if (button.click) {
button.click();
}
this.closeModal();
}
dismissModal(trigger) {
if (this.onClose && this.onClose(trigger) === false) {
return;
}
this.closeModal();
}
}
AlertModal.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AlertModal, deps: [{ token: "type", optional: true }, { token: "label", optional: true }, { token: "title", optional: true }, { token: "content", optional: true }, { token: "size", optional: true }, { token: "hasScrollingContent", optional: true }, { token: "buttons", optional: true }, { token: "close", optional: true }, { token: "showCloseButton", optional: true }], target: i0.ɵɵFactoryTarget.Component });
AlertModal.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "14.3.0", type: AlertModal, selector: "cds-alert-modal, ibm-alert-modal", viewQueries: [{ propertyName: "modalContent", first: true, predicate: ["modalContent"], descendants: true, static: true }], usesInheritance: true, ngImport: i0, template: `
<cds-modal
[size]="size"
[theme]="type"
[ariaLabel]="title"
[hasScrollingContent]="hasScrollingContent"
[open]="open"
(overlaySelected)="dismissModal('overlay')">
<cds-modal-header (closeSelect)="dismissModal('close')" [showCloseButton]="showCloseButton">
<p cdsModalHeaderLabel class="cds--type-delta">{{label}}</p>
<p cdsModalHeaderHeading class="cds--type-beta">{{title}}</p>
</cds-modal-header>
<div cdsModalContent #modalContent>
<p [innerHTML]="content"></p>
</div>
<cds-modal-footer *ngIf="buttons.length > 0">
<ng-container *ngFor="let button of buttons; let i = index">
<button
[cdsButton]="button.type"
(click)="buttonClicked(i)"
[id]="button.id"
[attr.modal-primary-focus]="(button.type.indexOf('primary') !== -1 ? '' : null)">
{{button.text}}
</button>
</ng-container>
</cds-modal-footer>
</cds-modal>
`, isInline: true, dependencies: [{ kind: "directive", type: i1.NgForOf, selector: "[ngFor][ngForOf]", inputs: ["ngForOf", "ngForTrackBy", "ngForTemplate"] }, { kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i2.Button, selector: "[cdsButton], [ibmButton]", inputs: ["ibmButton", "cdsButton", "size", "skeleton", "iconOnly", "isExpressive"] }, { kind: "component", type: i3.Modal, selector: "cds-modal, ibm-modal", inputs: ["size", "theme", "ariaLabel", "open", "trigger", "hasScrollingContent"], outputs: ["overlaySelected", "close"] }, { kind: "component", type: i4.ModalHeader, selector: "cds-modal-header, ibm-modal-header", inputs: ["theme", "closeLabel", "showCloseButton"], outputs: ["closeSelect"] }, { kind: "component", type: i5.ModalFooter, selector: "cds-modal-footer, ibm-modal-footer" }, { kind: "directive", type: i6.ModalContent, selector: "[cdsModalContent], [ibmModalContent]", inputs: ["hasForm"] }, { kind: "directive", type: i7.ModalHeaderHeading, selector: "[cdsModalHeaderHeading], [ibmModalHeaderHeading]" }, { kind: "directive", type: i8.ModalHeaderLabel, selector: "[cdsModalHeaderLabel], [ibmModalHeaderLabel]" }] });
i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "14.3.0", ngImport: i0, type: AlertModal, decorators: [{
type: Component,
args: [{
selector: "cds-alert-modal, ibm-alert-modal",
template: `
<cds-modal
[size]="size"
[theme]="type"
[ariaLabel]="title"
[hasScrollingContent]="hasScrollingContent"
[open]="open"
(overlaySelected)="dismissModal('overlay')">
<cds-modal-header (closeSelect)="dismissModal('close')" [showCloseButton]="showCloseButton">
<p cdsModalHeaderLabel class="cds--type-delta">{{label}}</p>
<p cdsModalHeaderHeading class="cds--type-beta">{{title}}</p>
</cds-modal-header>
<div cdsModalContent #modalContent>
<p [innerHTML]="content"></p>
</div>
<cds-modal-footer *ngIf="buttons.length > 0">
<ng-container *ngFor="let button of buttons; let i = index">
<button
[cdsButton]="button.type"
(click)="buttonClicked(i)"
[id]="button.id"
[attr.modal-primary-focus]="(button.type.indexOf('primary') !== -1 ? '' : null)">
{{button.text}}
</button>
</ng-container>
</cds-modal-footer>
</cds-modal>
`
}]
}], ctorParameters: function () { return [{ type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["type"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["label"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["title"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["content"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["size"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["hasScrollingContent"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["buttons"]
}] }, { type: Function, decorators: [{
type: Optional
}, {
type: Inject,
args: ["close"]
}] }, { type: undefined, decorators: [{
type: Optional
}, {
type: Inject,
args: ["showCloseButton"]
}] }]; }, propDecorators: { modalContent: [{
type: ViewChild,
args: ["modalContent", { static: true }]
}] } });
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYWxlcnQtbW9kYWwuY29tcG9uZW50LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21vZGFsL2FsZXJ0LW1vZGFsLmNvbXBvbmVudC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQ04sU0FBUyxFQUNULE1BQU0sRUFDTixTQUFTLEVBRVQsUUFBUSxFQUNSLE1BQU0sZUFBZSxDQUFDO0FBQ3ZCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQzs7Ozs7Ozs7OztBQUUvQzs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQXFDRztBQWdDSCxNQUFNLE9BQU8sVUFBVyxTQUFRLFNBQVM7SUFFeEM7O09BRUc7SUFDSCxZQUNvQyxPQUFPLFNBQVMsRUFDZixLQUFhLEVBQ2IsS0FBYSxFQUNYLE9BQWUsRUFDbEIsSUFBWSxFQUNHLHNCQUErQixJQUFJLEVBQy9DLFVBQVUsRUFBRSxFQUNkLE9BQWlCLEVBQ1Asa0JBQWtCLElBQUk7UUFFcEUsS0FBSyxFQUFFLENBQUM7UUFWMkIsU0FBSSxHQUFKLElBQUksQ0FBWTtRQUNmLFVBQUssR0FBTCxLQUFLLENBQVE7UUFDYixVQUFLLEdBQUwsS0FBSyxDQUFRO1FBQ1gsWUFBTyxHQUFQLE9BQU8sQ0FBUTtRQUNsQixTQUFJLEdBQUosSUFBSSxDQUFRO1FBQ0csd0JBQW1CLEdBQW5CLG1CQUFtQixDQUFnQjtRQUMvQyxZQUFPLEdBQVAsT0FBTyxDQUFLO1FBQ2QsWUFBTyxHQUFQLE9BQU8sQ0FBVTtRQUNQLG9CQUFlLEdBQWYsZUFBZSxDQUFPO1FBR3BFLEtBQUssSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFLENBQUMsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDLEVBQUUsRUFBRTtZQUM3QyxNQUFNLE1BQU0sR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLENBQUMsQ0FBQyxDQUFDO1lBQy9CLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxFQUFFO2dCQUNmLE1BQU0sQ0FBQyxFQUFFLEdBQUcsc0JBQXNCLENBQUMsRUFBRSxDQUFDO2FBQ3RDO1lBQ0QsSUFBSSxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUU7Z0JBQ2pCLE1BQU0sQ0FBQyxJQUFJLEdBQUcsV0FBVyxDQUFDO2FBQzFCO1NBQ0Q7SUFDRixDQUFDO0lBRUQsZUFBZTtRQUNkLElBQUksQ0FBQyxJQUFJLENBQUMsWUFBWSxFQUFFO1lBQUUsT0FBTyxLQUFLLENBQUM7U0FBRTtRQUN6QyxNQUFNLE9BQU8sR0FBRyxJQUFJLENBQUMsWUFBWSxDQUFDLGFBQWEsQ0FBQztRQUNoRCxJQUFJLE9BQU8sQ0FBQyxZQUFZLEdBQUcsT0FBTyxDQUFDLFlBQVksRUFBRTtZQUNoRCxPQUFPLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztTQUNyQjthQUFNO1lBQ04sT0FBTyxDQUFDLFFBQVEsR0FBRyxDQUFDLENBQUMsQ0FBQztTQUN0QjtJQUNGLENBQUM7SUFFRCxhQUFhLENBQUMsV0FBNEI7UUFDekMsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE9BQU8sQ0FBQyxXQUFXLENBQUMsQ0FBQztRQUN6QyxJQUFJLE1BQU0sQ0FBQyxLQUFLLEVBQUU7WUFDakIsTUFBTSxDQUFDLEtBQUssRUFBRSxDQUFDO1NBQ2Y7UUFFRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbkIsQ0FBQztJQUVELFlBQVksQ0FBQyxPQUFZO1FBQ3hCLElBQUksSUFBSSxDQUFDLE9BQU8sSUFBSSxJQUFJLENBQUMsT0FBTyxDQUFDLE9BQU8sQ0FBQyxLQUFLLEtBQUssRUFBRTtZQUNwRCxPQUFPO1NBQ1A7UUFDRCxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7SUFDbkIsQ0FBQzs7dUdBcERXLFVBQVUsa0JBTUQsTUFBTSw2QkFDTixPQUFPLDZCQUNQLE9BQU8sNkJBQ1AsU0FBUyw2QkFDVCxNQUFNLDZCQUNOLHFCQUFxQiw2QkFDckIsU0FBUyw2QkFDVCxPQUFPLDZCQUNQLGlCQUFpQjsyRkFkMUIsVUFBVSwyTkE3Qlo7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJCVDsyRkFFVyxVQUFVO2tCQS9CdEIsU0FBUzttQkFBQztvQkFDVixRQUFRLEVBQUUsa0NBQWtDO29CQUM1QyxRQUFRLEVBQUU7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7OztFQTJCVDtpQkFDRDs7MEJBT0UsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNOzswQkFDekIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxPQUFPOzswQkFDMUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxPQUFPOzswQkFDMUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxTQUFTOzswQkFDNUIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxNQUFNOzswQkFDekIsUUFBUTs7MEJBQUksTUFBTTsyQkFBQyxxQkFBcUI7OzBCQUN4QyxRQUFROzswQkFBSSxNQUFNOzJCQUFDLFNBQVM7OzBCQUM1QixRQUFROzswQkFBSSxNQUFNOzJCQUFDLE9BQU87OzBCQUMxQixRQUFROzswQkFBSSxNQUFNOzJCQUFDLGlCQUFpQjs0Q0FiTyxZQUFZO3NCQUF4RCxTQUFTO3VCQUFDLGNBQWMsRUFBRSxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQge1xuXHRDb21wb25lbnQsXG5cdEluamVjdCxcblx0Vmlld0NoaWxkLFxuXHRBZnRlclZpZXdJbml0LFxuXHRPcHRpb25hbFxufSBmcm9tIFwiQGFuZ3VsYXIvY29yZVwiO1xuaW1wb3J0IHsgQmFzZU1vZGFsIH0gZnJvbSBcIi4vYmFzZS1tb2RhbC5jbGFzc1wiO1xuXG4vKipcbiAqIENvbXBvbmVudCB0byBjcmVhdGUgc3RhbmRhcmQgbW9kYWxzIGZvciBwcmVzZW50aW5nIGNvbnRlbnQgb3IgYXNraW5nIGZvciB1c2VyJ3MgaW5wdXQuXG4gKiBJdCBjYW4gc2hvdyBhcyBhIHBhc3NpdmUgbW9kYWwgc2hvd2luZyBvbmx5IHRleHQgb3Igc2hvdyBhcyBhIHRyYW5zYWN0aW9uYWwgbW9kYWwgd2l0aFxuICogbXVsdGlwbGUgYnV0dG9ucyBmb3IgZGlmZmVyZW50IGFjdGlvbnMgZm9yIHRoZSB1c2VyIHRvIGNob29zZSBmcm9tLlxuICpcbiAqIFVzaW5nIGEgbW9kYWwgaW4geW91ciBhcHBsaWNhdGlvbiByZXF1aXJlcyBgY2RzLXBsYWNlaG9sZGVyYCB3aGljaCB3b3VsZCBnZW5lcmFsbHkgYmVcbiAqIHBsYWNlZCBuZWFyIHRoZSBlbmQgb2YgeW91ciBhcHAgY29tcG9uZW50IHRlbXBsYXRlIChhcHAuY29tcG9uZW50LnRzIG9yIGFwcC5jb21wb25lbnQuaHRtbCkgYXM6XG4gKlxuICogYGBgaHRtbFxuICogPGNkcy1wbGFjZWhvbGRlcj48L2Nkcy1wbGFjZWhvbGRlcj5cbiAqIGBgYFxuICpcbiAqIEV4YW1wbGUgb2Ygb3BlbmluZyB0aGUgbW9kYWw6XG4gKlxuICogYGBgdHlwZXNjcmlwdFxuICogXFxAQ29tcG9uZW50KHtcbiAqICBzZWxlY3RvcjogXCJhcHAtbW9kYWwtZGVtb1wiLFxuICogIHRlbXBsYXRlOiBgXG4gKiAgIDxidXR0b24gY2xhc3M9XCJidG4tLXByaW1hcnlcIiAoY2xpY2spPVwib3Blbk1vZGFsKClcIj5PcGVuIG1vZGFsPC9idXR0b24+XG4gKiAgIDxjZHMtcGxhY2Vob2xkZXI+PC9jZHMtcGxhY2Vob2xkZXI+YFxuICogfSlcbiAqIGV4cG9ydCBjbGFzcyBNb2RhbERlbW8ge1xuICogXHRvcGVuTW9kYWwoKSB7XG4gKiBcdFx0dGhpcy5tb2RhbFNlcnZpY2Uuc2hvdyh7XG4gKlx0XHRcdG1vZGFsVHlwZTogXCJkZWZhdWx0XCIsXG4gKlx0XHRcdGxhYmVsOiBcIm9wdGlvbmFsIGhlYWRlciB0ZXh0XCIsXG4gKlx0XHRcdHRpdGxlOiBcIk1vZGFsIHRpdGxlXCIsXG4gKlx0XHRcdHRleHQ6IFwiTW9kYWwgdGV4dFwiLFxuICpcdFx0XHRidXR0b25zOiBbe1xuICpcdFx0XHRcdHRleHQ6IFwiQnV0dG9uIHRleHRcIixcbiAqXHRcdFx0XHR0eXBlOiBcInByaW1hcnlcIixcbiAqXHRcdFx0XHRjbGljazogY2xpY2tGdW5jdGlvblxuICpcdFx0XHR9XVxuICpcdFx0fSk7XG4gKiBcdH1cbiAqIH1cbiAqIGBgYFxuICovXG5AQ29tcG9uZW50KHtcblx0c2VsZWN0b3I6IFwiY2RzLWFsZXJ0LW1vZGFsLCBpYm0tYWxlcnQtbW9kYWxcIixcblx0dGVtcGxhdGU6IGBcblx0XHQ8Y2RzLW1vZGFsXG5cdFx0XHRbc2l6ZV09XCJzaXplXCJcblx0XHRcdFt0aGVtZV09XCJ0eXBlXCJcblx0XHRcdFthcmlhTGFiZWxdPVwidGl0bGVcIlxuXHRcdFx0W2hhc1Njcm9sbGluZ0NvbnRlbnRdPVwiaGFzU2Nyb2xsaW5nQ29udGVudFwiXG5cdFx0XHRbb3Blbl09XCJvcGVuXCJcblx0XHRcdChvdmVybGF5U2VsZWN0ZWQpPVwiZGlzbWlzc01vZGFsKCdvdmVybGF5JylcIj5cblx0XHRcdDxjZHMtbW9kYWwtaGVhZGVyIChjbG9zZVNlbGVjdCk9XCJkaXNtaXNzTW9kYWwoJ2Nsb3NlJylcIiBbc2hvd0Nsb3NlQnV0dG9uXT1cInNob3dDbG9zZUJ1dHRvblwiPlxuXHRcdFx0XHQ8cCBjZHNNb2RhbEhlYWRlckxhYmVsIGNsYXNzPVwiY2RzLS10eXBlLWRlbHRhXCI+e3tsYWJlbH19PC9wPlxuXHRcdFx0XHQ8cCBjZHNNb2RhbEhlYWRlckhlYWRpbmcgY2xhc3M9XCJjZHMtLXR5cGUtYmV0YVwiPnt7dGl0bGV9fTwvcD5cblx0XHRcdDwvY2RzLW1vZGFsLWhlYWRlcj5cblx0XHRcdDxkaXYgY2RzTW9kYWxDb250ZW50ICNtb2RhbENvbnRlbnQ+XG5cdFx0XHRcdDxwIFtpbm5lckhUTUxdPVwiY29udGVudFwiPjwvcD5cblx0XHRcdDwvZGl2PlxuXHRcdFx0PGNkcy1tb2RhbC1mb290ZXIgKm5nSWY9XCJidXR0b25zLmxlbmd0aCA+IDBcIj5cblx0XHRcdFx0PG5nLWNvbnRhaW5lciAqbmdGb3I9XCJsZXQgYnV0dG9uIG9mIGJ1dHRvbnM7IGxldCBpID0gaW5kZXhcIj5cblx0XHRcdFx0XHQ8YnV0dG9uXG5cdFx0XHRcdFx0XHRbY2RzQnV0dG9uXT1cImJ1dHRvbi50eXBlXCJcblx0XHRcdFx0XHRcdChjbGljayk9XCJidXR0b25DbGlja2VkKGkpXCJcblx0XHRcdFx0XHRcdFtpZF09XCJidXR0b24uaWRcIlxuXHRcdFx0XHRcdFx0W2F0dHIubW9kYWwtcHJpbWFyeS1mb2N1c109XCIoYnV0dG9uLnR5cGUuaW5kZXhPZigncHJpbWFyeScpICE9PSAtMSA/ICcnIDogbnVsbClcIj5cblx0XHRcdFx0XHRcdHt7YnV0dG9uLnRleHR9fVxuXHRcdFx0XHRcdDwvYnV0dG9uPlxuXHRcdFx0XHQ8L25nLWNvbnRhaW5lcj5cblx0XHRcdDwvY2RzLW1vZGFsLWZvb3Rlcj5cblx0XHQ8L2Nkcy1tb2RhbD5cblx0YFxufSlcbmV4cG9ydCBjbGFzcyBBbGVydE1vZGFsIGV4dGVuZHMgQmFzZU1vZGFsIGltcGxlbWVudHMgQWZ0ZXJWaWV3SW5pdCB7XG5cdEBWaWV3Q2hpbGQoXCJtb2RhbENvbnRlbnRcIiwgeyBzdGF0aWM6IHRydWUgfSkgbW9kYWxDb250ZW50OiB7IG5hdGl2ZUVsZW1lbnQ6IGFueTsgfTtcblx0LyoqXG5cdCAqIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYEFsZXJ0TW9kYWxgLlxuXHQgKi9cblx0Y29uc3RydWN0b3IoXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChcInR5cGVcIikgcHVibGljIHR5cGUgPSBcImRlZmF1bHRcIixcblx0XHRAT3B0aW9uYWwoKSBASW5qZWN0KFwibGFiZWxcIikgcHVibGljIGxhYmVsOiBzdHJpbmcsXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChcInRpdGxlXCIpIHB1YmxpYyB0aXRsZTogc3RyaW5nLFxuXHRcdEBPcHRpb25hbCgpIEBJbmplY3QoXCJjb250ZW50XCIpIHB1YmxpYyBjb250ZW50OiBzdHJpbmcsXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChcInNpemVcIikgcHVibGljIHNpemU6IHN0cmluZyxcblx0XHRAT3B0aW9uYWwoKSBASW5qZWN0KFwiaGFzU2Nyb2xsaW5nQ29udGVudFwiKSBwdWJsaWMgaGFzU2Nyb2xsaW5nQ29udGVudDogYm9vbGVhbiA9IG51bGwsXG5cdFx0QE9wdGlvbmFsKCkgQEluamVjdChcImJ1dHRvbnNcIikgcHVibGljIGJ1dHRvbnMgPSBbXSxcblx0XHRAT3B0aW9uYWwoKSBASW5qZWN0KFwiY2xvc2VcIikgcHVibGljIG9uQ2xvc2U6IEZ1bmN0aW9uLFxuXHRcdEBPcHRpb25hbCgpIEBJbmplY3QoXCJzaG93Q2xvc2VCdXR0b25cIikgcHVibGljIHNob3dDbG9zZUJ1dHRvbiA9IHRydWVcblx0KSB7XG5cdFx0c3VwZXIoKTtcblx0XHRmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYnV0dG9ucy5sZW5ndGg7IGkrKykge1xuXHRcdFx0Y29uc3QgYnV0dG9uID0gdGhpcy5idXR0b25zW2ldO1xuXHRcdFx0aWYgKCFidXR0b24uaWQpIHtcblx0XHRcdFx0YnV0dG9uLmlkID0gYGFsZXJ0LW1vZGFsLWJ1dHRvbi0ke2l9YDtcblx0XHRcdH1cblx0XHRcdGlmICghYnV0dG9uLnR5cGUpIHtcblx0XHRcdFx0YnV0dG9uLnR5cGUgPSBcInNlY29uZGFyeVwiO1xuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdG5nQWZ0ZXJWaWV3SW5pdCgpIHtcblx0XHRpZiAoIXRoaXMubW9kYWxDb250ZW50KSB7IHJldHVybiBmYWxzZTsgfVxuXHRcdGNvbnN0IGVsZW1lbnQgPSB0aGlzLm1vZGFsQ29udGVudC5uYXRpdmVFbGVtZW50O1xuXHRcdGlmIChlbGVtZW50LnNjcm9sbEhlaWdodCA+IGVsZW1lbnQuY2xpZW50SGVpZ2h0KSB7XG5cdFx0XHRlbGVtZW50LnRhYkluZGV4ID0gMDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZWxlbWVudC50YWJJbmRleCA9IC0xO1xuXHRcdH1cblx0fVxuXG5cdGJ1dHRvbkNsaWNrZWQoYnV0dG9uSW5kZXg6IHN0cmluZyB8IG51bWJlcikge1xuXHRcdGNvbnN0IGJ1dHRvbiA9IHRoaXMuYnV0dG9uc1tidXR0b25JbmRleF07XG5cdFx0aWYgKGJ1dHRvbi5jbGljaykge1xuXHRcdFx0YnV0dG9uLmNsaWNrKCk7XG5cdFx0fVxuXG5cdFx0dGhpcy5jbG9zZU1vZGFsKCk7XG5cdH1cblxuXHRkaXNtaXNzTW9kYWwodHJpZ2dlcjogYW55KSB7XG5cdFx0aWYgKHRoaXMub25DbG9zZSAmJiB0aGlzLm9uQ2xvc2UodHJpZ2dlcikgPT09IGZhbHNlKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdHRoaXMuY2xvc2VNb2RhbCgpO1xuXHR9XG59XG4iXX0=