UNPKG

@clr/angular

Version:

Angular components for Clarity

227 lines 26.9 kB
/* * Copyright (c) 2016-2025 Broadcom. All Rights Reserved. * The term "Broadcom" refers to Broadcom Inc. and/or its subsidiaries. * This software is released under MIT license. * The full license information can be found in LICENSE in the root directory of this project. */ import { Component, EventEmitter, HostBinding, HostListener, Input, Output, ViewChild, } from '@angular/core'; import { ClrModal } from './modal'; import * as i0 from "@angular/core"; import * as i1 from "./modal-configuration.service"; import * as i2 from "../utils"; import * as i3 from "@angular/common"; import * as i4 from "../icon/icon"; import * as i5 from "./modal"; import * as i6 from "./modal-body"; export class ClrSidePanel { constructor(element, configuration, commonStrings) { this.element = element; this.configuration = configuration; this.commonStrings = commonStrings; this.openChange = new EventEmitter(false); this.skipAnimation = false; this.staticBackdrop = false; this.closable = true; this.preventClose = false; this.altClose = new EventEmitter(false); this._pinnable = false; this._pinned = false; this._position = 'right'; this.__open = false; this._size = 'md'; } get _open() { return this.__open; } set _open(open) { if (open !== this.__open) { this.__open = open; if (this.pinned) { this.updateModalState(); } } } get size() { return this._size; } set size(value) { if (!value) { value = 'md'; } if (this._size !== value) { this._size = value; if (this.pinned) { this.updateModalState(); } } } get position() { return this._position; } set position(position) { if (position && position !== this._position) { this._position = position; if (this._position === 'right') { this.configuration.fadeMove = 'fadeLeft'; } else if (this._position === 'bottom') { this.configuration.fadeMove = 'fadeUp'; } } } get pinned() { return this._pinned; } set pinned(pinned) { this._pinned = pinned; if (this.modal) { this.updateModalState(); } } get clrSidePanelBackdrop() { return this.configuration.backdrop; } set clrSidePanelBackdrop(backdrop) { if (backdrop !== undefined) { this.configuration.backdrop = backdrop; } } get clrSidePanelPinnable() { return this._pinnable; } set clrSidePanelPinnable(pinnable) { this._pinnable = pinnable; } get modal() { return this._modal; } set modal(modal) { this._modal = modal; this.originalStopClose = this.modal.stopClose; this.updateModalState(); } get hostElement() { return this.element.nativeElement.closest('.clr-modal-host') || document.body; } get bottomPositionCssClass() { return this.position === 'bottom'; } ngOnInit() { this.configuration.fadeMove = 'fadeLeft'; if (this.position === 'bottom') { this.configuration.fadeMove = 'fadeUp'; } } ngOnDestroy() { this.cleanupPinnedClasses(); } handleModalOpen(open) { if (open) { this.updateModalState(); } else { this.cleanupPinnedClasses(); } this.openChange.emit(open); } open() { this.modal.open(); } close() { this.modal.close(); } togglePinned() { this.pinned = !this.pinned; } documentClick(event) { if (!this.element.nativeElement.contains(event.target) && this.modal._open && !this.configuration.backdrop) { this.modal.close(); } } updateModalState() { if (!this.modal) { return; } if (this.pinned) { this.modal.stopClose = true; this.updatePinnedClasses(); } else { this.modal.stopClose = this.originalStopClose; this.cleanupPinnedClasses(); } } cleanupPinnedClasses() { [this.hostElement, document.body].forEach(host => { host.classList.forEach(className => { if (className.startsWith('clr-side-panel-pinned-')) { host.classList.remove(className); } }); }); } updatePinnedClasses() { this.cleanupPinnedClasses(); this.hostElement.classList.add(`clr-side-panel-pinned-${this.position}-${this.size}`); } } ClrSidePanel.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, deps: [{ token: i0.ElementRef }, { token: i1.ClrModalConfigurationService }, { token: i2.ClrCommonStringsService }], target: i0.ɵɵFactoryTarget.Component }); ClrSidePanel.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "15.2.2", type: ClrSidePanel, selector: "clr-side-panel", inputs: { closeButtonAriaLabel: ["clrSidePanelCloseButtonAriaLabel", "closeButtonAriaLabel"], skipAnimation: ["clrSidePanelSkipAnimation", "skipAnimation"], labelledById: ["clrSidePanelLabelledById", "labelledById"], staticBackdrop: ["clrSidePanelStaticBackdrop", "staticBackdrop"], closable: ["clrSidePanelClosable", "closable"], preventClose: ["clrSidePanelPreventClose", "preventClose"], _open: ["clrSidePanelOpen", "_open"], size: ["clrSidePanelSize", "size"], position: ["clrSidePanelPosition", "position"], pinned: ["clrSidePanelPinned", "pinned"], clrSidePanelBackdrop: "clrSidePanelBackdrop", clrSidePanelPinnable: "clrSidePanelPinnable" }, outputs: { openChange: "clrSidePanelOpenChange", altClose: "clrSidePanelAlternateClose" }, host: { listeners: { "document:pointerup": "documentClick($event)" }, properties: { "class.side-panel": "true", "class.side-panel-bottom": "this.bottomPositionCssClass" } }, viewQueries: [{ propertyName: "modal", first: true, predicate: ClrModal, descendants: true }], ngImport: i0, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"handleModalOpen($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n [clrModalClosable]=\"closable\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n [clrModalOverrideScrollService]=\"true\"\n>\n <button\n type=\"button\"\n [attr.aria-label]=\"commonStrings.keys.sidePanelPin\"\n class=\"leading-button pinnable\"\n *ngIf=\"clrSidePanelPinnable\"\n (click)=\"togglePinned()\"\n >\n <cds-icon [attr.shape]=\"pinned ? 'unpin' : 'pin'\"></cds-icon>\n </button>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n", dependencies: [{ kind: "directive", type: i3.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "directive", type: i4.CdsIconCustomTag, selector: "cds-icon" }, { kind: "component", type: i5.ClrModal, selector: "clr-modal", inputs: ["clrModalOpen", "clrModalClosable", "clrModalCloseButtonAriaLabel", "clrModalSize", "clrModalStaticBackdrop", "clrModalSkipAnimation", "clrModalPreventClose", "clrModalLabelledById", "clrModalOverrideScrollService"], outputs: ["clrModalOpenChange", "clrModalAlternateClose"] }, { kind: "directive", type: i6.ClrModalBody, selector: ".modal-body" }] }); i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "15.2.2", ngImport: i0, type: ClrSidePanel, decorators: [{ type: Component, args: [{ selector: 'clr-side-panel', host: { '[class.side-panel]': 'true', }, template: "<clr-modal\n [clrModalOpen]=\"_open\"\n (clrModalOpenChange)=\"handleModalOpen($event)\"\n [clrModalCloseButtonAriaLabel]=\"closeButtonAriaLabel\"\n [clrModalSize]=\"size\"\n [clrModalSkipAnimation]=\"skipAnimation\"\n [clrModalStaticBackdrop]=\"staticBackdrop\"\n [clrModalLabelledById]=\"labelledById\"\n [clrModalPreventClose]=\"preventClose\"\n [clrModalClosable]=\"closable\"\n (clrModalAlternateClose)=\"altClose.emit($event)\"\n [clrModalOverrideScrollService]=\"true\"\n>\n <button\n type=\"button\"\n [attr.aria-label]=\"commonStrings.keys.sidePanelPin\"\n class=\"leading-button pinnable\"\n *ngIf=\"clrSidePanelPinnable\"\n (click)=\"togglePinned()\"\n >\n <cds-icon [attr.shape]=\"pinned ? 'unpin' : 'pin'\"></cds-icon>\n </button>\n <div class=\"modal-title\"><ng-content select=\".side-panel-title\"></ng-content></div>\n <div class=\"modal-body\"><ng-content select=\".side-panel-body\"></ng-content></div>\n <div class=\"modal-footer\"><ng-content select=\".side-panel-footer\"></ng-content></div>\n</clr-modal>\n" }] }], ctorParameters: function () { return [{ type: i0.ElementRef }, { type: i1.ClrModalConfigurationService }, { type: i2.ClrCommonStringsService }]; }, propDecorators: { openChange: [{ type: Output, args: ['clrSidePanelOpenChange'] }], closeButtonAriaLabel: [{ type: Input, args: ['clrSidePanelCloseButtonAriaLabel'] }], skipAnimation: [{ type: Input, args: ['clrSidePanelSkipAnimation'] }], labelledById: [{ type: Input, args: ['clrSidePanelLabelledById'] }], staticBackdrop: [{ type: Input, args: ['clrSidePanelStaticBackdrop'] }], closable: [{ type: Input, args: ['clrSidePanelClosable'] }], preventClose: [{ type: Input, args: ['clrSidePanelPreventClose'] }], altClose: [{ type: Output, args: ['clrSidePanelAlternateClose'] }], _open: [{ type: Input, args: ['clrSidePanelOpen'] }], size: [{ type: Input, args: ['clrSidePanelSize'] }], position: [{ type: Input, args: ['clrSidePanelPosition'] }], pinned: [{ type: Input, args: ['clrSidePanelPinned'] }], clrSidePanelBackdrop: [{ type: Input }], clrSidePanelPinnable: [{ type: Input }], modal: [{ type: ViewChild, args: [ClrModal] }], bottomPositionCssClass: [{ type: HostBinding, args: ['class.side-panel-bottom'] }], documentClick: [{ type: HostListener, args: ['document:pointerup', ['$event']] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2lkZS1wYW5lbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3Byb2plY3RzL2FuZ3VsYXIvc3JjL21vZGFsL3NpZGUtcGFuZWwudHMiLCIuLi8uLi8uLi8uLi9wcm9qZWN0cy9hbmd1bGFyL3NyYy9tb2RhbC9zaWRlLXBhbmVsLmh0bWwiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUE7Ozs7O0dBS0c7QUFFSCxPQUFPLEVBQ0wsU0FBUyxFQUVULFlBQVksRUFDWixXQUFXLEVBQ1gsWUFBWSxFQUNaLEtBQUssRUFHTCxNQUFNLEVBQ04sU0FBUyxHQUNWLE1BQU0sZUFBZSxDQUFDO0FBR3ZCLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxTQUFTLENBQUM7Ozs7Ozs7O0FBVW5DLE1BQU0sT0FBTyxZQUFZO0lBbUJ2QixZQUNVLE9BQWdDLEVBQ2hDLGFBQTJDLEVBQzVDLGFBQXNDO1FBRnJDLFlBQU8sR0FBUCxPQUFPLENBQXlCO1FBQ2hDLGtCQUFhLEdBQWIsYUFBYSxDQUE4QjtRQUM1QyxrQkFBYSxHQUFiLGFBQWEsQ0FBeUI7UUFyQmIsZUFBVSxHQUFHLElBQUksWUFBWSxDQUFVLEtBQUssQ0FBQyxDQUFDO1FBRTVDLGtCQUFhLEdBQUcsS0FBSyxDQUFDO1FBRXJCLG1CQUFjLEdBQUcsS0FBSyxDQUFDO1FBQzdCLGFBQVEsR0FBRyxJQUFJLENBQUM7UUFDWixpQkFBWSxHQUFHLEtBQUssQ0FBQztRQUNsQixhQUFRLEdBQUcsSUFBSSxZQUFZLENBQVUsS0FBSyxDQUFDLENBQUM7UUFFMUUsY0FBUyxHQUFHLEtBQUssQ0FBQztRQUNsQixZQUFPLEdBQUcsS0FBSyxDQUFDO1FBRWhCLGNBQVMsR0FBRyxPQUFPLENBQUM7UUFFcEIsV0FBTSxHQUFHLEtBQUssQ0FBQztRQUVmLFVBQUssR0FBRyxJQUFJLENBQUM7SUFNbEIsQ0FBQztJQUVKLElBQ0ksS0FBSztRQUNQLE9BQU8sSUFBSSxDQUFDLE1BQU0sQ0FBQztJQUNyQixDQUFD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O3VCQUFDLDBCQUEwQjtnQkFDSSxjQUFjO3NCQUFsRCxLQUFLO3VCQUFDLDRCQUE0QjtnQkFDSixRQUFRO3NCQUF0QyxLQUFLO3VCQUFDLHNCQUFzQjtnQkFDTSxZQUFZO3NCQUE5QyxLQUFLO3VCQUFDLDBCQUEwQjtnQkFDSyxRQUFRO3NCQUE3QyxNQUFNO3VCQUFDLDRCQUE0QjtnQkFrQmhDLEtBQUs7c0JBRFIsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBY3JCLElBQUk7c0JBRFAsS0FBSzt1QkFBQyxrQkFBa0I7Z0JBa0JyQixRQUFRO3NCQURYLEtBQUs7dUJBQUMsc0JBQXNCO2dCQWlCekIsTUFBTTtzQkFEVCxLQUFLO3VCQUFDLG9CQUFvQjtnQkFhdkIsb0JBQW9CO3NCQUR2QixLQUFLO2dCQVlGLG9CQUFvQjtzQkFEdkIsS0FBSztnQkFVTSxLQUFLO3NCQURoQixTQUFTO3VCQUFDLFFBQVE7Z0JBZ0JQLHNCQUFzQjtzQkFEakMsV0FBVzt1QkFBQyx5QkFBeUI7Z0JBc0M5QixhQUFhO3NCQURwQixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiLypcbiAqIENvcHlyaWdodCAoYykgMjAxNi0yMDI1IEJyb2FkY29tLiBBbGwgUmlnaHRzIFJlc2VydmVkLlxuICogVGhlIHRlcm0gXCJCcm9hZGNvbVwiIHJlZmVycyB0byBCcm9hZGNvbSBJbmMuIGFuZC9vciBpdHMgc3Vic2lkaWFyaWVzLlxuICogVGhpcyBzb2Z0d2FyZSBpcyByZWxlYXNlZCB1bmRlciBNSVQgbGljZW5zZS5cbiAqIFRoZSBmdWxsIGxpY2Vuc2UgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIExJQ0VOU0UgaW4gdGhlIHJvb3QgZGlyZWN0b3J5IG9mIHRoaXMgcHJvamVjdC5cbiAqL1xuXG5pbXBvcnQge1xuICBDb21wb25lbnQsXG4gIEVsZW1lbnRSZWYsXG4gIEV2ZW50RW1pdHRlcixcbiAgSG9zdEJpbmRpbmcsXG4gIEhvc3RMaXN0ZW5lcixcbiAgSW5wdXQsXG4gIE9uRGVzdHJveSxcbiAgT25Jbml0LFxuICBPdXRwdXQsXG4gIFZpZXdDaGlsZCxcbn0gZnJvbSAnQGFuZ3VsYXIvY29yZSc7XG5cbmltcG9ydCB7IENsckNvbW1vblN0cmluZ3NTZXJ2aWNlIH0gZnJvbSAnLi4vdXRpbHMnO1xuaW1wb3J0IHsgQ2xyTW9kYWwgfSBmcm9tICcuL21vZGFsJztcbmltcG9ydCB7IENsck1vZGFsQ29uZmlndXJhdGlvblNlcnZpY2UgfSBmcm9tICcuL21vZGFsLWNvbmZpZ3VyYXRpb24uc2VydmljZSc7XG5cbkBDb21wb25lbnQoe1xuICBzZWxlY3RvcjogJ2Nsci1zaWRlLXBhbmVsJyxcbiAgdGVtcGxhdGVVcmw6ICdzaWRlLXBhbmVsLmh0bWwnLFxuICBob3N0OiB7XG4gICAgJ1tjbGFzcy5zaWRlLXBhbmVsXSc6ICd0cnVlJyxcbiAgfSxcbn0pXG5leHBvcnQgY2xhc3MgQ2xyU2lkZVBhbmVsIGltcGxlbWVudHMgT25Jbml0LCBPbkRlc3Ryb3kge1xuICBAT3V0cHV0KCdjbHJTaWRlUGFuZWxPcGVuQ2hhbmdlJykgb3BlbkNoYW5nZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuICBASW5wdXQoJ2NsclNpZGVQYW5lbENsb3NlQnV0dG9uQXJpYUxhYmVsJykgY2xvc2VCdXR0b25BcmlhTGFiZWw6IHN0cmluZyB8IHVuZGVmaW5lZDtcbiAgQElucHV0KCdjbHJTaWRlUGFuZWxTa2lwQW5pbWF0aW9uJykgc2tpcEFuaW1hdGlvbiA9IGZhbHNlO1xuICBASW5wdXQoJ2NsclNpZGVQYW5lbExhYmVsbGVkQnlJZCcpIGxhYmVsbGVkQnlJZDogc3RyaW5nO1xuICBASW5wdXQoJ2NsclNpZGVQYW5lbFN0YXRpY0JhY2tkcm9wJykgc3RhdGljQmFja2Ryb3AgPSBmYWxzZTtcbiAgQElucHV0KCdjbHJTaWRlUGFuZWxDbG9zYWJsZScpIGNsb3NhYmxlID0gdHJ1ZTtcbiAgQElucHV0KCdjbHJTaWRlUGFuZWxQcmV2ZW50Q2xvc2UnKSBwcmV2ZW50Q2xvc2UgPSBmYWxzZTtcbiAgQE91dHB1dCgnY2xyU2lkZVBhbmVsQWx0ZXJuYXRlQ2xvc2UnKSBhbHRDbG9zZSA9IG5ldyBFdmVudEVtaXR0ZXI8Ym9vbGVhbj4oZmFsc2UpO1xuXG4gIHByaXZhdGUgX3Bpbm5hYmxlID0gZmFsc2U7XG4gIHByaXZhdGUgX3Bpbm5lZCA9IGZhbHNlO1xuICBwcml2YXRlIG9yaWdpbmFsU3RvcENsb3NlOiBib29sZWFuO1xuICBwcml2YXRlIF9wb3NpdGlvbiA9ICdyaWdodCc7XG4gIHByaXZhdGUgX21vZGFsOiBDbHJNb2RhbDtcbiAgcHJpdmF0ZSBfX29wZW4gPSBmYWxzZTtcblxuICBwcml2YXRlIF9zaXplID0gJ21kJztcblxuICBjb25zdHJ1Y3RvcihcbiAgICBwcml2YXRlIGVsZW1lbnQ6IEVsZW1lbnRSZWY8SFRNTEVsZW1lbnQ+LFxuICAgIHByaXZhdGUgY29uZmlndXJhdGlvbjogQ2xyTW9kYWxDb25maWd1cmF0aW9uU2VydmljZSxcbiAgICBwdWJsaWMgY29tbW9uU3RyaW5nczogQ2xyQ29tbW9uU3RyaW5nc1NlcnZpY2VcbiAgKSB7fVxuXG4gIEBJbnB1dCgnY2xyU2lkZVBhbmVsT3BlbicpXG4gIGdldCBfb3BlbigpOiBib29sZWFuIHtcbiAgICByZXR1cm4gdGhpcy5fX29wZW47XG4gIH1cbiAgc2V0IF9vcGVuKG9wZW46IGJvb2xlYW4pIHtcbiAgICBpZiAob3BlbiAhPT0gdGhpcy5fX29wZW4pIHtcbiAgICAgIHRoaXMuX19vcGVuID0gb3BlbjtcbiAgICAgIGlmICh0aGlzLnBpbm5lZCkge1xuICAgICAgICB0aGlzLnVwZGF0ZU1vZGFsU3RhdGUoKTtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBASW5wdXQoJ2NsclNpZGVQYW5lbFNpemUnKVxuICBnZXQgc2l6ZSgpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9zaXplO1xuICB9XG5cbiAgc2V0IHNpemUodmFsdWU6IHN0cmluZykge1xuICAgIGlmICghdmFsdWUpIHtcbiAgICAgIHZhbHVlID0gJ21kJztcbiAgICB9XG4gICAgaWYgKHRoaXMuX3NpemUgIT09IHZhbHVlKSB7XG4gICAgICB0aGlzLl9zaXplID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5waW5uZWQpIHtcbiAgICAgICAgdGhpcy51cGRhdGVNb2RhbFN0YXRlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCdjbHJTaWRlUGFuZWxQb3NpdGlvbicpXG4gIGdldCBwb3NpdGlvbigpOiBzdHJpbmcge1xuICAgIHJldHVybiB0aGlzLl9wb3NpdGlvbjtcbiAgfVxuXG4gIHNldCBwb3NpdGlvbihwb3NpdGlvbjogc3RyaW5nKSB7XG4gICAgaWYgKHBvc2l0aW9uICYmIHBvc2l0aW9uICE9PSB0aGlzLl9wb3NpdGlvbikge1xuICAgICAgdGhpcy5fcG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgICAgIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZmFkZU1vdmUgPSAnZmFkZUxlZnQnO1xuICAgICAgfSBlbHNlIGlmICh0aGlzLl9wb3NpdGlvbiA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmZhZGVNb3ZlID0gJ2ZhZGVVcCc7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgQElucHV0KCdjbHJTaWRlUGFuZWxQaW5uZWQnKVxuICBnZXQgcGlubmVkKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9waW5uZWQ7XG4gIH1cblxuICBzZXQgcGlubmVkKHBpbm5lZDogYm9vbGVhbikge1xuICAgIHRoaXMuX3Bpbm5lZCA9IHBpbm5lZDtcbiAgICBpZiAodGhpcy5tb2RhbCkge1xuICAgICAgdGhpcy51cGRhdGVNb2RhbFN0YXRlKCk7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGNsclNpZGVQYW5lbEJhY2tkcm9wKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLmNvbmZpZ3VyYXRpb24uYmFja2Ryb3A7XG4gIH1cblxuICBzZXQgY2xyU2lkZVBhbmVsQmFja2Ryb3AoYmFja2Ryb3A6IGJvb2xlYW4pIHtcbiAgICBpZiAoYmFja2Ryb3AgIT09IHVuZGVmaW5lZCkge1xuICAgICAgdGhpcy5jb25maWd1cmF0aW9uLmJhY2tkcm9wID0gYmFja2Ryb3A7XG4gICAgfVxuICB9XG5cbiAgQElucHV0KClcbiAgZ2V0IGNsclNpZGVQYW5lbFBpbm5hYmxlKCk6IGJvb2xlYW4ge1xuICAgIHJldHVybiB0aGlzLl9waW5uYWJsZTtcbiAgfVxuXG4gIHNldCBjbHJTaWRlUGFuZWxQaW5uYWJsZShwaW5uYWJsZTogYm9vbGVhbikge1xuICAgIHRoaXMuX3Bpbm5hYmxlID0gcGlubmFibGU7XG4gIH1cblxuICBAVmlld0NoaWxkKENsck1vZGFsKVxuICBwcml2YXRlIGdldCBtb2RhbCgpOiBDbHJNb2RhbCB7XG4gICAgcmV0dXJuIHRoaXMuX21vZGFsO1xuICB9XG5cbiAgcHJpdmF0ZSBzZXQgbW9kYWwobW9kYWw6IENsck1vZGFsKSB7XG4gICAgdGhpcy5fbW9kYWwgPSBtb2RhbDtcbiAgICB0aGlzLm9yaWdpbmFsU3RvcENsb3NlID0gdGhpcy5tb2RhbC5zdG9wQ2xvc2U7XG4gICAgdGhpcy51cGRhdGVNb2RhbFN0YXRlKCk7XG4gIH1cblxuICBwcml2YXRlIGdldCBob3N0RWxlbWVudCgpOiBIVE1MRWxlbWVudCB7XG4gICAgcmV0dXJuICh0aGlzLmVsZW1lbnQubmF0aXZlRWxlbWVudCBhcyBIVE1MRWxlbWVudCkuY2xvc2VzdCgnLmNsci1tb2RhbC1ob3N0JykgfHwgZG9jdW1lbnQuYm9keTtcbiAgfVxuXG4gIEBIb3N0QmluZGluZygnY2xhc3Muc2lkZS1wYW5lbC1ib3R0b20nKVxuICBwcml2YXRlIGdldCBib3R0b21Qb3NpdGlvbkNzc0NsYXNzKCkge1xuICAgIHJldHVybiB0aGlzLnBvc2l0aW9uID09PSAnYm90dG9tJztcbiAgfVxuXG4gIG5nT25Jbml0KCk6IHZvaWQge1xuICAgIHRoaXMuY29uZmlndXJhdGlvbi5mYWRlTW92ZSA9ICdmYWRlTGVmdCc7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gPT09ICdib3R0b20nKSB7XG4gICAgICB0aGlzLmNvbmZpZ3VyYXRpb24uZmFkZU1vdmUgPSAnZmFkZVVwJztcbiAgICB9XG4gIH1cblxuICBuZ09uRGVzdHJveSgpOiB2b2lkIHtcbiAgICB0aGlzLmNsZWFudXBQaW5uZWRDbGFzc2VzKCk7XG4gIH1cblxuICBoYW5kbGVNb2RhbE9wZW4ob3BlbjogYm9vbGVhbikge1xuICAgIGlmIChvcGVuKSB7XG4gICAgICB0aGlzLnVwZGF0ZU1vZGFsU3RhdGUoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5jbGVhbnVwUGlubmVkQ2xhc3NlcygpO1xuICAgIH1cbiAgICB0aGlzLm9wZW5DaGFuZ2UuZW1pdChvcGVuKTtcbiAgfVxuXG4gIG9wZW4oKSB7XG4gICAgdGhpcy5tb2RhbC5vcGVuKCk7XG4gIH1cblxuICBjbG9zZSgpIHtcbiAgICB0aGlzLm1vZGFsLmNsb3NlKCk7XG4gIH1cblxuICB0b2dnbGVQaW5uZWQoKSB7XG4gICAgdGhpcy5waW5uZWQgPSAhdGhpcy5waW5uZWQ7XG4gIH1cblxuICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDpwb2ludGVydXAnLCBbJyRldmVudCddKVxuICBwcml2YXRlIGRvY3VtZW50Q2xpY2soZXZlbnQ6IEV2ZW50KSB7XG4gICAgaWYgKFxuICAgICAgIXRoaXMuZWxlbWVudC5uYXRpdmVFbGVtZW50LmNvbnRhaW5zKGV2ZW50LnRhcmdldCBhcyBOb2RlKSAmJlxuICAgICAgdGhpcy5tb2RhbC5fb3BlbiAmJlxuICAgICAgIXRoaXMuY29uZmlndXJhdGlvbi5iYWNrZHJvcFxuICAgICkge1xuICAgICAgdGhpcy5tb2RhbC5jbG9zZSgpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgdXBkYXRlTW9kYWxTdGF0ZSgpIHtcbiAgICBpZiAoIXRoaXMubW9kYWwpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKHRoaXMucGlubmVkKSB7XG4gICAgICB0aGlzLm1vZGFsLnN0b3BDbG9zZSA9IHRydWU7XG4gICAgICB0aGlzLnVwZGF0ZVBpbm5lZENsYXNzZXMoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5tb2RhbC5zdG9wQ2xvc2UgPSB0aGlzLm9yaWdpbmFsU3RvcENsb3NlO1xuICAgICAgdGhpcy5jbGVhbnVwUGlubmVkQ2xhc3NlcygpO1xuICAgIH1cbiAgfVxuXG4gIHByaXZhdGUgY2xlYW51cFBpbm5lZENsYXNzZXMoKSB7XG4gICAgW3RoaXMuaG9zdEVsZW1lbnQsIGRvY3VtZW50LmJvZHldLmZvckVhY2goaG9zdCA9PiB7XG4gICAgICBob3N0LmNsYXNzTGlzdC5mb3JFYWNoKGNsYXNzTmFtZSA9PiB7XG4gICAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgnY2xyLXNpZGUtcGFuZWwtcGlubmVkLScpKSB7XG4gICAgICAgICAgaG9zdC5jbGFzc0xpc3QucmVtb3ZlKGNsYXNzTmFtZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVQaW5uZWRDbGFzc2VzKCkge1xuICAgIHRoaXMuY2xlYW51cFBpbm5lZENsYXNzZXMoKTtcbiAgICB0aGlzLmhvc3RFbGVtZW50LmNsYXNzTGlzdC5hZGQoYGNsci1zaWRlLXBhbmVsLXBpbm5lZC0ke3RoaXMucG9zaXRpb259LSR7dGhpcy5zaXplfWApO1xuICB9XG59XG4iLCI8Y2xyLW1vZGFsXG4gIFtjbHJNb2RhbE9wZW5dPVwiX29wZW5cIlxuICAoY2xyTW9kYWxPcGVuQ2hhbmdlKT1cImhhbmRsZU1vZGFsT3BlbigkZXZlbnQpXCJcbiAgW2Nsck1vZGFsQ2xvc2VCdXR0b25BcmlhTGFiZWxdPVwiY2xvc2VCdXR0b25BcmlhTGFiZWxcIlxuICBbY2xyTW9kYWxTaXplXT1cInNpemVcIlxuICBbY2xyTW9kYWxTa2lwQW5pbWF0aW9uXT1cInNraXBBbmltYXRpb25cIlxuICBbY2xyTW9kYWxTdGF0aWNCYWNrZHJvcF09XCJzdGF0aWNCYWNrZHJvcFwiXG4gIFtjbHJNb2RhbExhYmVsbGVkQnlJZF09XCJsYWJlbGxlZEJ5SWRcIlxuICBbY2xyTW9kYWxQcmV2ZW50Q2xvc2VdPVwicHJldmVudENsb3NlXCJcbiAgW2Nsck1vZGFsQ2xvc2FibGVdPVwiY2xvc2FibGVcIlxuICAoY2xyTW9kYWxBbHRlcm5hdGVDbG9zZSk9XCJhbHRDbG9zZS5lbWl0KCRldmVudClcIlxuICBbY2xyTW9kYWxPdmVycmlkZVNjcm9sbFNlcnZpY2VdPVwidHJ1ZVwiXG4+XG4gIDxidXR0b25cbiAgICB0eXBlPVwiYnV0dG9uXCJcbiAgICBbYXR0ci5hcmlhLWxhYmVsXT1cImNvbW1vblN0cmluZ3Mua2V5cy5zaWRlUGFuZWxQaW5cIlxuICAgIGNsYXNzPVwibGVhZGluZy1idXR0b24gcGlubmFibGVcIlxuICAgICpuZ0lmPVwiY2xyU2lkZVBhbmVsUGlubmFibGVcIlxuICAgIChjbGljayk9XCJ0b2dnbGVQaW5uZWQoKVwiXG4gID5cbiAgICA8Y2RzLWljb24gW2F0dHIuc2hhcGVdPVwicGlubmVkID8gJ3VucGluJyA6ICdwaW4nXCI+PC9jZHMtaWNvbj5cbiAgPC9idXR0b24+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC10aXRsZVwiPjxuZy1jb250ZW50IHNlbGVjdD1cIi5zaWRlLXBhbmVsLXRpdGxlXCI+PC9uZy1jb250ZW50PjwvZGl2PlxuICA8ZGl2IGNsYXNzPVwibW9kYWwtYm9keVwiPjxuZy1jb250ZW50IHNlbGVjdD1cIi5zaWRlLXBhbmVsLWJvZHlcIj48L25nLWNvbnRlbnQ+PC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJtb2RhbC1mb290ZXJcIj48bmctY29udGVudCBzZWxlY3Q9XCIuc2lkZS1wYW5lbC1mb290ZXJcIj48L25nLWNvbnRlbnQ+PC9kaXY+XG48L2Nsci1tb2RhbD5cbiJdfQ==