UNPKG

carbon-components-angular

Version:
212 lines 18 kB
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=