UNPKG

@qodalis/angular-cli

Version:

A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.

100 lines 19.3 kB
import { Component, EventEmitter, Input, Output, HostListener, } from '@angular/core'; import * as i0 from "@angular/core"; import * as i1 from "@angular/common"; import * as i2 from "primeng/button"; import * as i3 from "primeng/tooltip"; export class CollapsableContentComponent { constructor(el) { this.el = el; this.previousPanelHeight = 500; this.panelHeight = 500; this.isResizing = false; this.startY = 0; this.startHeight = 0; this.visible = true; this.isCollapsed = true; this.isMaximized = false; this.onToggle = new EventEmitter(); this.onContentSizeChange = new EventEmitter(); } ngOnInit() { this.items = [ { label: 'Tab 1', icon: 'pi pi-plus', }, ]; } onActiveItemChange(event) { this.activeItem = event; } toggleTerminal() { this.isCollapsed = !this.isCollapsed; this.onToggle.emit(this.isCollapsed); } closeTerminal() { this.visible = false; } toggleMaximizationTerminal() { //check next if (!this.isMaximized) { this.previousPanelHeight = this.panelHeight; const windowHeight = window.innerHeight; this.panelHeight = windowHeight; } else { this.panelHeight = this.previousPanelHeight; } this.isMaximized = !this.isMaximized; this.updateTerminalSize(); } onResizeStart(event) { this.isResizing = true; if (this.isCollapsed) { this.toggleTerminal(); } this.startY = event.clientY; this.startHeight = this.panelHeight; event.preventDefault(); } onMouseMove(event) { if (this.isResizing) { const deltaY = this.startY - event.clientY; let nextHeight = Math.max(100, this.startHeight + deltaY); if (nextHeight > window.innerHeight) { nextHeight = window.innerHeight; } this.panelHeight = nextHeight; this.updateTerminalSize(); } } onMouseUp() { this.isResizing = false; } updateTerminalSize() { this.onContentSizeChange.emit(this.panelHeight - 60 - 8); } static { this.ɵfac = i0.ɵɵngDeclareFactory({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CollapsableContentComponent, deps: [{ token: i0.ElementRef }], target: i0.ɵɵFactoryTarget.Component }); } static { this.ɵcmp = i0.ɵɵngDeclareComponent({ minVersion: "14.0.0", version: "16.2.12", type: CollapsableContentComponent, selector: "collapsable-content", inputs: { visible: "visible", isCollapsed: "isCollapsed", isMaximized: "isMaximized" }, outputs: { onToggle: "onToggle", onContentSizeChange: "onContentSizeChange" }, host: { listeners: { "document:mousemove": "onMouseMove($event)", "document:mouseup": "onMouseUp()" } }, ngImport: i0, template: "<div\n *ngIf=\"visible\"\n class=\"terminal-wrapper\"\n [class.collapsed]=\"isCollapsed\"\n [style]=\"{\n height: panelHeight + 'px',\n }\"\n>\n <div class=\"card terminal-header\">\n <div class=\"divider\">\n <i class=\"pi pi-minus\" (mousedown)=\"onResizeStart($event)\"></i>\n </div>\n <div class=\"header-content\">\n <p class=\"terminal-title\">\n <i class=\"pi pi-desktop\" style=\"font-size: 2rem\"></i>\n CLI\n </p>\n <div class=\"action-buttons\">\n <p-button\n [icon]=\"\n isMaximized ? 'pi pi-window-minimize' : 'pi pi-window-maximize'\n \"\n class=\"p-button-rounded p-button-text p-button-secondary\"\n [pTooltip]=\"!isMaximized ? 'Maximize' : 'Minimize'\"\n tooltipPosition=\"top\"\n [disabled]=\"isCollapsed\"\n (onClick)=\"toggleMaximizationTerminal()\"\n />\n\n <p-button\n [icon]=\"isCollapsed ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\n class=\"p-button-rounded p-button-text p-button-secondary\"\n [pTooltip]=\"isCollapsed ? 'Expand' : 'Collapse'\"\n tooltipPosition=\"top\"\n (onClick)=\"toggleTerminal()\"\n />\n\n <p-button\n [icon]=\"'pi pi-eye-slash'\"\n class=\"p-button-rounded p-button-text p-button-secondary\"\n [pTooltip]=\"'Close'\"\n tooltipPosition=\"top\"\n (onClick)=\"closeTerminal()\"\n />\n </div>\n </div>\n </div>\n <div class=\"terminal-content\" *ngIf=\"!isCollapsed\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".terminal-wrapper{position:fixed;bottom:0;left:0;right:0;width:100vw;transition:transform .3s ease-in-out;transform:translateY(0);background-color:#0c0c0c;color:#fff;border-top:1px solid #444;display:flex;flex-direction:column;z-index:1000}.terminal-wrapper.collapsed{transform:translateY(calc(100% - 60px))}.terminal-header{background-color:var(--surface-a);display:flex;flex-direction:column}.terminal-header .divider{display:flex;justify-content:center;position:absolute;width:100%;top:-10px}.terminal-header .divider i{font-size:2rem;cursor:ns-resize}.terminal-header .header-content{height:60px;display:flex;flex-direction:row;gap:1rem;align-items:center;border-bottom:1px solid #444;padding:.5rem 1rem}.terminal-header .header-content .terminal-title{font-size:1rem;display:flex;gap:.5rem;justify-content:center;align-items:center}.terminal-header .header-content .action-buttons{display:flex;flex-direction:row;gap:1rem;margin-left:auto}.terminal-content{flex:1;width:calc(100% - 8px)}\n"], dependencies: [{ kind: "directive", type: i1.NgIf, selector: "[ngIf]", inputs: ["ngIf", "ngIfThen", "ngIfElse"] }, { kind: "component", type: i2.Button, selector: "p-button", inputs: ["type", "iconPos", "icon", "badge", "label", "disabled", "loading", "loadingIcon", "raised", "rounded", "text", "plain", "severity", "outlined", "link", "size", "style", "styleClass", "badgeClass", "ariaLabel"], outputs: ["onClick", "onFocus", "onBlur"] }, { kind: "directive", type: i3.Tooltip, selector: "[pTooltip]", inputs: ["tooltipPosition", "tooltipEvent", "appendTo", "positionStyle", "tooltipStyleClass", "tooltipZIndex", "escape", "showDelay", "hideDelay", "life", "positionTop", "positionLeft", "autoHide", "fitContent", "hideOnEscape", "pTooltip", "tooltipDisabled", "tooltipOptions"] }] }); } } i0.ɵɵngDeclareClassMetadata({ minVersion: "12.0.0", version: "16.2.12", ngImport: i0, type: CollapsableContentComponent, decorators: [{ type: Component, args: [{ selector: 'collapsable-content', template: "<div\n *ngIf=\"visible\"\n class=\"terminal-wrapper\"\n [class.collapsed]=\"isCollapsed\"\n [style]=\"{\n height: panelHeight + 'px',\n }\"\n>\n <div class=\"card terminal-header\">\n <div class=\"divider\">\n <i class=\"pi pi-minus\" (mousedown)=\"onResizeStart($event)\"></i>\n </div>\n <div class=\"header-content\">\n <p class=\"terminal-title\">\n <i class=\"pi pi-desktop\" style=\"font-size: 2rem\"></i>\n CLI\n </p>\n <div class=\"action-buttons\">\n <p-button\n [icon]=\"\n isMaximized ? 'pi pi-window-minimize' : 'pi pi-window-maximize'\n \"\n class=\"p-button-rounded p-button-text p-button-secondary\"\n [pTooltip]=\"!isMaximized ? 'Maximize' : 'Minimize'\"\n tooltipPosition=\"top\"\n [disabled]=\"isCollapsed\"\n (onClick)=\"toggleMaximizationTerminal()\"\n />\n\n <p-button\n [icon]=\"isCollapsed ? 'pi pi-chevron-up' : 'pi pi-chevron-down'\"\n class=\"p-button-rounded p-button-text p-button-secondary\"\n [pTooltip]=\"isCollapsed ? 'Expand' : 'Collapse'\"\n tooltipPosition=\"top\"\n (onClick)=\"toggleTerminal()\"\n />\n\n <p-button\n [icon]=\"'pi pi-eye-slash'\"\n class=\"p-button-rounded p-button-text p-button-secondary\"\n [pTooltip]=\"'Close'\"\n tooltipPosition=\"top\"\n (onClick)=\"closeTerminal()\"\n />\n </div>\n </div>\n </div>\n <div class=\"terminal-content\" *ngIf=\"!isCollapsed\">\n <ng-content></ng-content>\n </div>\n</div>\n", styles: [".terminal-wrapper{position:fixed;bottom:0;left:0;right:0;width:100vw;transition:transform .3s ease-in-out;transform:translateY(0);background-color:#0c0c0c;color:#fff;border-top:1px solid #444;display:flex;flex-direction:column;z-index:1000}.terminal-wrapper.collapsed{transform:translateY(calc(100% - 60px))}.terminal-header{background-color:var(--surface-a);display:flex;flex-direction:column}.terminal-header .divider{display:flex;justify-content:center;position:absolute;width:100%;top:-10px}.terminal-header .divider i{font-size:2rem;cursor:ns-resize}.terminal-header .header-content{height:60px;display:flex;flex-direction:row;gap:1rem;align-items:center;border-bottom:1px solid #444;padding:.5rem 1rem}.terminal-header .header-content .terminal-title{font-size:1rem;display:flex;gap:.5rem;justify-content:center;align-items:center}.terminal-header .header-content .action-buttons{display:flex;flex-direction:row;gap:1rem;margin-left:auto}.terminal-content{flex:1;width:calc(100% - 8px)}\n"] }] }], ctorParameters: function () { return [{ type: i0.ElementRef }]; }, propDecorators: { visible: [{ type: Input }], isCollapsed: [{ type: Input }], isMaximized: [{ type: Input }], onToggle: [{ type: Output }], onContentSizeChange: [{ type: Output }], onMouseMove: [{ type: HostListener, args: ['document:mousemove', ['$event']] }], onMouseUp: [{ type: HostListener, args: ['document:mouseup'] }] } }); //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29sbGFwc2FibGUtY29udGVudC5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9wcm9qZWN0cy9jbGkvc3JjL2xpYi9jb2xsYXBzYWJsZS1jb250ZW50L2NvbGxhcHNhYmxlLWNvbnRlbnQuY29tcG9uZW50LnRzIiwiLi4vLi4vLi4vLi4vLi4vcHJvamVjdHMvY2xpL3NyYy9saWIvY29sbGFwc2FibGUtY29udGVudC9jb2xsYXBzYWJsZS1jb250ZW50LmNvbXBvbmVudC5odG1sIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFDSCxTQUFTLEVBQ1QsWUFBWSxFQUNaLEtBQUssRUFDTCxNQUFNLEVBRU4sWUFBWSxHQUVmLE1BQU0sZUFBZSxDQUFDOzs7OztBQVF2QixNQUFNLE9BQU8sMkJBQTJCO0lBc0JwQyxZQUFvQixFQUFjO1FBQWQsT0FBRSxHQUFGLEVBQUUsQ0FBWTtRQXJCbEMsd0JBQW1CLEdBQUcsR0FBRyxDQUFDO1FBQzFCLGdCQUFXLEdBQUcsR0FBRyxDQUFDO1FBRWxCLGVBQVUsR0FBRyxLQUFLLENBQUM7UUFDbkIsV0FBTSxHQUFHLENBQUMsQ0FBQztRQUNYLGdCQUFXLEdBQUcsQ0FBQyxDQUFDO1FBRVAsWUFBTyxHQUFZLElBQUksQ0FBQztRQUN4QixnQkFBVyxHQUFZLElBQUksQ0FBQztRQUM1QixnQkFBVyxHQUFZLEtBQUssQ0FBQztRQUcvQixhQUFRLEdBQUcsSUFBSSxZQUFZLEVBQVcsQ0FBQztRQUd2Qyx3QkFBbUIsR0FBRyxJQUFJLFlBQVksRUFBVSxDQUFDO0lBTW5CLENBQUM7SUFFdEMsUUFBUTtRQUNKLElBQUksQ0FBQyxLQUFLLEdBQUc7WUFDVDtnQkFDSSxLQUFLLEVBQUUsT0FBTztnQkFDZCxJQUFJLEVBQUUsWUFBWTthQUNyQjtTQUNKLENBQUM7SUFDTixDQUFDO0lBRUQsa0JBQWtCLENBQUMsS0FBZTtRQUM5QixJQUFJLENBQUMsVUFBVSxHQUFHLEtBQUssQ0FBQztJQUM1QixDQUFDO0lBRUQsY0FBYztRQUNWLElBQUksQ0FBQyxXQUFXLEdBQUcsQ0FBQyxJQUFJLENBQUMsV0FBVyxDQUFDO1FBRXJDLElBQUksQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsQ0FBQztJQUN6QyxDQUFDO0lBRUQsYUFBYTtRQUNULElBQUksQ0FBQyxPQUFPLEdBQUcsS0FBSyxDQUFDO0lBQ3pCLENBQUM7SUFFRCwwQkFBMEI7UUFDdEIsWUFBWTtRQUNaLElBQUksQ0FBQyxJQUFJLENBQUMsV0FBVyxFQUFFO1lBQ25CLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDO1lBQzVDLE1BQU0sWUFBWSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7WUFDeEMsSUFBSSxDQUFDLFdBQVcsR0FBRyxZQUFZLENBQUM7U0FDbkM7YUFBTTtZQUNILElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLG1CQUFtQixDQUFDO1NBQy9DO1FBRUQsSUFBSSxDQUFDLFdBQVcsR0FBRyxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUM7UUFDckMsSUFBSSxDQUFDLGtCQUFrQixFQUFFLENBQUM7SUFDOUIsQ0FBQztJQUVELGFBQWEsQ0FBQyxLQUFpQjtRQUMzQixJQUFJLENBQUMsVUFBVSxHQUFHLElBQUksQ0FBQztRQUN2QixJQUFJLElBQUksQ0FBQyxXQUFXLEVBQUU7WUFDbEIsSUFBSSxDQUFDLGNBQWMsRUFBRSxDQUFDO1NBQ3pCO1FBRUQsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1FBQzVCLElBQUksQ0FBQyxXQUFXLEdBQUcsSUFBSSxDQUFDLFdBQVcsQ0FBQztRQUNwQyxLQUFLLENBQUMsY0FBYyxFQUFFLENBQUM7SUFDM0IsQ0FBQztJQUdELFdBQVcsQ0FBQyxLQUFpQjtRQUN6QixJQUFJLElBQUksQ0FBQyxVQUFVLEVBQUU7WUFDakIsTUFBTSxNQUFNLEdBQUcsSUFBSSxDQUFDLE1BQU0sR0FBRyxLQUFLLENBQUMsT0FBTyxDQUFDO1lBQzNDLElBQUksVUFBVSxHQUFHLElBQUksQ0FBQyxHQUFHLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxXQUFXLEdBQUcsTUFBTSxDQUFDLENBQUM7WUFFMUQsSUFBSSxVQUFVLEdBQUcsTUFBTSxDQUFDLFdBQVcsRUFBRTtnQkFDakMsVUFBVSxHQUFHLE1BQU0sQ0FBQyxXQUFXLENBQUM7YUFDbkM7WUFFRCxJQUFJLENBQUMsV0FBVyxHQUFHLFVBQVUsQ0FBQztZQUM5QixJQUFJLENBQUMsa0JBQWtCLEVBQUUsQ0FBQztTQUM3QjtJQUNMLENBQUM7SUFHRCxTQUFTO1FBQ0wsSUFBSSxDQUFDLFVBQVUsR0FBRyxLQUFLLENBQUM7SUFDNUIsQ0FBQztJQUVPLGtCQUFrQjtRQUN0QixJQUFJLENBQUMsbUJBQW1CLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxXQUFXLEdBQUcsRUFBRSxHQUFHLENBQUMsQ0FBQyxDQUFDO0lBQzdELENBQUM7K0dBOUZRLDJCQUEyQjttR0FBM0IsMkJBQTJCLDJVQ2hCeEMscW1EQW1EQTs7NEZEbkNhLDJCQUEyQjtrQkFMdkMsU0FBUzsrQkFDSSxxQkFBcUI7aUdBWXRCLE9BQU87c0JBQWYsS0FBSztnQkFDRyxXQUFXO3NCQUFuQixLQUFLO2dCQUNHLFdBQVc7c0JBQW5CLEtBQUs7Z0JBR0MsUUFBUTtzQkFEZCxNQUFNO2dCQUlBLG1CQUFtQjtzQkFEekIsTUFBTTtnQkEwRFAsV0FBVztzQkFEVixZQUFZO3VCQUFDLG9CQUFvQixFQUFFLENBQUMsUUFBUSxDQUFDO2dCQWdCOUMsU0FBUztzQkFEUixZQUFZO3VCQUFDLGtCQUFrQiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7XG4gICAgQ29tcG9uZW50LFxuICAgIEV2ZW50RW1pdHRlcixcbiAgICBJbnB1dCxcbiAgICBPdXRwdXQsXG4gICAgT25Jbml0LFxuICAgIEhvc3RMaXN0ZW5lcixcbiAgICBFbGVtZW50UmVmLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IE1lbnVJdGVtIH0gZnJvbSAncHJpbWVuZy9hcGknO1xuXG5AQ29tcG9uZW50KHtcbiAgICBzZWxlY3RvcjogJ2NvbGxhcHNhYmxlLWNvbnRlbnQnLFxuICAgIHRlbXBsYXRlVXJsOiAnLi9jb2xsYXBzYWJsZS1jb250ZW50LmNvbXBvbmVudC5odG1sJyxcbiAgICBzdHlsZVVybHM6IFsnLi9jb2xsYXBzYWJsZS1jb250ZW50LmNvbXBvbmVudC5zYXNzJ10sXG59KVxuZXhwb3J0IGNsYXNzIENvbGxhcHNhYmxlQ29udGVudENvbXBvbmVudCBpbXBsZW1lbnRzIE9uSW5pdCB7XG4gICAgcHJldmlvdXNQYW5lbEhlaWdodCA9IDUwMDtcbiAgICBwYW5lbEhlaWdodCA9IDUwMDtcblxuICAgIGlzUmVzaXppbmcgPSBmYWxzZTtcbiAgICBzdGFydFkgPSAwO1xuICAgIHN0YXJ0SGVpZ2h0ID0gMDtcblxuICAgIEBJbnB1dCgpIHZpc2libGU6IGJvb2xlYW4gPSB0cnVlO1xuICAgIEBJbnB1dCgpIGlzQ29sbGFwc2VkOiBib29sZWFuID0gdHJ1ZTtcbiAgICBASW5wdXQoKSBpc01heGltaXplZDogYm9vbGVhbiA9IGZhbHNlO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uVG9nZ2xlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuXG4gICAgQE91dHB1dCgpXG4gICAgcHVibGljIG9uQ29udGVudFNpemVDaGFuZ2UgPSBuZXcgRXZlbnRFbWl0dGVyPG51bWJlcj4oKTtcblxuICAgIGl0ZW1zOiBNZW51SXRlbVtdIHwgdW5kZWZpbmVkO1xuXG4gICAgYWN0aXZlSXRlbTogTWVudUl0ZW0gfCB1bmRlZmluZWQ7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIGVsOiBFbGVtZW50UmVmKSB7fVxuXG4gICAgbmdPbkluaXQoKSB7XG4gICAgICAgIHRoaXMuaXRlbXMgPSBbXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbGFiZWw6ICdUYWIgMScsXG4gICAgICAgICAgICAgICAgaWNvbjogJ3BpIHBpLXBsdXMnLFxuICAgICAgICAgICAgfSxcbiAgICAgICAgXTtcbiAgICB9XG5cbiAgICBvbkFjdGl2ZUl0ZW1DaGFuZ2UoZXZlbnQ6IE1lbnVJdGVtKSB7XG4gICAgICAgIHRoaXMuYWN0aXZlSXRlbSA9IGV2ZW50O1xuICAgIH1cblxuICAgIHRvZ2dsZVRlcm1pbmFsKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzQ29sbGFwc2VkID0gIXRoaXMuaXNDb2xsYXBzZWQ7XG5cbiAgICAgICAgdGhpcy5vblRvZ2dsZS5lbWl0KHRoaXMuaXNDb2xsYXBzZWQpO1xuICAgIH1cblxuICAgIGNsb3NlVGVybWluYWwoKTogdm9pZCB7XG4gICAgICAgIHRoaXMudmlzaWJsZSA9IGZhbHNlO1xuICAgIH1cblxuICAgIHRvZ2dsZU1heGltaXphdGlvblRlcm1pbmFsKCk6IHZvaWQge1xuICAgICAgICAvL2NoZWNrIG5leHRcbiAgICAgICAgaWYgKCF0aGlzLmlzTWF4aW1pemVkKSB7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzUGFuZWxIZWlnaHQgPSB0aGlzLnBhbmVsSGVpZ2h0O1xuICAgICAgICAgICAgY29uc3Qgd2luZG93SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5wYW5lbEhlaWdodCA9IHdpbmRvd0hlaWdodDtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucGFuZWxIZWlnaHQgPSB0aGlzLnByZXZpb3VzUGFuZWxIZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmlzTWF4aW1pemVkID0gIXRoaXMuaXNNYXhpbWl6ZWQ7XG4gICAgICAgIHRoaXMudXBkYXRlVGVybWluYWxTaXplKCk7XG4gICAgfVxuXG4gICAgb25SZXNpemVTdGFydChldmVudDogTW91c2VFdmVudCkge1xuICAgICAgICB0aGlzLmlzUmVzaXppbmcgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5pc0NvbGxhcHNlZCkge1xuICAgICAgICAgICAgdGhpcy50b2dnbGVUZXJtaW5hbCgpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zdGFydFkgPSBldmVudC5jbGllbnRZO1xuICAgICAgICB0aGlzLnN0YXJ0SGVpZ2h0ID0gdGhpcy5wYW5lbEhlaWdodDtcbiAgICAgICAgZXZlbnQucHJldmVudERlZmF1bHQoKTtcbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZW1vdmUnLCBbJyRldmVudCddKVxuICAgIG9uTW91c2VNb3ZlKGV2ZW50OiBNb3VzZUV2ZW50KSB7XG4gICAgICAgIGlmICh0aGlzLmlzUmVzaXppbmcpIHtcbiAgICAgICAgICAgIGNvbnN0IGRlbHRhWSA9IHRoaXMuc3RhcnRZIC0gZXZlbnQuY2xpZW50WTtcbiAgICAgICAgICAgIGxldCBuZXh0SGVpZ2h0ID0gTWF0aC5tYXgoMTAwLCB0aGlzLnN0YXJ0SGVpZ2h0ICsgZGVsdGFZKTtcblxuICAgICAgICAgICAgaWYgKG5leHRIZWlnaHQgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgICBuZXh0SGVpZ2h0ID0gd2luZG93LmlubmVySGVpZ2h0O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnBhbmVsSGVpZ2h0ID0gbmV4dEhlaWdodDtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVGVybWluYWxTaXplKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBASG9zdExpc3RlbmVyKCdkb2N1bWVudDptb3VzZXVwJylcbiAgICBvbk1vdXNlVXAoKSB7XG4gICAgICAgIHRoaXMuaXNSZXNpemluZyA9IGZhbHNlO1xuICAgIH1cblxuICAgIHByaXZhdGUgdXBkYXRlVGVybWluYWxTaXplKCkge1xuICAgICAgICB0aGlzLm9uQ29udGVudFNpemVDaGFuZ2UuZW1pdCh0aGlzLnBhbmVsSGVpZ2h0IC0gNjAgLSA4KTtcbiAgICB9XG59XG4iLCI8ZGl2XG4gICpuZ0lmPVwidmlzaWJsZVwiXG4gIGNsYXNzPVwidGVybWluYWwtd3JhcHBlclwiXG4gIFtjbGFzcy5jb2xsYXBzZWRdPVwiaXNDb2xsYXBzZWRcIlxuICBbc3R5bGVdPVwie1xuICAgIGhlaWdodDogcGFuZWxIZWlnaHQgKyAncHgnLFxuICB9XCJcbj5cbiAgPGRpdiBjbGFzcz1cImNhcmQgdGVybWluYWwtaGVhZGVyXCI+XG4gICAgPGRpdiBjbGFzcz1cImRpdmlkZXJcIj5cbiAgICAgIDxpIGNsYXNzPVwicGkgcGktbWludXNcIiAobW91c2Vkb3duKT1cIm9uUmVzaXplU3RhcnQoJGV2ZW50KVwiPjwvaT5cbiAgICA8L2Rpdj5cbiAgICA8ZGl2IGNsYXNzPVwiaGVhZGVyLWNvbnRlbnRcIj5cbiAgICAgIDxwIGNsYXNzPVwidGVybWluYWwtdGl0bGVcIj5cbiAgICAgICAgPGkgY2xhc3M9XCJwaSBwaS1kZXNrdG9wXCIgc3R5bGU9XCJmb250LXNpemU6IDJyZW1cIj48L2k+XG4gICAgICAgIENMSVxuICAgICAgPC9wPlxuICAgICAgPGRpdiBjbGFzcz1cImFjdGlvbi1idXR0b25zXCI+XG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIFtpY29uXT1cIlxuICAgICAgICAgICAgaXNNYXhpbWl6ZWQgPyAncGkgcGktd2luZG93LW1pbmltaXplJyA6ICdwaSBwaS13aW5kb3ctbWF4aW1pemUnXG4gICAgICAgICAgXCJcbiAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnlcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCIhaXNNYXhpbWl6ZWQgPyAnTWF4aW1pemUnIDogJ01pbmltaXplJ1wiXG4gICAgICAgICAgdG9vbHRpcFBvc2l0aW9uPVwidG9wXCJcbiAgICAgICAgICBbZGlzYWJsZWRdPVwiaXNDb2xsYXBzZWRcIlxuICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZU1heGltaXphdGlvblRlcm1pbmFsKClcIlxuICAgICAgICAvPlxuXG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIFtpY29uXT1cImlzQ29sbGFwc2VkID8gJ3BpIHBpLWNoZXZyb24tdXAnIDogJ3BpIHBpLWNoZXZyb24tZG93bidcIlxuICAgICAgICAgIGNsYXNzPVwicC1idXR0b24tcm91bmRlZCBwLWJ1dHRvbi10ZXh0IHAtYnV0dG9uLXNlY29uZGFyeVwiXG4gICAgICAgICAgW3BUb29sdGlwXT1cImlzQ29sbGFwc2VkID8gJ0V4cGFuZCcgOiAnQ29sbGFwc2UnXCJcbiAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgIChvbkNsaWNrKT1cInRvZ2dsZVRlcm1pbmFsKClcIlxuICAgICAgICAvPlxuXG4gICAgICAgIDxwLWJ1dHRvblxuICAgICAgICAgIFtpY29uXT1cIidwaSBwaS1leWUtc2xhc2gnXCJcbiAgICAgICAgICBjbGFzcz1cInAtYnV0dG9uLXJvdW5kZWQgcC1idXR0b24tdGV4dCBwLWJ1dHRvbi1zZWNvbmRhcnlcIlxuICAgICAgICAgIFtwVG9vbHRpcF09XCInQ2xvc2UnXCJcbiAgICAgICAgICB0b29sdGlwUG9zaXRpb249XCJ0b3BcIlxuICAgICAgICAgIChvbkNsaWNrKT1cImNsb3NlVGVybWluYWwoKVwiXG4gICAgICAgIC8+XG4gICAgICA8L2Rpdj5cbiAgICA8L2Rpdj5cbiAgPC9kaXY+XG4gIDxkaXYgY2xhc3M9XCJ0ZXJtaW5hbC1jb250ZW50XCIgKm5nSWY9XCIhaXNDb2xsYXBzZWRcIj5cbiAgICA8bmctY29udGVudD48L25nLWNvbnRlbnQ+XG4gIDwvZGl2PlxuPC9kaXY+XG4iXX0=