@cmusei/console-forge 0.15.0 → 0.17.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"file":"cmusei-console-forge.mjs","sources":["../../../projects/console-forge/src/lib/models/log-level.ts","../../../projects/console-forge/src/lib/directives/class-on-hover.directive.ts","../../../projects/console-forge/src/lib/services/pico-css.service.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default-button/console-toolbar-default-button.component.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default-button/console-toolbar-default-button.component.html","../../../projects/console-forge/src/lib/injection/window.injection-token.ts","../../../projects/console-forge/src/lib/services/object.helpers.ts","../../../projects/console-forge/src/lib/services/logger.service.ts","../../../projects/console-forge/src/lib/services/user-settings.service.ts","../../../projects/console-forge/src/lib/services/clipboard/clipboard.helpers.ts","../../../projects/console-forge/src/lib/services/clipboard/clipboard.service.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default.component.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default.component.html","../../../projects/console-forge/src/lib/config/console-forge-config.ts","../../../projects/console-forge/src/lib/services/console-clients/vnc-console-client/vnc-console-client.service.ts","../../../projects/console-forge/src/lib/shims/vmware-wmks.shim.ts","../../../projects/console-forge/src/lib/shims/vmware-mks.models.ts","../../../projects/console-forge/src/lib/services/console-clients/vmware/vmware-console-client.service.ts","../../../projects/console-forge/src/lib/services/console-clients/console-client-factory.service.ts","../../../projects/console-forge/src/lib/services/uuid.service.ts","../../../projects/console-forge/src/lib/services/full-screen.service.ts","../../../projects/console-forge/src/lib/services/canvas-recorder/canvas-recording.ts","../../../projects/console-forge/src/lib/services/canvas-recorder/canvas-recorder.service.ts","../../../projects/console-forge/src/lib/services/canvas.service.ts","../../../projects/console-forge/src/lib/services/blob-downloader.service.ts","../../../projects/console-forge/src/lib/components/console-toolbar/console-toolbar.component.ts","../../../projects/console-forge/src/lib/components/console-toolbar/console-toolbar.component.html","../../../projects/console-forge/src/lib/services/browser-notifications/browser-notifications.service.ts","../../../projects/console-forge/src/lib/components/console-status/console-status.component.ts","../../../projects/console-forge/src/lib/components/console-status/console-status.component.html","../../../projects/console-forge/src/lib/components/console/console.component.ts","../../../projects/console-forge/src/lib/components/console/console.component.html","../../../projects/console-forge/src/lib/components/console-tile/console-tile.component.ts","../../../projects/console-forge/src/lib/components/console-tile/console-tile.component.html","../../../projects/console-forge/src/lib/models/console-component-config.ts","../../../projects/console-forge/src/lib/config/provide-console-forge.ts","../../../projects/console-forge/src/lib/models/console-client-type.ts","../../../projects/console-forge/src/lib/models/console-connection-options.ts","../../../projects/console-forge/src/lib/models/console-connection-status.ts","../../../projects/console-forge/src/lib/models/console-credentials.ts","../../../projects/console-forge/src/lib/models/console-component-network-config.ts","../../../projects/console-forge/src/lib/models/console-power-request.ts","../../../projects/console-forge/src/lib/models/console-supported-features.ts","../../../projects/console-forge/src/lib/models/console-toolbar-position.ts","../../../projects/console-forge/src/lib/models/console-toolbar-component-base.ts","../../../projects/console-forge/src/lib/models/console-toolbar-context.ts","../../../projects/console-forge/src/public-api.ts","../../../projects/console-forge/src/cmusei-console-forge.ts"],"sourcesContent":["// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARNING = 2,\n ERROR = 3\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Directive, ElementRef, HostListener, inject, input } from '@angular/core';\n\n@Directive({ selector: '[cfClassOnHover]' })\nexport class ClassOnHoverDirective {\n applyClasses = input.required<string>();\n directiveHost = inject(ElementRef);\n\n @HostListener(\"mouseenter\")\n protected handleMouseEnter() {\n if (this.directiveHost?.nativeElement) {\n this.directiveHost.nativeElement.classList.add(this.applyClasses());\n }\n }\n\n @HostListener(\"mouseleave\")\n protected handleMouseLeave() {\n if (this.directiveHost?.nativeElement) {\n this.directiveHost.nativeElement.classList.remove(this.applyClasses());\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class PicoCssService {\n private sheet?: CSSStyleSheet;\n private loading?: Promise<void>;\n\n loadStyleSheet(): Promise<CSSStyleSheet | undefined> {\n if (this.sheet) return Promise.resolve(this.sheet);\n\n if (!this.loading) {\n this.loading = fetch('assets/pico.min.css')\n .then(r => r.text())\n .then(css => {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n this.sheet = sheet;\n });\n }\n\n return this.loading.then(() => this.sheet);\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { AfterViewInit, Component, ElementRef, inject, input, output } from '@angular/core';\nimport { ClassOnHoverDirective } from '../../../directives/class-on-hover.directive';\nimport { PicoCssService } from '../../../services/pico-css.service';\n\n@Component({\n selector: 'cf-console-toolbar-default-button',\n imports: [ClassOnHoverDirective],\n templateUrl: './console-toolbar-default-button.component.html',\n styleUrl: './console-toolbar-default-button.component.scss'\n})\nexport class ConsoleToolbarDefaultButtonComponent implements AfterViewInit {\n public clicked = output<void>();\n public disabled = input(false);\n public label = input<string>();\n public isOngoing = input(false);\n\n private readonly picoCssService = inject(PicoCssService);\n private readonly hostElement = inject(ElementRef<HTMLElement>)\n\n async ngAfterViewInit(): Promise<void> {\n const sheet = await this.picoCssService.loadStyleSheet();\n\n if (this.hostElement.nativeElement.shadowRoot) {\n this.hostElement.nativeElement.shadowRoot.adoptedStyleSheets = [sheet];\n }\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n<div class=\"svg-button\" cfClassOnHover applyClasses=\"hovered\" [ariaDisabled]=\"disabled()\"\n [class.cursor-pointer]=\"!disabled()\" [class.disabled]=\"disabled()\" [class.ongoing]=\"isOngoing()\"\n (click)=\"!disabled() && clicked.emit()\">\n <div class=\"svg-container\">\n <ng-content></ng-content>\n </div>\n\n @if (label()) {\n <div class=\"button-label\">{{ label() }}</div>\n }\n</div>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { InjectionToken } from \"@angular/core\";\n\nexport const WINDOW = new InjectionToken<Window>(\"Global window\", { factory: () => window });\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport function deepMerge<T>(target: T, patch: DeepPartial<T>): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = { ...target };\n for (const key in patch) {\n const patchValue = patch[key];\n const targetValue = target[key];\n if (\n patchValue &&\n typeof patchValue === 'object' &&\n !Array.isArray(patchValue) &&\n typeof targetValue === 'object'\n ) {\n result[key] = deepMerge(targetValue, patchValue);\n } else {\n result[key] = patchValue;\n }\n }\n return result;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable } from '@angular/core';\nimport { LogLevel } from '../models/log-level';\nimport { ConsoleForgeConfig } from '../config/console-forge-config';\n\n@Injectable({ providedIn: 'root' })\nexport class LoggerService {\n private libConfig = inject(ConsoleForgeConfig);\n\n // allow `any` here to mirror standard console.log behavior\n /* eslint-disable @typescript-eslint/no-explicit-any */\n log(logLevel: LogLevel, message: string, ...addl: any[]): void {\n const loggingFunction = this.resolveLoggingFunction(logLevel);\n\n if (logLevel >= this.libConfig.logThreshold) {\n loggingFunction(`ConsoleForge (${LogLevel[logLevel]}): ${message}`, ...addl);\n }\n }\n\n private resolveLoggingFunction(logLevel: LogLevel) {\n switch (logLevel) {\n case LogLevel.ERROR:\n return console.error;\n case LogLevel.WARNING:\n return console.warn;\n case LogLevel.INFO:\n return console.info;\n case LogLevel.DEBUG:\n return console.debug;\n default:\n return console.log;\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { effect, inject, Injectable, signal } from '@angular/core';\nimport { ConsoleUserSettings } from '../models/console-user-settings';\nimport { WINDOW } from '../injection/window.injection-token';\nimport { deepMerge, DeepPartial } from \"./object.helpers\";\nimport { LoggerService } from './logger.service';\nimport { LogLevel } from '../models/log-level';\n\n@Injectable({ providedIn: 'root' })\nexport class UserSettingsService {\n private readonly _settings = signal<ConsoleUserSettings>({\n console: {\n allowCopyToLocalClipboard: true,\n preserveAspectRatioOnScale: true\n },\n toolbar: {\n dockTo: \"left\"\n }\n });\n public readonly settings = this._settings.asReadonly();\n\n private readonly logger = inject(LoggerService);\n private readonly settingsKey = \"consoleForge:userSettings\";\n private readonly window = inject(WINDOW);\n\n constructor() {\n // read out of storage\n const storedValue = this.window.localStorage.getItem(this.settingsKey);\n\n if (storedValue) {\n try {\n const parsedValue: Partial<ConsoleUserSettings> = JSON.parse(storedValue);\n this._settings.update(current => ({ ...current, ...parsedValue }));\n }\n catch (err) {\n this.logger.log(LogLevel.WARNING, \"Couldn't load settings from local storage:\", err);\n\n }\n }\n\n // when settings are written, update local storage\n effect(() => {\n const current = this._settings();\n this.window.localStorage.setItem(this.settingsKey, JSON.stringify(current));\n this.logger.log(LogLevel.DEBUG, \"Settings saved to local storage.\");\n });\n }\n\n public patch(patch: DeepPartial<ConsoleUserSettings>) {\n this._settings.update(current => deepMerge(current, patch));\n }\n\n public update(update: Partial<ConsoleUserSettings>) {\n this._settings.update(current => ({\n ...current,\n ...update\n }));\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\n/**\n * Extracts plain text from a ClipboardItem, if available.\n *\n * @param clipboardItem - The ClipboardItem to extract text from.\n * @returns A promise that resolves to the extracted text, or null if no text is present.\n */\nexport async function getTextFromClipboardItem(clipboardItem?: ClipboardItem): Promise<string | null> {\n const textMimeType = \"text/plain\";\n\n if (!clipboardItem?.types?.includes(textMimeType)) {\n return null;\n }\n\n const blob = await clipboardItem.getType(textMimeType);\n if (!blob) {\n return null;\n }\n\n return blob.text();\n}\n\nexport function getClipboardItemFromText(text: string): ClipboardItem {\n return new ClipboardItem({ 'text/plain': new Blob([text], { type: 'text/plain' }) });\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { UserSettingsService } from '../user-settings.service';\nimport { getClipboardItemFromText } from './clipboard.helpers';\n\n@Injectable({ providedIn: 'root' })\nexport class ClipboardService {\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly document = inject(DOCUMENT);\n private readonly userSettings = inject(UserSettingsService);\n\n private _localClipboardContentWritten = signal<ClipboardItem | undefined>(undefined);\n public localClipboardContentWritten = this._localClipboardContentWritten.asReadonly();\n\n public copyBlob(blob: Blob) {\n return this.writeToClipboard(new ClipboardItem({ [blob.type]: blob }));\n }\n\n public copyText(text: string) {\n return this.writeToClipboard(getClipboardItemFromText(text));\n }\n\n public async readText() {\n const clipboard = this.getClipboard();\n if (!clipboard) {\n throw new Error(\"Can't access the clipboard to read text\");\n }\n\n return clipboard.readText();\n }\n\n private getClipboard(): Clipboard | undefined {\n if (!this.cfConfig.enableClipboard) {\n throw new Error(\"ConsoleForge's clipboard access has been disabled.\");\n }\n\n return this.document?.defaultView?.navigator?.clipboard;\n }\n\n private writeToClipboard(item: ClipboardItem) {\n const clipboard = this.getClipboard();\n if (!clipboard) {\n throw new Error(\"Can't access the clipboard to write content\");\n }\n\n if (!this.userSettings.settings().console.allowCopyToLocalClipboard) {\n throw new Error(\"User has disabled ConsoleForge's access to their local clipboard.\");\n }\n\n clipboard.write([item]);\n this._localClipboardContentWritten.update(() => item);\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { AfterViewInit, Component, ElementRef, inject, input, model, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ConsoleToolbarContext } from '../../models/console-toolbar-context';\nimport { ConsoleToolbarDefaultButtonComponent } from './console-toolbar-default-button/console-toolbar-default-button.component';\nimport { ConsoleToolbarComponentBase } from '../../models/console-toolbar-component-base';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { ConsoleToolbarPosition } from '../../models/console-toolbar-position';\nimport { ConsolePowerRequest } from '../../models/console-power-request';\nimport { ClipboardService } from '../../services/clipboard/clipboard.service';\nimport { FormsModule } from '@angular/forms';\nimport { PicoCssService } from '../../services/pico-css.service';\n\n@Component({\n selector: 'cf-console-toolbar-default',\n imports: [\n FormsModule,\n ConsoleToolbarDefaultButtonComponent\n ],\n standalone: true,\n templateUrl: './console-toolbar-default.component.html',\n styleUrl: './console-toolbar-default.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ConsoleToolbarDefaultComponent implements AfterViewInit, ConsoleToolbarComponentBase {\n consoleContext = input.required<ConsoleToolbarContext>();\n\n // component state\n protected isClipboardDialogOpen = false;\n protected isKeyboardDialogOpen = false;\n protected isNetworkDialogOpen = false;\n protected isPowerDialogOpen = false;\n protected isSettingsDialogOpen = false;\n\n protected keyboardInputText = model<string>(\"\");\n\n // services and viewkids\n protected readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly clipboardService = inject(ClipboardService);\n protected readonly clipboardTextInput = viewChild<ElementRef>(\"clipboardText\");\n private readonly picoCssService = inject(PicoCssService);\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n\n async ngAfterViewInit(): Promise<void> {\n // apply pico to this component\n const sheet = await this.picoCssService.loadStyleSheet();\n\n if (this.hostElement.nativeElement.shadowRoot) {\n this.hostElement.nativeElement.shadowRoot.adoptedStyleSheets = [sheet];\n }\n }\n\n protected handleChangeToolbarPosition(position: ConsoleToolbarPosition) {\n this.consoleContext().userSettings.patch({ toolbar: { dockTo: position } });\n }\n\n protected handleClipboardDialogOpenClose(isOpen: boolean) {\n this.isClipboardDialogOpen = isOpen;\n\n if (isOpen) {\n // Is there a better way to ensure .focus works other than timeouting it?\n setTimeout(() => this.clipboardTextInput()?.nativeElement?.focus(), 100);\n }\n }\n\n protected handleClipboardCopyLastText(text: string) {\n this.clipboardService.copyText(text);\n }\n\n protected handleNetworkChangeRequested(networkName?: string) {\n if (!networkName) {\n this.consoleContext().networks.disconnectRequested();\n } else {\n this.consoleContext().networks.connectionRequested(networkName);\n }\n this.isNetworkDialogOpen = false;\n }\n\n protected handleNetworkDialogOpenClose(isOpen: boolean) {\n this.isNetworkDialogOpen = isOpen;\n }\n\n protected handleRecordToggle() {\n if (this.consoleContext().state.activeConsoleRecording()) {\n this.consoleContext().console.recordScreenStop();\n } else {\n this.consoleContext().console.recordScreenStart();\n }\n }\n\n protected async handleSendClipboardText(event: Event, text: string) {\n event.preventDefault();\n\n if (text) {\n await this.consoleContext().clipboard.sendTextToConsoleClipboard(text);\n }\n\n this.isClipboardDialogOpen = false;\n }\n\n protected async handlSendKeyboardCtrlAltDel(): Promise<void> {\n await this.consoleContext().console.sendCtrlAltDel();\n this.isKeyboardDialogOpen = false;\n }\n\n protected async handleSendKeyboardInput(event: Event, text: string) {\n // prevent the form submit default\n event.preventDefault();\n\n if (text) {\n await this.consoleContext().console.sendKeyboardInput(text);\n }\n\n this.keyboardInputText.update(() => \"\");\n this.isKeyboardDialogOpen = false;\n }\n\n protected async handleSendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n await this.consoleContext().console.sendPowerRequest(request);\n this.isPowerDialogOpen = false;\n }\n\n protected handleSettingsDialogOpenClose(isOpen: boolean) {\n this.isSettingsDialogOpen = isOpen;\n }\n\n protected handleSettingsAllowLocalClipboardWrite(allow: boolean) {\n this.consoleContext().userSettings.patch({ console: { allowCopyToLocalClipboard: allow } });\n }\n\n protected handleSettingsPreserveAspectRatioChange(preserveAspectRatioOnScale: boolean) {\n this.consoleContext().userSettings.patch({ console: { preserveAspectRatioOnScale } });\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n@if (consoleContext()) {\n<div class=\"toolbar-container\"\n [class.horizontal]=\"consoleContext().userSettings.settings().toolbar.dockTo == 'top' || consoleContext().userSettings.settings().toolbar.dockTo == 'bottom' \">\n <div class=\"button-container\">\n <cf-console-toolbar-default-button label=\"Settings\" (clicked)=\"handleSettingsDialogOpenClose(true)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M12.0002 8C9.79111 8 8.00024 9.79086 8.00024 12C8.00024 14.2091 9.79111 16 12.0002 16C14.2094 16 16.0002 14.2091 16.0002 12C16.0002 9.79086 14.2094 8 12.0002 8ZM10.0002 12C10.0002 10.8954 10.8957 10 12.0002 10C13.1048 10 14.0002 10.8954 14.0002 12C14.0002 13.1046 13.1048 14 12.0002 14C10.8957 14 10.0002 13.1046 10.0002 12Z\"\n fill=\"#000000\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M11.2867 0.5C9.88583 0.5 8.6461 1.46745 8.37171 2.85605L8.29264 3.25622C8.10489 4.20638 7.06195 4.83059 6.04511 4.48813L5.64825 4.35447C4.32246 3.90796 2.83873 4.42968 2.11836 5.63933L1.40492 6.83735C0.67773 8.05846 0.954349 9.60487 2.03927 10.5142L2.35714 10.7806C3.12939 11.4279 3.12939 12.5721 2.35714 13.2194L2.03927 13.4858C0.954349 14.3951 0.67773 15.9415 1.40492 17.1626L2.11833 18.3606C2.83872 19.5703 4.3225 20.092 5.64831 19.6455L6.04506 19.5118C7.06191 19.1693 8.1049 19.7935 8.29264 20.7437L8.37172 21.1439C8.6461 22.5325 9.88584 23.5 11.2867 23.5H12.7136C14.1146 23.5 15.3543 22.5325 15.6287 21.1438L15.7077 20.7438C15.8954 19.7936 16.9384 19.1693 17.9553 19.5118L18.3521 19.6455C19.6779 20.092 21.1617 19.5703 21.8821 18.3606L22.5955 17.1627C23.3227 15.9416 23.046 14.3951 21.9611 13.4858L21.6432 13.2194C20.8709 12.5722 20.8709 11.4278 21.6432 10.7806L21.9611 10.5142C23.046 9.60489 23.3227 8.05845 22.5955 6.83732L21.8821 5.63932C21.1617 4.42968 19.678 3.90795 18.3522 4.35444L17.9552 4.48814C16.9384 4.83059 15.8954 4.20634 15.7077 3.25617L15.6287 2.85616C15.3543 1.46751 14.1146 0.5 12.7136 0.5H11.2867ZM10.3338 3.24375C10.4149 2.83334 10.7983 2.5 11.2867 2.5H12.7136C13.2021 2.5 13.5855 2.83336 13.6666 3.24378L13.7456 3.64379C14.1791 5.83811 16.4909 7.09167 18.5935 6.38353L18.9905 6.24984C19.4495 6.09527 19.9394 6.28595 20.1637 6.66264L20.8771 7.86064C21.0946 8.22587 21.0208 8.69271 20.6764 8.98135L20.3586 9.24773C18.6325 10.6943 18.6325 13.3057 20.3586 14.7523L20.6764 15.0186C21.0208 15.3073 21.0946 15.7741 20.8771 16.1394L20.1637 17.3373C19.9394 17.714 19.4495 17.9047 18.9905 17.7501L18.5936 17.6164C16.4909 16.9082 14.1791 18.1618 13.7456 20.3562L13.6666 20.7562C13.5855 21.1666 13.2021 21.5 12.7136 21.5H11.2867C10.7983 21.5 10.4149 21.1667 10.3338 20.7562L10.2547 20.356C9.82113 18.1617 7.50931 16.9082 5.40665 17.6165L5.0099 17.7501C4.55092 17.9047 4.06104 17.714 3.83671 17.3373L3.1233 16.1393C2.9058 15.7741 2.97959 15.3073 3.32398 15.0186L3.64185 14.7522C5.36782 13.3056 5.36781 10.6944 3.64185 9.24779L3.32398 8.98137C2.97959 8.69273 2.9058 8.2259 3.1233 7.86067L3.83674 6.66266C4.06106 6.28596 4.55093 6.09528 5.0099 6.24986L5.40676 6.38352C7.50938 7.09166 9.82112 5.83819 10.2547 3.64392L10.3338 3.24375Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n\n @if (!consoleContext().state.isViewOnly() && consoleContext().state.isConnected()) {\n <div class=\"buttons-divider\"></div>\n\n <cf-console-toolbar-default-button label=\"Keyboard\" (clicked)=\"isKeyboardDialogOpen = true\">\n <svg fill=\"#000000\" viewBox=\"0 0 1920 1920\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M1807.059 1637.706c0 31.059-25.299 56.47-56.47 56.47H169.411c-31.172 0-56.47-25.411-56.47-56.47v-903.53c0-31.058 25.298-56.47 56.47-56.47h1581.176c31.172 0 56.47 25.412 56.47 56.47v903.53Zm-56.47-1072.941h-729.262c14.908-86.965 65.958-113.506 133.384-147.163 89.336-44.611 200.583-100.291 200.583-304.602h-112.941c0 134.513-57.939 163.426-138.24 203.633-80.301 40.094-177.544 90.24-196.518 248.132H169.412C76.009 564.765 0 640.775 0 734.176v903.53c0 93.402 76.01 169.412 169.412 169.412h1581.176c93.403 0 169.412-76.01 169.412-169.412v-903.53c0-93.402-76.01-169.411-169.412-169.411Zm-564.707 677.647H734.118c-31.172 0-56.47 25.299-56.47 56.47v112.942c0 31.171 25.298 56.47 56.47 56.47h451.764c31.172 0 56.47-25.299 56.47-56.47v-112.942c0-31.171-25.298-56.47-56.47-56.47m338.824 0h-112.941c-31.172 0-56.47 25.299-56.47 56.47v112.942c0 31.171 25.298 56.47 56.47 56.47h112.94c31.173 0 56.471-25.299 56.471-56.47v-112.942c0-31.171-25.298-56.47-56.47-56.47m-1016.47 0H395.293c-31.172 0-56.47 25.299-56.47 56.47v112.942c0 31.171 25.298 56.47 56.47 56.47h112.941c31.172 0 56.47-25.299 56.47-56.47v-112.942c0-31.171-25.298-56.47-56.47-56.47m0-338.824h-112.94c-31.173 0-56.471 25.3-56.471 56.47V1073c0 31.172 25.298 56.47 56.47 56.47h112.941c31.172 0 56.47-25.298 56.47-56.47V960.059c0-31.172-25.298-56.47-56.47-56.47m225.883 225.882h112.94c31.173 0 56.471-25.3 56.471-56.471V960.059c0-31.172-25.298-56.47-56.47-56.47h-112.94c-31.172 0-56.47 25.298-56.47 56.47V1073c0 31.172 25.298 56.47 56.47 56.47m451.764-225.882h-112.94c-31.173 0-56.471 25.3-56.471 56.47V1073c0 31.172 25.298 56.47 56.47 56.47h112.941c31.172 0 56.47-25.298 56.47-56.47V960.059c0-31.172-25.298-56.47-56.47-56.47m338.824 0h-112.941c-31.172 0-56.47 25.298-56.47 56.47V1073c0 31.172 25.298 56.47 56.47 56.47h112.94c31.173 0 56.471-25.298 56.471-56.47V960.059c0-31.172-25.298-56.47-56.47-56.47\"\n fill-rule=\"evenodd\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n\n @if(cfConfig.enableClipboard) {\n <cf-console-toolbar-default-button [disabled]=\"!consoleContext().state.isConnected()\" label=\"Clipboard\"\n (clicked)=\"handleClipboardDialogOpenClose(true)\">\n <svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"none\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19.5 16.5L19.5 4.5L18.75 3.75H9L8.25 4.5L8.25 7.5L5.25 7.5L4.5 8.25V20.25L5.25 21H15L15.75 20.25V17.25H18.75L19.5 16.5ZM15.75 15.75L15.75 8.25L15 7.5L9.75 7.5V5.25L18 5.25V15.75H15.75ZM6 9L14.25 9L14.25 19.5L6 19.5L6 9Z\"\n fill=\"#080341\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n }\n\n @if (consoleContext().networks.config()?.available?.length) {\n <cf-console-toolbar-default-button\n label=\"Networks ({{ consoleContext().networks.config()?.available?.length }})\"\n (clicked)=\"handleNetworkDialogOpenClose(true)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M3 12H21M12 8V12M6.5 12V16M17.5 12V16M10.1 8H13.9C14.4601 8 14.7401 8 14.954 7.89101C15.1422 7.79513 15.2951 7.64215 15.391 7.45399C15.5 7.24008 15.5 6.96005 15.5 6.4V4.6C15.5 4.03995 15.5 3.75992 15.391 3.54601C15.2951 3.35785 15.1422 3.20487 14.954 3.10899C14.7401 3 14.4601 3 13.9 3H10.1C9.53995 3 9.25992 3 9.04601 3.10899C8.85785 3.20487 8.70487 3.35785 8.60899 3.54601C8.5 3.75992 8.5 4.03995 8.5 4.6V6.4C8.5 6.96005 8.5 7.24008 8.60899 7.45399C8.70487 7.64215 8.85785 7.79513 9.04601 7.89101C9.25992 8 9.53995 8 10.1 8ZM15.6 21H19.4C19.9601 21 20.2401 21 20.454 20.891C20.6422 20.7951 20.7951 20.6422 20.891 20.454C21 20.2401 21 19.9601 21 19.4V17.6C21 17.0399 21 16.7599 20.891 16.546C20.7951 16.3578 20.6422 16.2049 20.454 16.109C20.2401 16 19.9601 16 19.4 16H15.6C15.0399 16 14.7599 16 14.546 16.109C14.3578 16.2049 14.2049 16.3578 14.109 16.546C14 16.7599 14 17.0399 14 17.6V19.4C14 19.9601 14 20.2401 14.109 20.454C14.2049 20.6422 14.3578 20.7951 14.546 20.891C14.7599 21 15.0399 21 15.6 21ZM4.6 21H8.4C8.96005 21 9.24008 21 9.45399 20.891C9.64215 20.7951 9.79513 20.6422 9.89101 20.454C10 20.2401 10 19.9601 10 19.4V17.6C10 17.0399 10 16.7599 9.89101 16.546C9.79513 16.3578 9.64215 16.2049 9.45399 16.109C9.24008 16 8.96005 16 8.4 16H4.6C4.03995 16 3.75992 16 3.54601 16.109C3.35785 16.2049 3.20487 16.3578 3.10899 16.546C3 16.7599 3 17.0399 3 17.6V19.4C3 19.9601 3 20.2401 3.10899 20.454C3.20487 20.6422 3.35785 20.7951 3.54601 20.891C3.75992 21 4.03995 21 4.6 21Z\"\n stroke=\"#000000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n }\n\n @if (consoleContext().console.supportedFeatures().powerManagement) {\n <div class=\"buttons-divider\"></div>\n\n <cf-console-toolbar-default-button label=\"Power\" (clicked)=\"isPowerDialogOpen = true\">\n <svg width=\"800px\" height=\"800px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 3C13 2.44772 12.5523 2 12 2C11.4477 2 11 2.44772 11 3V13C11 13.5523 11.4477 14 12 14C12.5523 14 13 13.5523 13 13V3Z\"\n fill=\"none\" />\n <path\n d=\"M6.2798 6.70707C6.67031 6.31653 6.67028 5.68337 6.27973 5.29286C5.88919 4.90235 5.25603 4.90238 4.86552 5.29293C3.09635 7.06226 2 9.49298 2 12.1764C2 17.6204 6.49591 22 12 22C17.5041 22 22 17.6204 22 12.1764C22 9.49298 20.9036 7.06226 19.1345 5.29293C18.744 4.90238 18.1108 4.90235 17.7203 5.29286C17.3297 5.68337 17.3297 6.31653 17.7202 6.70707C19.1338 8.12083 20 10.0503 20 12.1764C20 16.4787 16.437 20 12 20C7.56296 20 4 16.4787 4 12.1764C4 10.0503 4.86618 8.12083 6.2798 6.70707Z\"\n fill=\"none\" />\n </svg>\n </cf-console-toolbar-default-button> }\n }\n\n <div class=\"buttons-divider\"></div>\n\n <cf-console-toolbar-default-button (clicked)=\"consoleContext().console.copyScreenshot()\"\n [disabled]=\"!consoleContext().state.isConnected()\" label=\"Screenshot\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M9.15023 3.01742C9.13605 3.03985 9.12278 3.0676 9.11298 3.09958C9.11044 3.10789 9.10778 3.11617 9.10502 3.12442L8.36963 5.31787C8.23301 5.72537 7.85129 6 7.4215 6H3C2.44772 6 2 6.44772 2 7V20C2 20.5523 2.44771 21 3 21H21C21.5523 21 22 20.5523 22 20V7C22 6.44771 21.5523 6 21 6H16.331C15.9011 6 15.5194 5.72528 15.3828 5.31769L14.6479 3.12423C14.6452 3.11605 14.6425 3.10783 14.64 3.09958C14.6302 3.0676 14.6169 3.03985 14.6027 3.01742C14.5986 3.01089 14.5946 3.00509 14.5908 3H9.16221C9.1584 3.00509 9.15437 3.01089 9.15023 3.01742ZM7.20525 2.49911C7.43535 1.76672 8.10563 1 9.06392 1H14.6891C15.6474 1 16.3177 1.76679 16.5478 2.49922L17.0506 4H21C22.6569 4 24 5.34315 24 7V20C24 21.6569 22.6569 23 21 23H3C1.34315 23 0 21.6569 0 20V7C0 5.34315 1.34315 4 3 4H6.70206L7.20525 2.49911ZM7 13C7 10.2386 9.23858 8 12 8C14.7614 8 17 10.2386 17 13C17 15.7614 14.7614 18 12 18C9.23858 18 7 15.7614 7 13ZM12 10C10.3431 10 9 11.3431 9 13C9 14.6569 10.3431 16 12 16C13.6569 16 15 14.6569 15 13C15 11.3431 13.6569 10 12 10Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n\n @if (cfConfig.enableConsoleRecord) {\n <cf-console-toolbar-default-button (clicked)=\"handleRecordToggle()\"\n [disabled]=\"!consoleContext().state.isRecordingAvailable()\"\n [isOngoing]=\"!!consoleContext().state.activeConsoleRecording()\" label=\"Record\">\n @if (!consoleContext().state.activeConsoleRecording()) {\n <svg viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <title>record [#979]</title>\n <desc>Created with Sketch.</desc>\n <defs> </defs>\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"Dribbble-Light-Preview\" transform=\"translate(-100.000000, -3879.000000)\" fill=\"#000000\">\n <g id=\"icons\" transform=\"translate(56.000000, 160.000000)\">\n <path\n d=\"M56,3719 L56,3721 L62,3721 L62,3727 L64,3727 L64,3719 L56,3719 Z M58,3729.151 C58,3726.942 56.209,3725.151 54,3725.151 C51.791,3725.151 50,3726.942 50,3729.151 C50,3731.36 51.791,3733.151 54,3733.151 C56.209,3733.151 58,3731.36 58,3729.151 L58,3729.151 Z M62,3737 L56,3737 L56,3739 L64,3739 L64,3731 L62,3731 L62,3737 Z M46,3731 L44,3731 L44,3739 L52,3739 L52,3737 L46,3737 L46,3731 Z M46,3727 L44,3727 L44,3719 L52,3719 L52,3721 L46,3721 L46,3727 Z\"\n id=\"record-[#979]\"> </path>\n </g>\n </g>\n </g>\n </g>\n </svg>\n } @else {\n <svg viewBox=\"0 -0.5 21 21\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"Dribbble-Light-Preview\" transform=\"translate(-59.000000, -440.000000)\" fill=\"#000000\">\n <g id=\"icons\" transform=\"translate(56.000000, 160.000000)\">\n <path\n d=\"M9.3,294 L17.7,294 L17.7,286 L9.3,286 L9.3,294 Z M15.6,280 L15.6,282 L21.9,282 L21.9,288 L24,288 L24,280 L15.6,280 Z M21.9,298 L15.6,298 L15.6,300 L24,300 L24,292 L21.9,292 L21.9,298 Z M5.1,292 L3,292 L3,300 L11.4,300 L11.4,298 L5.1,298 L5.1,292 Z M5.1,288 L3,288 L3,280 L11.4,280 L11.4,282 L5.1,282 L5.1,288 Z\"\n id=\"stop-[#1470]\"> </path>\n </g>\n </g>\n </g>\n </g>\n </svg>\n }\n </cf-console-toolbar-default-button>\n }\n\n <cf-console-toolbar-default-button (clicked)=\"consoleContext().console.toggleFullscreen()\" label=\"Fullscreen\">\n @if (consoleContext().state.isFullscreenAvailable()) {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M4 2C2.89543 2 2 2.89543 2 4V8C2 8.55228 2.44772 9 3 9C3.55228 9 4 8.55228 4 8V4H8C8.55228 4 9 3.55228 9 3C9 2.44772 8.55228 2 8 2H4Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M20 2C21.1046 2 22 2.89543 22 4V8C22 8.55228 21.5523 9 21 9C20.4477 9 20 8.55228 20 8V4H16C15.4477 4 15 3.55228 15 3C15 2.44772 15.4477 2 16 2H20Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M20 22C21.1046 22 22 21.1046 22 20V16C22 15.4477 21.5523 15 21 15C20.4477 15 20 15.4477 20 16V20H16C15.4477 20 15 20.4477 15 21C15 21.5523 15.4477 22 16 22H20Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M2 20C2 21.1046 2.89543 22 4 22H8C8.55228 22 9 21.5523 9 21C9 20.4477 8.55228 20 8 20H4V16C4 15.4477 3.55228 15 3 15C2.44772 15 2 15.4477 2 16V20Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M7 9C8.10457 9 9 8.10457 9 7V3C9 2.44772 8.55228 2 8 2C7.44772 2 7 2.44772 7 3V7H3C2.44772 7 2 7.44772 2 8C2 8.55228 2.44772 9 3 9H7Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M17 9C15.8954 9 15 8.10457 15 7V3C15 2.44772 15.4477 2 16 2C16.5523 2 17 2.44772 17 3V7H21C21.5523 7 22 7.44772 22 8C22 8.55228 21.5523 9 21 9H17Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M17 15C15.8954 15 15 15.8954 15 17V21C15 21.5523 15.4477 22 16 22C16.5523 22 17 21.5523 17 21V17H21C21.5523 17 22 16.5523 22 16C22 15.4477 21.5523 15 21 15H17Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M9 17C9 15.8954 8.10457 15 7 15H3C2.44772 15 2 15.4477 2 16C2 16.5523 2.44772 17 3 17H7V21C7 21.5523 7.44772 22 8 22C8.55228 22 9 21.5523 9 21V17Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n }\n </cf-console-toolbar-default-button>\n </div>\n</div>\n}\n\n<dialog [open]=\"isClipboardDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"handleClipboardDialogOpenClose(false)\"></button>\n <p>\n <strong>Clipboard</strong>\n </p>\n </header>\n\n @if (consoleContext().console.supportedFeatures().clipboardRemoteWrite) {\n <div class=\"dialog-section\">\n <h2>Send Text to Console Clipboard</h2>\n <form (submit)=\"handleSendClipboardText($event, clipboardText.value)\">\n <fieldset role=\"group\">\n <input type=\"text\" class=\"clipboard-text\" aria-label=\"Clipboard text\"\n placeholder=\"Enter text to send to the console's clipboard\" #clipboardText autofocus>\n <button type=\"submit\"\n [disabled]=\"!clipboardText.value || !consoleContext().state.isConnected\">Send</button>\n </fieldset>\n </form>\n </div>\n }\n\n @if(!consoleContext().userSettings.settings().console.allowCopyToLocalClipboard ||\n !consoleContext().console.supportedFeatures().clipboardAutomaticLocalCopy) {\n <div class=\"dialog-section\">\n <h2>Console Clipboard Content</h2>\n <form (submit)=\"handleClipboardCopyLastText(consoleLastClipboardText.value)\">\n <fieldset role=\"group\">\n <input type=\"text\" class=\"clipboard-text\" aria-label=\"Clipboard text\" disabled\n [value]=\"consoleContext().clipboard.consoleClipboardText()\"\n placeholder=\"The console's clipboard content will appear here\" #consoleLastClipboardText>\n <button type=\"submit\" [disabled]=\"!consoleLastClipboardText.value\">Copy</button>\n </fieldset>\n </form>\n </div>\n }\n </article>\n</dialog>\n\n<dialog [open]=\"isKeyboardDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"isKeyboardDialogOpen = false\"></button>\n <p>\n <strong>Send Keystrokes</strong>\n </p>\n </header>\n\n <div class=\"dialog-section\">\n <h2>Send Keystrokes to Console</h2>\n <form (submit)=\"handleSendKeyboardInput($event, keyboardInputText())\">\n <fieldset role=\"group\">\n <input type=\"text\" name=\"keyboardInputText\" class=\"clipboard-text\" aria-label=\"Clipboard text\"\n placeholder=\"Enter text to send as keyboard input to the console\" autofocus\n [(ngModel)]=\"keyboardInputText\">\n <button type=\"submit\"\n [disabled]=\"!keyboardInputText() || !consoleContext().state.isConnected\">Send</button>\n </fieldset>\n </form>\n </div>\n\n <div class=\"dialog-section\">\n <h2>Special Key Combinations</h2>\n\n <div class=\"dialog-button-group\">\n <button type=\"button\" aria-label=\"Send Ctrl+Alt+Delete\" (click)=\"handlSendKeyboardCtrlAltDel()\">\n Ctrl + Alt + Delete\n </button>\n </div>\n </div>\n </article>\n</dialog>\n\n<dialog [open]=\"isNetworkDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"handleNetworkDialogOpenClose(false)\"></button>\n <p>\n <strong>Networks</strong>\n </p>\n </header>\n\n <form>\n <fieldset role=\"group\">\n <select #availableNetworksSelect name=\"current-network\" aria-label=\"Select a network to connect to\"\n required>\n <option selected value=\"\">\n [Disconnect from network]\n </option>\n\n @for(network of consoleContext().networks.config()?.available; track network) {\n <option [value]=\"network\" [selected]=\"network === consoleContext().networks.config()?.current\">\n {{ network }}\n </option>\n }\n </select>\n\n <button type=\"button\" (click)=\"handleNetworkChangeRequested(availableNetworksSelect.value)\">\n {{ availableNetworksSelect.value ? \"Connect\" : \"Disconnect\" }}\n </button>\n </fieldset>\n </form>\n </article>\n</dialog>\n\n<dialog [open]=\"isPowerDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"isPowerDialogOpen = false\"></button>\n <p>\n <strong>Power</strong>\n </p>\n </header>\n\n <div class=\"dialog-button-group\">\n <button type=\"button\" (click)=\"handleSendPowerRequest('reboot')\">Request Reboot</button>\n <button type=\"button\" (click)=\"handleSendPowerRequest('shutdown')\">Request Shutdown</button>\n <hr />\n <button class=\"secondary\" type=\"button\" (click)=\"handleSendPowerRequest('rebootHard')\">\n Request Hard Reboot\n </button>\n </div>\n </article>\n</dialog>\n\n<dialog [open]=\"isSettingsDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"handleSettingsDialogOpenClose(false)\"></button>\n <p>\n <strong>Settings</strong>\n </p>\n </header>\n\n <div class=\"settings-form\">\n <h4>Behavior</h4>\n <fieldset>\n <label>\n <input #inputAllowLocalClipboardWrite type=\"checkbox\" name=\"allowLocalClipboardWrite\"\n [checked]=\"consoleContext().userSettings.settings().console.allowCopyToLocalClipboard\"\n (change)=\"handleSettingsAllowLocalClipboardWrite(inputAllowLocalClipboardWrite.checked)\" />\n Allow the remote machine to copy text to my local clipboard\n </label>\n <label>\n <input #inputScaleToContainerSize type=\"checkbox\" name=\"scaleToContainerSize\"\n [checked]=\"consoleContext().userSettings.settings().console.preserveAspectRatioOnScale\"\n (change)=\"handleSettingsPreserveAspectRatioChange(inputScaleToContainerSize.checked)\" />\n Preserve console aspect ratio when scaling size\n </label>\n </fieldset>\n\n <div class=\"settings-toolbar-dock\">\n <h4>Toolbar Position</h4>\n <div role=\"group\">\n <button (click)=\"handleChangeToolbarPosition('left')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'left'\">Left</button>\n <button (click)=\"handleChangeToolbarPosition('right')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'right'\">Right</button>\n <button (click)=\"handleChangeToolbarPosition('top')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'top'\">Top</button>\n <button (click)=\"handleChangeToolbarPosition('bottom')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'bottom'\">Bottom</button>\n </div>\n </div>\n </div>\n </article>\n</dialog>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Type } from \"@angular/core\";\nimport { LogLevel } from \"../models/log-level\";\nimport { ConsoleClientType } from \"../models/console-client-type\";\nimport { ConsoleToolbarComponentBase } from \"../models/console-toolbar-component-base\";\nimport { ConsoleToolbarDefaultComponent } from \"../components/console-toolbar-default/console-toolbar-default.component\";\n\nexport abstract class ConsoleForgeConfig {\n abstract canvasRecording: {\n autoDownloadCompletedRecordings: boolean;\n chunkLength?: number;\n frameRate?: number;\n maxDuration?: number;\n mimeType?: string;\n };\n abstract consoleBackgroundStyle?: string;\n abstract defaultConsoleClientType?: ConsoleClientType;\n abstract enableClipboard: boolean;\n abstract enableConsoleRecord: boolean;\n abstract logThreshold: LogLevel;\n abstract showBrowserNotificationsOnConsoleEvents: boolean;\n abstract toolbar: {\n component: Type<ConsoleToolbarComponentBase>;\n disabled: boolean;\n }\n}\n\nexport const defaultCfConfig: ConsoleForgeConfig = {\n canvasRecording: {\n autoDownloadCompletedRecordings: true,\n chunkLength: 1000,\n frameRate: 25,\n maxDuration: 10000,\n mimeType: \"video/webm\"\n },\n consoleBackgroundStyle: \"rgb(40, 40, 40)\",\n enableClipboard: true,\n enableConsoleRecord: true,\n logThreshold: LogLevel.WARNING,\n showBrowserNotificationsOnConsoleEvents: true,\n toolbar: {\n component: ConsoleToolbarDefaultComponent,\n disabled: false\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport NoVncClient, { NoVncOptions } from '@novnc/novnc/core/rfb';\nimport { ConsoleForgeConfig } from '../../../config/console-forge-config';\nimport { ConsoleClientType } from '../../../models/console-client-type';\nimport { ConsoleConnectionOptions } from '../../../models/console-connection-options';\nimport { ConsoleConnectionStatus } from '../../../models/console-connection-status';\nimport { ConsolePowerRequest } from '../../../models/console-power-request';\nimport { ConsoleSupportedFeatures } from '../../../models/console-supported-features';\nimport { LogLevel } from '../../../models/log-level';\nimport { ConsoleClientService } from '../../../services/console-clients/console-client.service';\nimport { LoggerService } from '../../../services/logger.service';\nimport { UserSettingsService } from '../../user-settings.service';\nimport { ClipboardService } from '../../clipboard/clipboard.service';\n\n@Injectable({ providedIn: 'root' })\nexport class VncConsoleClientService implements ConsoleClientService {\n public readonly clientType: ConsoleClientType = \"vnc\";\n private readonly _consoleClipboardUpdated = signal<string>(\"\");\n public readonly consoleClipboardUpdated = this._consoleClipboardUpdated.asReadonly();\n\n private readonly _connectionStatus = signal<ConsoleConnectionStatus>(\"disconnected\");\n public readonly connectionStatus = this._connectionStatus.asReadonly();\n\n private readonly _supportedFeatures = signal<ConsoleSupportedFeatures>({\n clipboardAutomaticLocalCopy: true,\n clipboardRemoteWrite: true,\n onScreenKeyboard: false,\n powerManagement: false,\n viewOnlyMode: true\n });\n public readonly supportedFeatures = this._supportedFeatures.asReadonly();\n\n // injected services\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly clipboardService = inject(ClipboardService);\n private readonly logger = inject(LoggerService);\n private readonly userSettings = inject(UserSettingsService);\n\n // the actual client from @novnc/novnc\n private noVncClient?: NoVncClient;\n\n public async connect(url: string, options: ConsoleConnectionOptions): Promise<void> {\n if (this.noVncClient) {\n this.noVncClient = undefined;\n }\n\n try {\n this._connectionStatus.update(() => \"connecting\");\n this.logger.log(LogLevel.DEBUG, \"Connecting to\", url);\n this.logger.log(LogLevel.DEBUG, \"Connection options\", options);\n\n const noVncCredentials: NoVncOptions = {\n credentials: {\n password: options?.credentials?.accessTicket || options?.credentials?.password || \"\",\n // explicitly not supporting these for now\n username: \"\",\n target: \"\"\n },\n };\n\n this.logger.log(LogLevel.DEBUG, \"Connecting...\", noVncCredentials);\n let client = new NoVncClient(options.hostElement, url, noVncCredentials);\n\n this.logger.log(LogLevel.DEBUG, \"Client instantiated. Configuring...\");\n client = this.doPreConnectionConfig(client);\n this.logger.log(LogLevel.DEBUG, \"Pre-connection config done.\");\n\n client.addEventListener(\"connect\", () => {\n this._connectionStatus.update(() => \"connected\");\n this.logger.log(LogLevel.DEBUG, \"Connected. Performing post-connection configuration...\");\n\n // do other post-connection config\n this.noVncClient = this.doPostConnectionConfig(client, options);\n this.logger.log(LogLevel.DEBUG, \"Post-connection config done. Resolving supported features...\");\n\n // the vnc client knows its capabilities post-connection\n // so send this back along with the things we know we can't support\n const supportedFeatures: ConsoleSupportedFeatures = {\n clipboardAutomaticLocalCopy: true,\n clipboardRemoteWrite: true,\n onScreenKeyboard: false,\n powerManagement: this.noVncClient.capabilities.power,\n viewOnlyMode: true\n };\n\n this._supportedFeatures.update(() => supportedFeatures);\n this.noVncClient = client;\n\n this.logger.log(LogLevel.DEBUG, \"Supported features resolved. Connection complete!\");\n });\n }\n catch (err) {\n this._connectionStatus.update(() => \"disconnected\");\n this.logger.log(LogLevel.ERROR, \"Connection error\", err);\n throw err;\n }\n }\n\n public async disconnect(): Promise<void> {\n this.logger.log(LogLevel.DEBUG, \"Manual disconnection requested\");\n return this.handleDisconnect(true);\n }\n\n public dispose(): Promise<void> {\n return this.disconnect();\n }\n\n public async sendClipboardText(text: string) {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't send clipboard text.\");\n }\n\n this.noVncClient.clipboardPasteFrom(text);\n this._consoleClipboardUpdated.update(() => text);\n }\n\n public async sendCtrlAltDelete(): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't send Ctrl+Alt+Delete.\");\n }\n\n this.noVncClient.sendCtrlAltDel();\n }\n\n public async sendKeyboardInput(text: string): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't send keyboard input.\");\n }\n\n // split by line and remove empties\n const lines = text\n .split(/\\r?\\n|\\r|\\n/g)\n .map(line => line.trim())\n .filter(line => !!line);\n\n this.logger.log(LogLevel.INFO, \"Sending lines\", lines);\n\n for (let i = 0; i < lines.length; i++) {\n const lineCharacters = lines[i].split(\"\");\n\n for (const chr of lineCharacters) {\n this.noVncClient.sendKey(chr.charCodeAt(0), null);\n }\n\n if ((i + 1) < lines.length) {\n // send \"return\" between lines\n this.noVncClient.sendKey(0xFF0D, null);\n }\n }\n }\n\n public async sendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(`VNC client isn't connected; can't send power request \"${request}\"`);\n }\n\n if (!this.noVncClient.capabilities.power) {\n throw new Error(`The machine you're connected to over VNC doesn't have the \"power\" capability, so reboots, resets, and shutdowns aren't permitted.`);\n }\n\n switch (request) {\n case \"reboot\":\n this.noVncClient.machineReboot();\n return;\n case \"rebootHard\":\n this.noVncClient.machineReset();\n return;\n case \"shutdown\":\n this.noVncClient.machineShutdown();\n return;\n }\n }\n\n public async setIsViewOnly(isViewOnly: boolean): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't set properties\");\n }\n\n this.noVncClient.viewOnly = isViewOnly;\n }\n\n public async setPreserveAspectRatioOnScale(preserve: boolean): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't set properties\");\n }\n\n this.logger.log(LogLevel.DEBUG, \"Set preserve aspect ratio to\", preserve);\n this.noVncClient.scaleViewport = preserve;\n }\n\n private doPreConnectionConfig(client: NoVncClient): NoVncClient {\n client.addEventListener(\"connect\", () => {\n this.logger.log(LogLevel.INFO, \"Connected!\");\n this._connectionStatus.update(() => \"connected\");\n });\n client.addEventListener(\"disconnect\", ev => this.handleDisconnect(ev.detail.clean));\n client.addEventListener(\"clipboard\", ev => {\n // emit the event\n this._consoleClipboardUpdated.update(() => ev.detail.text);\n\n // if enabled at the app level and permitted by the user, automatically copy text to local clipboard\n if (!this.cfConfig.enableClipboard) {\n this.logger.log(LogLevel.INFO, \"The remote console tried to copy text to the local clipboard, but local clipboard access is disabled in ConsoleForge's configuration.\");\n return;\n }\n\n const currentUserSettings = this.userSettings.settings();\n if (!currentUserSettings.console.allowCopyToLocalClipboard) {\n this.logger.log(LogLevel.INFO, \"The remote console tried to copy text to the local clipboard, but you've disabled local clipboard copy. Use ConsoleForge's settings to allow it to copy text to your local clipboard.\");\n return;\n }\n\n if (ev.detail.text) {\n this.clipboardService.copyText(ev.detail.text);\n }\n });\n\n return client;\n }\n\n private doPostConnectionConfig(client: NoVncClient, options: ConsoleConnectionOptions): NoVncClient {\n client.background = options.backgroundStyle || \"\";\n client.resizeSession = this.userSettings.settings().console.preserveAspectRatioOnScale;\n\n // try focus if requested\n if (options.autoFocusOnConnect) {\n client.focus();\n }\n\n return client;\n }\n\n private handleDisconnect(isManualDisconnect: boolean) {\n this.logger.log(LogLevel.INFO, \"Disconnected. Manual?\", isManualDisconnect);\n this._connectionStatus.update(() => \"disconnected\");\n\n if (!isManualDisconnect) {\n this.logger.log(LogLevel.WARNING, \"Unexpected disconnection\");\n }\n\n if (this.noVncClient) {\n this.noVncClient = undefined;\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { WmksConnectionState, WmksEvents, WmksPosition, WmksSettableOptions } from \"./vmware-mks.models\";\n\nfunction resolveWMKSLib(): WMKS {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (window as any).WMKS;\n}\n\nexport function createWmksClient(hostElementId: string, options?: WmksClientCreateOptions): WmksClient {\n const result = resolveWMKSLib();\n return result.createWMKS(hostElementId, options);\n}\n\nexport interface WmksClient {\n connect(url: string): Promise<void>;\n destroy(): void;\n disconnect(): void;\n\n getConnectionState(): WmksConnectionState;\n\n /**\n * This function is not documented by Broadcom but seems to exist and may be strictly related to\n * focus on the virtual console OR clipboard reading OR both OR neither.\n */\n grab(): void;\n\n register(event: WmksEvents, handler: WmksEventHandler): WmksClient;\n\n /**\n * Sends a Ctrl+Alt+Del key combination to the remote machine.\n */\n sendCAD(): void;\n\n /**\n * Sends a string as keyboard input to the server.\n */\n sendInputString(input: string): void;\n\n /**\n * Set an option WMKS client.\n * \n * @param option - which option's value to update.\n * @param value - a boolean value enabling/disabling the option.\n */\n setOption(option: WmksSettableOptions, value: boolean): void;\n\n showKeyboard(): void;\n\n /**\n * Forcibly remove focus from the remote console (I think)\n */\n ungrab(): void;\n\n /**\n * Broadcom's description: Changes the resolution or rescales the remote screen to match the container size. Behavior depends on settings for changeResolution, rescale, and position options described in createMKS Options.\n * \n * See: https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/vsphere-sdks-tools/8-0/html-console-sdk-programming-guide/html-console-sdk-api/display-related-apis.html\n */\n updateScreen(): void;\n}\n\nexport interface WmksClientCreateOptions {\n changeResolution?: boolean;\n position?: WmksPosition;\n\n /**\n * Indicates whether to rescale the remote screen to fit the container size. (Defaults to true)\n */\n rescale?: boolean;\n useNativePixels?: boolean;\n useVNCHandshake?: boolean;\n}\n\nexport interface WMKS {\n get version(): string;\n\n /**\n * Create a client which connects to a remote console hosted on a VMWare cluster.\n * \n * @param hostElementId The ID of a DOM element that will have a canvas injected into it by Broadcom's HTML Console SDK upon successful connection.\n * @param options Options which identify and specify the behavior of the virtual console.\n */\n createWMKS(hostElementId: string, options?: WmksClientCreateOptions): WmksClient;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WmksEventHandler = (e: any, data: any) => void;\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport enum WmksAudioEncodingType {\n AAC = \"aac\",\n OPUS = \"opus\",\n VORBIS = \"vorbis\"\n}\n\nexport enum WmksConnectionState {\n CONNECTED = \"connected\",\n CONNECTING = \"connecting\",\n DISCONNECTED = \"disconnected\"\n}\n\nexport enum WmksErrorType {\n AUTHENTICATION_FAILED = \"authenticationfailed\",\n PROTOCOL_ERROR = \"protocolerror\",\n WEBSOCKET_ERROR = \"websocketerror\"\n}\n\nexport enum WmksEvents {\n AUDIO = \"audio\",\n CONNECTION_STATE_CHANGE = \"connectionstatechange\",\n COPY = \"copy\",\n ERROR = \"error\",\n FULL_SCREEN_CHANGE = \"fullscreenchange\",\n HEARTBEAT = \"heartbeat\",\n KEYBOARD_LEDS_CHANGE = \"keyboardledschanged\",\n REMOTE_SCREEN_SIZE_CHANGE = \"screensizechange\",\n TOGGLE = \"toggle\"\n}\n\nexport interface WmksEventData {\n state: WmksConnectionState;\n}\n\nexport enum WmksPosition {\n CENTER = 0,\n LEFT_TOP = 1\n}\n\nexport type WmksSettableOptions = \"changeResolution\" | \"position\" | \"rescale\"\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\"\nimport { debounceTime, Subject } from 'rxjs';\nimport { ConsoleClientService } from '../console-client.service';\nimport { LoggerService } from '../../logger.service';\nimport { ConsoleConnectionOptions } from '../../../models/console-connection-options';\nimport { ConsoleConnectionStatus } from '../../../models/console-connection-status';\nimport { ConsolePowerRequest } from '../../../models/console-power-request';\nimport { ConsoleSupportedFeatures } from '../../../models/console-supported-features';\nimport { LogLevel } from '../../../models/log-level';\nimport { createWmksClient, WmksClient } from \"../../../shims/vmware-wmks.shim\";\nimport { WmksConnectionState, WmksEvents, WmksPosition } from '../../../shims/vmware-mks.models';\nimport { WINDOW } from '../../../injection/window.injection-token';\nimport { ClipboardService } from '../../clipboard/clipboard.service';\nimport { ConsoleForgeConfig } from '../../../config/console-forge-config';\nimport { UserSettingsService } from '../../user-settings.service';\nimport { ConsoleClientType } from '../../../models/console-client-type';\n\n@Injectable({ providedIn: 'root' })\nexport class VmWareConsoleClientService implements ConsoleClientService {\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly clipboardService = inject(ClipboardService);\n private readonly logger = inject(LoggerService);\n private readonly document = inject(DOCUMENT);\n private readonly userSettings = inject(UserSettingsService);\n private readonly window = inject(WINDOW);\n private wmksClient?: WmksClient;\n\n public readonly clientType: ConsoleClientType = \"vmware\";\n private readonly _connectionStatus = signal<ConsoleConnectionStatus>(\"disconnected\")\n public readonly connectionStatus = this._connectionStatus.asReadonly();\n\n private readonly _consoleClipboardUpdated = signal<string>(\"\");\n public readonly consoleClipboardUpdated = this._consoleClipboardUpdated.asReadonly();\n\n private readonly _supportedFeatures = signal<ConsoleSupportedFeatures>({\n clipboardAutomaticLocalCopy: false,\n clipboardRemoteWrite: false,\n onScreenKeyboard: true,\n powerManagement: false,\n viewOnlyMode: false\n });\n public readonly supportedFeatures = this._supportedFeatures.asReadonly();\n\n private readonly _needsCanvasSizeUpdate = new Subject<void>();\n private readonly _needsCanvasSizeUpdateSub = this._needsCanvasSizeUpdate.pipe(\n debounceTime(250),\n takeUntilDestroyed()\n ).subscribe(() => {\n if (this.wmksClient) {\n this.logger.log(LogLevel.DEBUG, \"Document size change, updating canvas\");\n\n if (this.wmksClient && this.wmksClient.getConnectionState() == \"connected\") {\n this.wmksClient.updateScreen();\n }\n }\n });\n\n public connect(url: string, options: ConsoleConnectionOptions): Promise<void> {\n if (!options.hostElement) {\n throw new Error(\"A host element is required to connect to a VMWare WMKS console.\");\n }\n\n return new Promise((resolve, reject) => {\n this.wmksClient = createWmksClient(options.hostElement.id, {\n changeResolution: true,\n rescale: true,\n useNativePixels: true,\n useVNCHandshake: false,\n position: WmksPosition.CENTER\n })\n .register(WmksEvents.CONNECTION_STATE_CHANGE, (ev, data) => {\n this.logger.log(LogLevel.DEBUG, \"WMKS state change\", ev, data);\n\n if (data.state === WmksConnectionState.DISCONNECTED) {\n this._connectionStatus.update(() => \"disconnected\");\n this.doPostDisconnectionConfig();\n reject();\n }\n\n if (data.state === WmksConnectionState.CONNECTED) {\n this.logger.log(LogLevel.DEBUG, \"WMKS confirms connection\", this.wmksClient);\n this.doPostConnectionConfig(options.hostElement);\n this._supportedFeatures.update(() => ({\n clipboardAutomaticLocalCopy: false,\n clipboardRemoteWrite: false,\n onScreenKeyboard: true,\n powerManagement: false,\n viewOnlyMode: false\n }))\n this._connectionStatus.update(() => \"connected\");\n resolve();\n }\n })\n .register(WmksEvents.COPY, (ev, data) => {\n this.logger.log(LogLevel.DEBUG, \"Clipboard data available\", ev, data);\n\n // emit the event\n this._consoleClipboardUpdated.update(() => data);\n\n // if enabled in config and permitted by the user, copy text to local clipboard\n if (this.cfConfig.enableClipboard && this.userSettings.settings().console.allowCopyToLocalClipboard) {\n this.clipboardService.copyText(data);\n }\n })\n .register(WmksEvents.ERROR, (ev, data) => {\n this.logger.log(LogLevel.ERROR, \"Error from WMKS:\", ev, data);\n })\n // as far as i can tell, this never happens\n .register(WmksEvents.HEARTBEAT, (ev, data) => this.logger.log(LogLevel.DEBUG, \"WMKS heartbeat\", ev, data))\n .register(WmksEvents.REMOTE_SCREEN_SIZE_CHANGE, (ev, data) => {\n if (!this.wmksClient) {\n return;\n }\n\n this.logger.log(LogLevel.DEBUG, \"Remote screen size change\", ev, data);\n this.wmksClient.updateScreen();\n })\n .register(WmksEvents.TOGGLE, (ev, data) => {\n this.logger.log(LogLevel.DEBUG, \"Visible devices toggle\", ev, data);\n });\n\n this.wmksClient.connect(url);\n });\n }\n\n public disconnect(): Promise<void> {\n if (this.wmksClient) {\n this.wmksClient.disconnect();\n this.wmksClient = undefined;\n }\n\n return Promise.resolve();\n }\n\n async sendClipboardText(text: string): Promise<void> {\n throw new Error(`Can't send clipboard text to VMWare-based consoles. (text: ${text})`);\n }\n\n public sendCtrlAltDelete(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n if (!this.wmksClient) {\n throw new Error(\"Couldn't resolve client; can't send Ctrl+Alt+Del\");\n }\n\n this.wmksClient.sendCAD();\n resolve();\n }\n catch (err) {\n reject(err)\n }\n });\n }\n\n public async sendKeyboardInput(text: string): Promise<void> {\n if (!this.wmksClient) {\n throw new Error(\"Can't resolve WMKS client; can't send clipboard text.\");\n }\n\n const lines = text.trim().split(\"\\n\");\n if (lines.length === 1) {\n this.wmksClient.sendInputString(lines[0])\n } else {\n for (const line of text.split(\"\\n\")) {\n this.wmksClient.sendInputString(`${line}\\n`);\n await new Promise(r => setTimeout(r, 40));\n }\n }\n }\n\n public sendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n return Promise.reject(`Power management request aren't supported for VMWare consoles. (rejected request: \"${request}\")`);\n }\n\n public setIsViewOnly(isViewOnly: boolean): Promise<void> {\n this.logger.log(LogLevel.INFO, \"A 'view-only' request was issued, but this isn't directly supported at the protocol level for VMWare. The ConsoleComponent will do its best to make the console canvas view-only. Request:\", isViewOnly);\n return Promise.resolve();\n }\n\n public setPreserveAspectRatioOnScale(scaleToContainerSize: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n if (!this.wmksClient) {\n throw new Error(\"Couldn't resolve client; can't set option\");\n }\n\n this.wmksClient.setOption(\"rescale\", scaleToContainerSize);\n resolve();\n }\n catch (err) {\n reject(err);\n }\n });\n }\n\n public dispose(): Promise<void> {\n if (this.wmksClient) {\n this.wmksClient.destroy();\n this.wmksClient = undefined;\n }\n\n return Promise.resolve();\n }\n\n private doPostConnectionConfig(hostElement: HTMLElement) {\n if (!this.document) {\n this.logger.log(LogLevel.WARNING, \"Couldn't resolve the document for host event listening.\");\n }\n\n this.document.addEventListener(\"fullscreenchange\", this.handleWindowSizeChange.bind(this));\n this.document.addEventListener(\"resize\", this.handleWindowSizeChange.bind(this));\n\n if (!this.window) {\n this.logger.log(LogLevel.WARNING, \"Couldn't resolve the window for host event listening.\");\n }\n\n this.window.addEventListener(\"resize\", this.handleWindowSizeChange.bind(this));\n\n // also listen for canvas events i guess because it matters or something i hate everything\n const canvas = hostElement.querySelector(\"canvas\");\n if (canvas) {\n canvas.addEventListener(\"blur\", () => {\n if (this.wmksClient) {\n this.wmksClient.ungrab();\n }\n });\n\n canvas.addEventListener(\"focus\", () => {\n if (this.wmksClient) {\n this.wmksClient.grab();\n }\n })\n }\n }\n\n private doPostDisconnectionConfig() {\n this.document.removeEventListener(\"fullscreenchange\", this.handleWindowSizeChange.bind(this));\n this.document.removeEventListener(\"resize\", this.handleWindowSizeChange.bind(this));\n }\n\n private handleWindowSizeChange() {\n this._needsCanvasSizeUpdate.next();\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { ConsoleClientService } from './console-client.service';\nimport { ConsoleClientType } from '../../models/console-client-type';\nimport { VncConsoleClientService } from './vnc-console-client/vnc-console-client.service';\nimport { VmWareConsoleClientService } from './vmware/vmware-console-client.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ConsoleClientFactoryService {\n private injector = inject(Injector);\n\n get(consoleClientType: ConsoleClientType): ConsoleClientService {\n switch (consoleClientType) {\n case \"vmware\": {\n const client = this.injector.get(VmWareConsoleClientService);\n if (!client) {\n throw new Error(`Couldn't resolve instance from injector token ${VmWareConsoleClientService}`);\n }\n\n return client;\n }\n case \"vnc\": {\n const client = this.injector.get(VncConsoleClientService);\n if (!client) {\n throw new Error(`Couldn't resolve instance from injector token ${VncConsoleClientService}`);\n }\n\n return client;\n }\n default:\n throw new Error(`Console type ${consoleClientType} NYI`);\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class UuidService {\n get(): `${string}-${string}-${string}-${string}-${string}` {\n if (!crypto) {\n throw new Error(\"Failed to generate UUID: Can't resolve the `crypto` dependency in this environment.\");\n }\n\n return crypto.randomUUID();\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class FullScreenService {\n private doc = inject(DOCUMENT);\n\n private readonly _isAvailable = signal(this.doc.fullscreenEnabled);\n public readonly isAvailable = this._isAvailable.asReadonly();\n\n constructor() {\n this.doc.addEventListener(\"fullscreenchange\", () => {\n this._isAvailable.update(() => this.doc.fullscreenEnabled && !this.doc.fullscreenElement);\n });\n this.doc.addEventListener(\"fullscreenerror\", () => {\n this._isAvailable.update(() => this.doc.fullscreenEnabled && !this.doc.fullscreenElement);\n });\n }\n\n public async exitFullscreen(): Promise<void> {\n return this.doc.exitFullscreen();\n }\n\n public async tryFullscreen(element: Element): Promise<void> {\n return element.requestFullscreen({ navigationUI: \"hide\" });\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { CanvasRecordingSettings } from \"./canvas-recording-settings\";\n\nexport class CanvasRecording {\n private readonly chunks: Blob[] = [];\n private readonly mimeType: string;\n private readonly recorder: MediaRecorder;\n private readonly window: Window;\n\n private autostopTimeoutRef?: number;\n\n // Stopping is a bit tricky.\n //\n // The MediaRecorder doesn't guarantee the validity of the emitted blob until `onstop` is fired. This means that when someone\n // calls in to stop the recording, we need to create a (deferred) promise that `.onstop` can resolve when it fires successfully.\n //\n //\n // We store the promise at the class level, because we should only ever have one of them (set when .stop` is called). But we also\n // store the \"resolve\" call here, because its value is set in `.stop` but consumed in the `.onstop` event of the recorder.\n private stopPromise?: Promise<Blob>;\n private stopResolveFn?: (blob: Blob) => void;\n\n public readonly settings: CanvasRecordingSettings;\n\n constructor(settings: CanvasRecordingSettings) {\n this.settings = settings;\n this.mimeType = settings.mimeType;\n this.recorder = new MediaRecorder(settings.stream, { mimeType: settings.mimeType });\n this.window = settings.window;\n\n // pipe the output of the recorder into the local chunks array\n this.recorder.ondataavailable = ev => this.chunks.push(ev.data);\n this.recorder.onerror = (ev) => {\n throw (ev.error);\n }\n this.recorder.onstop = () => {\n // the \"resolve\" is set at the class level by the `.stop` method for access here\n if (this.stopResolveFn) {\n const blob = new Blob(this.chunks, { type: this.mimeType });\n this.stopResolveFn(blob);\n this.stopResolveFn = undefined;\n\n // the settings have an OnStop callback that should be invoked so\n // the service constructing these things can know if any are going on\n this.settings.onStopCallback();\n }\n }\n this.recorder.start(settings.chunkLength);\n\n this.autostopTimeoutRef = window.setTimeout(() => this.stop(), settings.maxDuration);\n }\n\n public stop(): Promise<Blob> {\n if (this.stopPromise) {\n // if defined, stop's already been called, so we \n // want to give back the same promise\n return this.stopPromise;\n }\n\n // clear the autotimeout if it's been set for this\n if (this.autostopTimeoutRef) {\n this.window.clearTimeout(this.autostopTimeoutRef);\n this.autostopTimeoutRef = undefined;\n }\n\n // record the stop promise we're about to send back, so we can return it to\n // anyone who calls .stop again by mistake\n this.stopPromise = new Promise(resolve => this.stopResolveFn = resolve);\n\n // stop the recorder and return\n this.recorder.stop();\n return this.stopPromise;\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport { CanvasRecording } from './canvas-recording';\nimport { WINDOW } from '../../injection/window.injection-token';\nimport { UuidService } from '../uuid.service';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\n\n@Injectable({ providedIn: 'root' })\nexport class CanvasRecorderService {\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly uuids = inject(UuidService);\n private readonly window = inject(WINDOW);\n\n private readonly activeRecordings = new Set<CanvasRecording>();\n private readonly _isRecording = signal<boolean>(false);\n public readonly isRecording = this._isRecording.asReadonly();\n\n public startRecord(canvas: HTMLCanvasElement): CanvasRecording {\n if (!this.cfConfig.enableConsoleRecord) {\n throw new Error(\"Console recording has been disabled in ConsoleForge.\");\n }\n\n const recording = new CanvasRecording({\n id: this.uuids.get(),\n stream: canvas.captureStream(this.cfConfig.canvasRecording.frameRate || 25),\n window: this.window,\n chunkLength: this.cfConfig.canvasRecording.chunkLength || 1000,\n maxDuration: this.cfConfig.canvasRecording.maxDuration || 60000,\n mimeType: this.cfConfig.canvasRecording.mimeType || \"video/webm\",\n onStopCallback: () => this.recordingStopped(recording)\n });\n\n this.activeRecordings.add(recording);\n this._isRecording.set(true);\n return recording;\n }\n\n private recordingStopped(recording: CanvasRecording) {\n this.activeRecordings.delete(recording);\n this._isRecording.set(this.activeRecordings.size > 0)\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Injectable, signal } from '@angular/core';\n\n// EXPLICITLY not provided in root - this is provided by ConsoleComponent,\n// and each should get its own\n@Injectable()\nexport class CanvasService {\n private readonly _canvas = signal<HTMLCanvasElement | null>(null);\n public readonly canvas = this._canvas.asReadonly();\n\n clearCanvas() {\n this._canvas.update(() => null);\n }\n\n setCanvas(canvas: HTMLCanvasElement) {\n this._canvas.update(() => canvas);\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class BlobDownloaderService {\n private readonly doc = inject(DOCUMENT);\n\n download(blob: Blob, fileName: string) {\n const url = URL.createObjectURL(blob);\n const a = this.doc.createElement(\"a\");\n a.href = url;\n a.download = fileName;\n a.style.display = \"none\";\n this.doc.body.appendChild(a);\n a.click();\n this.doc.body.removeChild(a);\n URL.revokeObjectURL(url); // free memory\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal, Type } from '@angular/core';\nimport { ClipboardService } from '../../services/clipboard/clipboard.service';\nimport { ConsoleClientService } from '../../services/console-clients/console-client.service';\nimport { FullScreenService } from '../../services/full-screen.service';\nimport { ConsoleToolbarContext } from '../../models/console-toolbar-context';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { ConsoleToolbarComponentBase } from '../../models/console-toolbar-component-base';\nimport { CanvasRecorderService } from '../../services/canvas-recorder/canvas-recorder.service';\nimport { LoggerService } from '../../services/logger.service';\nimport { LogLevel } from '../../models/log-level';\nimport { CanvasRecording } from '../../services/canvas-recorder/canvas-recording';\nimport { ConsolePowerRequest } from '../../models/console-power-request';\nimport { ConsoleComponentNetworkConfig } from '../../models/console-component-network-config';\nimport { UserSettingsService } from '../../services/user-settings.service';\nimport { CanvasService } from '../../services/canvas.service';\nimport { BlobDownloaderService } from '../../services/blob-downloader.service';\n\n@Component({\n selector: 'cf-console-toolbar',\n imports: [CommonModule],\n templateUrl: './console-toolbar.component.html',\n styleUrl: './console-toolbar.component.scss'\n})\nexport class ConsoleToolbarComponent {\n consoleClient = input.required<ConsoleClientService>();\n consoleNetworkConfig = input<ConsoleComponentNetworkConfig>();\n customToolbarComponent = input<Type<ConsoleToolbarComponentBase>>();\n isViewOnly = input.required<boolean>();\n\n canvasRecordingStarted = output<void>();\n canvasRecordingFinished = output<Blob>();\n ctrlAltDelSent = output<void>();\n keyboardInputSent = output<string>();\n networkConnectionRequested = output<string>();\n networkDisconnectRequested = output<void>();\n powerRequestSent = output<ConsolePowerRequest>();\n screenshotCopied = output<Blob>();\n toggleFullscreen = output<void>();\n\n private readonly blobDownloader = inject(BlobDownloaderService);\n private readonly canvas = inject(CanvasService);\n private readonly canvasRecorder = inject(CanvasRecorderService);\n private readonly clipboardService = inject(ClipboardService);\n private readonly config = inject(ConsoleForgeConfig);\n private readonly logger = inject(LoggerService);\n private readonly userSettings = inject(UserSettingsService);\n\n // component state\n private readonly activeConsoleRecording = signal<CanvasRecording | undefined>(undefined);\n protected readonly toolbarComponentContext: ConsoleToolbarContext;\n protected readonly toolbarComponent = computed(() => this.customToolbarComponent() || this.config.toolbar.component);\n\n constructor() {\n this.toolbarComponentContext = {\n clipboard: {\n consoleClipboardText: computed(() => this.consoleClient()?.consoleClipboardUpdated()),\n sendTextToConsoleClipboard: this.handleSendTextToClipboard.bind(this)\n },\n console: {\n copyScreenshot: this.handleCopyScreenshot.bind(this),\n recordScreenStart: this.handleRecordScreenStart.bind(this),\n recordScreenStop: this.handleRecordScreenStop.bind(this),\n sendCtrlAltDel: this.handleSendCtrlAltDelete.bind(this),\n sendKeyboardInput: this.handleKeyboardInputSend.bind(this),\n sendPowerRequest: this.handleSendPowerRequest.bind(this),\n supportedFeatures: computed(() => this.consoleClient()?.supportedFeatures() || {}),\n toggleFullscreen: this.handleFullscreen.bind(this)\n },\n networks: {\n config: this.consoleNetworkConfig,\n connectionRequested: this.handleNetworkConnectionRequest.bind(this),\n disconnectRequested: () => this.networkDisconnectRequested.emit(),\n },\n state: {\n activeConsoleRecording: computed(() => this.activeConsoleRecording()),\n isConnected: computed(() => this.consoleClient() && this.consoleClient().connectionStatus() === \"connected\"),\n isFullscreenAvailable: inject(FullScreenService).isAvailable,\n isRecordingAvailable: computed(() => !!this.canvas.canvas()),\n isViewOnly: this.isViewOnly\n },\n userSettings: this.userSettings\n };\n }\n\n protected async handleCopyScreenshot() {\n if (!this.canvas.canvas()) {\n throw new Error(\"Couldn't resolve the canvas; can't copy screenshot.\");\n }\n\n this.canvas.canvas()!.toBlob(blob => {\n if (!blob) {\n throw new Error(\"Couldn't resolve canvas blob.\");\n }\n\n this.clipboardService.copyBlob(blob);\n this.screenshotCopied.emit(blob);\n })\n }\n\n protected handleFullscreen(): Promise<void> {\n this.toggleFullscreen.emit();\n return Promise.resolve();\n }\n\n protected async handleKeyboardInputSend(text: string): Promise<void> {\n await this.consoleClient().sendKeyboardInput(text);\n this.keyboardInputSent.emit(text);\n }\n\n protected handleNetworkConnectionRequest(networkName: string) {\n const availableNetworks = this.consoleNetworkConfig()?.available || [];\n if (availableNetworks.indexOf(networkName) === -1) {\n throw new Error(`Network ${networkName} is not available to this console.`);\n }\n\n this.networkConnectionRequested.emit(networkName);\n }\n\n protected handleRecordScreenStart(): void {\n if (!this.canvas.canvas()) {\n throw new Error(\"Can't resolve canvas for recording\");\n }\n\n this.logger.log(LogLevel.DEBUG, \"Recording canvas\", this.canvas.canvas());\n const recordingInstance = this.canvasRecorder.startRecord(this.canvas.canvas()!);\n this.activeConsoleRecording.update(() => recordingInstance);\n this.canvasRecordingStarted.emit();\n }\n\n protected async handleRecordScreenStop(): Promise<Blob> {\n if (!this.activeConsoleRecording()) {\n throw new Error(\"There is no active console recording - unable to stop and emit recorded data.\");\n }\n\n this.logger.log(LogLevel.DEBUG, \"Recording stopped.\");\n const recording = await this.activeConsoleRecording()!.stop();\n this.activeConsoleRecording.update(() => undefined);\n\n // if configured, automatically offer a download\n if (recording && this.config.canvasRecording.autoDownloadCompletedRecordings) {\n this.blobDownloader.download(recording, \"your-console-recording.webm\");\n }\n\n this.canvasRecordingFinished.emit(recording);\n this.logger.log(LogLevel.DEBUG, \"Recording emitted.\");\n return recording;\n }\n\n protected handleSendCtrlAltDelete() {\n this.consoleClient().sendCtrlAltDelete();\n this.ctrlAltDelSent.emit();\n return Promise.resolve();\n }\n\n private async handleSendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n this.consoleClient().sendPowerRequest(request);\n this.powerRequestSent.emit(request);\n return Promise.resolve();\n }\n\n protected async handleSendTextToClipboard(text: string) {\n if (text) {\n this.consoleClient().sendClipboardText(text);\n }\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n@if (toolbarComponent()) {\n<ng-container *ngComponentOutlet=\"toolbarComponent()!; inputs: { 'consoleContext': toolbarComponentContext }\" />\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable } from '@angular/core';\nimport { WINDOW } from '../../injection/window.injection-token';\nimport { SendBrowserNotificationArgs } from './send-browser-notification';\nimport { LoggerService } from '../logger.service';\nimport { LogLevel } from '../../models/log-level';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\n\n@Injectable({ providedIn: 'root' })\nexport class BrowserNotificationsService {\n private config = inject(ConsoleForgeConfig);\n private logger = inject(LoggerService);\n private window = inject(WINDOW);\n\n public async send(args: SendBrowserNotificationArgs): Promise<void> {\n if (!this.config.showBrowserNotificationsOnConsoleEvents) {\n return;\n }\n\n const hasBrowserPermission = await Notification.requestPermission();\n if (hasBrowserPermission == \"denied\") {\n this.logger.log(LogLevel.WARNING, \"Can't send notification - browser permission denied.\", args);\n }\n\n const notification = new Notification(args.title, {\n body: args.body,\n tag: args.tag,\n });\n\n this.logger.log(LogLevel.DEBUG, \"Send browser notification\", notification);\n if (args.href?.url) {\n notification.onclick = (ev) => {\n ev.preventDefault();\n this.window.open(args.href?.url, args.href?.target);\n }\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { AfterViewInit, Component, ElementRef, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { ConsoleConnectionStatus } from '../../models/console-connection-status';\nimport { PicoCssService } from '../../services/pico-css.service';\n\n@Component({\n selector: 'cf-console-status',\n templateUrl: './console-status.component.html',\n styleUrl: './console-status.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ConsoleStatusComponent implements AfterViewInit {\n status = input<ConsoleConnectionStatus | undefined>(\"disconnected\");\n reconnectRequest = output<void>();\n\n private readonly picoCssService = inject(PicoCssService);\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n\n async ngAfterViewInit(): Promise<void> {\n // apply pico to the progress bar\n const sheet = await this.picoCssService.loadStyleSheet();\n\n if (this.hostElement.nativeElement.shadowRoot) {\n this.hostElement.nativeElement.shadowRoot.adoptedStyleSheets = [sheet];\n }\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n<div>\n @if (status() === \"connecting\") {\n <progress></progress>\n }\n @else if(!status() || status() == \"disconnected\") {\n <div class=\"disconnected-banner\" (click)=\"reconnectRequest.emit()\">\n Console disconnected\n </div>\n }\n</div>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { Component, computed, effect, ElementRef, inject, input, OnDestroy, output, signal, Type, untracked, viewChild } from '@angular/core';\nimport { ConsoleComponentConfig } from '../../models/console-component-config';\nimport { ConsoleClientService } from '../../services/console-clients/console-client.service';\nimport { ConsoleClientFactoryService } from '../../services/console-clients/console-client-factory.service';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { getTextFromClipboardItem } from \"../../services/clipboard/clipboard.helpers\";\nimport { UuidService } from '../../services/uuid.service';\nimport { LoggerService } from '../../services/logger.service';\nimport { FullScreenService } from '../../services/full-screen.service';\nimport { LogLevel } from '../../models/log-level';\nimport { ConsoleToolbarComponent } from '../console-toolbar/console-toolbar.component';\nimport { ConsoleToolbarComponentBase } from '../../models/console-toolbar-component-base';\nimport { BrowserNotificationsService } from '../../services/browser-notifications/browser-notifications.service';\nimport { ConsoleStatusComponent } from '../console-status/console-status.component';\nimport { UserSettingsService } from '../../services/user-settings.service';\nimport { ConsolePowerRequest } from '../../models/console-power-request';\nimport { CanvasRecorderService } from '../../services/canvas-recorder/canvas-recorder.service';\nimport { ClipboardService } from '../../services/clipboard/clipboard.service';\nimport { ConsoleComponentNetworkConfig } from '../../models/console-component-network-config';\nimport { CanvasService } from '../../services/canvas.service';\nimport { ConsoleConnectionStatus } from '../../models/console-connection-status';\n\n@Component({\n selector: 'cf-console',\n standalone: true,\n imports: [\n ConsoleStatusComponent,\n ConsoleToolbarComponent\n ],\n providers: [\n // the console component has access to the canvas which is injected by \n CanvasService\n ],\n styleUrl: './console.component.scss',\n templateUrl: './console.component.html',\n})\nexport class ConsoleComponent implements OnDestroy {\n // component I/O\n autoConnect = input(true);\n config = input.required<ConsoleComponentConfig>();\n isViewOnly = input(false);\n networkConfig = input<ConsoleComponentNetworkConfig>();\n toolbarComponent = input<Type<ConsoleToolbarComponentBase>>();\n toolbarDisabled = input<boolean>(false);\n\n connectionStatusChanged = output<ConsoleConnectionStatus | undefined>();\n consoleClipboardUpdated = output<string>();\n consoleRecorded = output<Blob>();\n ctrlAltDelSent = output<void>();\n localClipboardUpdated = output<ClipboardItem>();\n networkConnectionRequested = output<string>();\n networkDisconnectRequested = output<void>();\n powerRequestSent = output<ConsolePowerRequest>();\n reconnectRequest = output<ConsoleComponentConfig>();\n screenshotCopied = output<Blob>();\n\n // services\n private readonly browserNotifications = inject(BrowserNotificationsService);\n private readonly canvasService = inject(CanvasService);\n private readonly clipboardService = inject(ClipboardService);\n private readonly consoleClientFactory = inject(ConsoleClientFactoryService);\n private readonly consoleForgeConfig = inject(ConsoleForgeConfig);\n private readonly document = inject(DOCUMENT);\n private readonly fullscreen = inject(FullScreenService);\n private readonly logger = inject(LoggerService);\n private readonly userSettingsService = inject(UserSettingsService);\n private readonly uuids = inject(UuidService);\n\n // viewkids\n protected readonly componentContainer = viewChild.required<ElementRef<HTMLElement>>(\"componentContainer\");\n protected readonly consoleHostElement = viewChild.required<ElementRef<HTMLElement>>(\"consoleHost\");\n\n // other component state\n protected readonly consoleClient = signal<ConsoleClientService | undefined>(undefined);\n protected readonly consoleHostElementId = `cf-console-${this.uuids.get()}`;\n protected readonly isRecording = inject(CanvasRecorderService).isRecording;\n protected readonly toolbarEnabled = computed(() => {\n // toolbar is enabled if it hasn't been disabled locally or globally:\n return !(this.toolbarDisabled() || this.consoleForgeConfig.toolbar.disabled) &&\n // AND if a toolbar component has been specified either here or globally\n (this.toolbarComponent() || this.consoleForgeConfig.toolbar.component);\n });\n protected readonly userSettings = this.userSettingsService.settings;\n\n constructor() {\n // we need this component to emit from outputs or call the client when signals change, so an effect\n // is the recommended solution: https://github.com/angular/angular/issues/57208\n\n // when config is provided and autoconnect is on, attempt to automatically connect\n effect(() => {\n if (this.autoConnect() && this.config() && !this.consoleClient()) {\n this.logger.log(LogLevel.DEBUG, \"Autoconnect firing\", this.config());\n this.connect(this.config());\n }\n });\n\n // clipboard events\n effect(() => {\n if (this.consoleClient()) {\n this.consoleClipboardUpdated.emit(this.consoleClient()!.consoleClipboardUpdated());\n }\n });\n effect(() => {\n const clipboardItem = this.clipboardService.localClipboardContentWritten();\n\n if (clipboardItem) {\n this.localClipboardUpdated.emit(clipboardItem);\n getTextFromClipboardItem(clipboardItem).then(value => {\n if (value) {\n this.browserNotifications.send({ title: \"Copied to local clipboard\", body: value });\n }\n })\n }\n });\n effect(() => {\n // all supported console clients inject a canvas into the doc. We provide it to the canvas service so it\n // can be consumed by other components (e.g. the ConsoleToolbarComponent and its implementations)\n if (this.document && this.consoleClient() && this.consoleClient()!.connectionStatus() === \"connected\") {\n const canvas = this.resolveConsoleCanvas();\n if (canvas) {\n this.canvasService.setCanvas(canvas);\n } else {\n this.canvasService.clearCanvas();\n }\n }\n });\n\n // input changes\n effect(() => {\n if (this.consoleClient() && this.consoleClient()!.connectionStatus() === \"connected\") {\n this.consoleClient()!.setIsViewOnly(this.isViewOnly());\n\n // if view only mode is on, we need to flip the canvas's tab index\n if (!this.consoleClient()?.supportedFeatures().viewOnlyMode) {\n const canvas = this.canvasService.canvas();\n if (canvas) {\n canvas.tabIndex = this.isViewOnly() ? -1 : 0;\n }\n }\n }\n });\n\n // output emitters\n effect(() => {\n this.connectionStatusChanged.emit(this.consoleClient()?.connectionStatus());\n });\n\n // settings changes\n effect(() => {\n const currentSettings = this.userSettingsService.settings();\n if (this.consoleClient() && this.consoleClient()?.connectionStatus() === \"connected\") {\n this.consoleClient()!.setPreserveAspectRatioOnScale(currentSettings.console.preserveAspectRatioOnScale);\n }\n });\n }\n\n public async ngOnDestroy(): Promise<void> {\n if (this.consoleClient()) {\n await this.consoleClient()!.dispose();\n }\n }\n\n protected handleConsoleRecordingStarted(): Promise<void> {\n return this.browserNotifications.send({ title: \"Recording Console\", body: \"This console is being screen-recorded. Hit \\\"Record\\\" again to stop.\" })\n }\n\n protected async handleCtrlAltDelSent(): Promise<void> {\n this.ctrlAltDelSent.emit();\n await this.browserNotifications.send({ title: \"Ctrl + Alt + Del sent\", body: \"Sent a Ctrl + Alt + Del input to the remote machine.\" });\n }\n\n protected async handleFullscreen(): Promise<void> {\n if (!this.componentContainer()) {\n throw new Error(\"Can't manipulate fullscreen - can't find the host.\");\n }\n\n if (!this.fullscreen.isAvailable()) {\n await this.fullscreen.exitFullscreen();\n }\n else {\n await this.fullscreen.tryFullscreen(this.componentContainer().nativeElement);\n }\n }\n\n protected async handleScreenshotCopied(screenshotData: Blob): Promise<Blob> {\n this.screenshotCopied.emit(screenshotData);\n await this.browserNotifications.send({ title: \"Screenshot copied\", body: \"A screenshot of this console has been copied to your clipboard.\" })\n return screenshotData;\n }\n\n // automatically invoked if autoConnect is on, but can also be manually invoked outside the component\n // if retrieved as a ViewChild or whatever\n // NOTE: we should really clean up this function and ensure that all signals it needs are passed to it as parameters. it's a little opaque,\n // but invoking this inside an effect above will cause it to happen whenever _any_ of its read effects change, and it reads a lot of them.\n public async connect(config: ConsoleComponentConfig) {\n this.logger.log(LogLevel.DEBUG, \"Connecting with config\", config);\n\n const currentConnectionStatus = untracked(() => this.consoleClient()?.connectionStatus());\n if (currentConnectionStatus !== undefined && currentConnectionStatus !== \"disconnected\") {\n await this.consoleClient()?.disconnect();\n }\n\n if (!config.url) {\n throw new Error(\"No url provided for console connection.\");\n }\n\n if (!this.consoleHostElement().nativeElement) {\n throw new Error(\"Couldn't resolve the console host before connection.\");\n }\n\n // resolve the console type from component settings + defaults\n const clientType = this.consoleForgeConfig.defaultConsoleClientType || config.consoleClientType;\n if (!clientType) {\n throw new Error(\"Couldn't resolve the console client type. Did you specify a default using provideConsoleForgeConfig or pass a console type to this component?\");\n }\n\n const client = this.consoleClientFactory.get(clientType);\n this.consoleClient.update(() => client);\n\n // connect\n this.consoleClient()!.connect(config.url, {\n autoFocusOnConnect: config.autoFocusOnConnect,\n credentials: config.credentials,\n hostElement: this.consoleHostElement().nativeElement,\n });\n }\n\n public async disconnect() {\n this.logger.log(LogLevel.DEBUG, \"Console component disconnect invoked.\");\n await this.consoleClient()?.disconnect();\n this.consoleClient.update(() => undefined);\n }\n\n private resolveConsoleCanvas() {\n if (!this.document) {\n return null;\n }\n\n return (this.document.querySelector(`#${this.consoleHostElementId} canvas`) as HTMLCanvasElement) || undefined;\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n<div #componentContainer class=\"console-component flex\"\n [class.console-client-type-vnc]=\"consoleClient()?.clientType == 'vnc'\"\n [class.console-client-type-vmware]=\"consoleClient()?.clientType == 'vmware'\"\n [class.flex-column]=\"userSettings().toolbar.dockTo === 'top' || userSettings().toolbar.dockTo === 'bottom'\">\n\n @if (toolbarEnabled()) {\n <cf-console-toolbar\n [class.flex-order-1]=\"userSettings().toolbar.dockTo === 'right' || userSettings().toolbar.dockTo === 'bottom'\"\n [consoleClient]=\"consoleClient()!\" [consoleNetworkConfig]=\"networkConfig()\" [isViewOnly]=\"isViewOnly()\"\n (canvasRecordingFinished)=\"consoleRecorded.emit($event)\"\n (canvasRecordingStarted)=\"handleConsoleRecordingStarted()\" [customToolbarComponent]=\"toolbarComponent()\"\n (ctrlAltDelSent)=\"handleCtrlAltDelSent()\" (networkConnectionRequested)=\"networkConnectionRequested.emit($event)\"\n (powerRequestSent)=\"powerRequestSent.emit($event)\"\n (networkDisconnectRequested)=\"networkDisconnectRequested.emit()\"\n (screenshotCopied)=\"handleScreenshotCopied($event)\"\n (toggleFullscreen)=\"handleFullscreen()\"></cf-console-toolbar>\n }\n\n <div class=\"console-host-container\"\n [class.flex-order-0]=\"userSettings().toolbar.dockTo === 'right' || userSettings().toolbar.dockTo === 'bottom'\">\n <cf-console-status [status]=\"consoleClient()?.connectionStatus()\"\n (reconnectRequest)=\"reconnectRequest.emit(this.config())\"></cf-console-status>\n\n <div #consoleHost [id]=\"consoleHostElementId\" class=\"console-host\" [class.recording]=\"isRecording()\"\n [class.view-only]=\"isViewOnly()\">\n </div>\n </div>\n</div>\n","import { Component, computed, effect, ElementRef, inject, input, output, viewChild } from '@angular/core';\nimport { ConsoleStatusComponent } from '../console-status/console-status.component';\nimport { ConsoleComponentConfig } from '../../models/console-component-config';\nimport { ConsoleClientService } from '../../services/console-clients/console-client.service';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { ConsoleClientFactoryService } from '../../services/console-clients/console-client-factory.service';\nimport { UuidService } from '../../services/uuid.service';\n\n@Component({\n selector: 'cf-console-tile',\n imports: [\n ConsoleStatusComponent\n ],\n templateUrl: './console-tile.component.html',\n styleUrl: './console-tile.component.scss'\n})\nexport class ConsoleTileComponent {\n public config = input<ConsoleComponentConfig>();\n public reconnectRequest = output<ConsoleComponentConfig | undefined>();\n\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly consoleClientFactory = inject(ConsoleClientFactoryService);\n private readonly consoleClientType = computed(() => this.config()?.consoleClientType || this.cfConfig.defaultConsoleClientType);\n private readonly consoleHostElement = viewChild<ElementRef<HTMLElement>>(\"consoleHost\");\n private readonly uuids = inject(UuidService);\n\n protected consoleClient?: ConsoleClientService;\n\n // even though nothing here explicitly references this, every console host element needs an ID\n // because the vmware client relies on the ID, not the element reference, to create its canvas\n protected consoleHostElementId = \"console-host-tile-\" + this.uuids.get();\n\n constructor() {\n effect(() => {\n if (this.config() && this.consoleHostElement() && !this.consoleClient) {\n this.connect(this.consoleHostElement()!.nativeElement);\n }\n });\n }\n\n private async connect(hostElement: HTMLElement) {\n const connectionConfig = this.config()!;\n\n if (!connectionConfig.url) {\n throw new Error(\"No url provided for console connection.\");\n }\n\n if (!hostElement) {\n throw new Error(\"Couldn't resolve the console host before connection.\");\n }\n\n this.consoleClient = this.consoleClientFactory.get(this.consoleClientType()!);\n await this.consoleClient.connect(connectionConfig.url, {\n autoFocusOnConnect: false,\n credentials: connectionConfig.credentials,\n hostElement: hostElement\n });\n\n this.consoleClient.setIsViewOnly(true);\n }\n}\n","<div class=\"console-tile-component\">\n <cf-console-status [status]=\"consoleClient?.connectionStatus()\"\n (reconnectRequest)=\"reconnectRequest.emit(this.config())\"></cf-console-status>\n\n <div #consoleHost [id]=\"consoleHostElementId\" class=\"console-host\">\n </div>\n</div>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { ConsoleCredentials } from \"./console-credentials\";\nimport { ConsoleClientType } from \"./console-client-type\";\n\nexport interface ConsoleComponentConfig {\n /**\n * If true, the client will attempt to set control focus on the console session after connection. Defaults to false.\n */\n autoFocusOnConnect?: boolean;\n\n /**\n * Specifies the client that will be used to connect to the console (e.g. VNC, VMWare WMKS, etc.) Note that\n * you can configure a default for all ConsoleForge consoles in your app or module by using the `provideConsoleForgeConfig`\n * provider.\n */\n consoleClientType?: ConsoleClientType;\n\n /**\n * An optional identifier for this console. ConsoleForge doesn't use this value internally at all, but some of its events\n * (e.g. reconnect requests) will return this configuration to you. You may want to set this identifier to something that allows\n * you to uniquely identify the console so you can handle its events as desired.\n */\n consoleId?: string;\n\n /**\n * An optional username, password, or sessionId to use to authenticate to the console. Configuration here is specific\n * to the protocol being used and the configuration of the target virtual console. See ConsoleForge's documentation\n * for details.\n */\n credentials?: ConsoleCredentials;\n\n /**\n * The URL of the console's accessible web socket interface.\n */\n url: string;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\nimport { ConsoleForgeConfig, defaultCfConfig } from \"./console-forge-config\";\nimport { ClipboardService } from \"../services/clipboard/clipboard.service\";\nimport { ConsoleClientFactoryService } from \"../services/console-clients/console-client-factory.service\";\nimport { FullScreenService } from \"../services/full-screen.service\";\nimport { LoggerService } from \"../services/logger.service\";\nimport { UserSettingsService } from \"../services/user-settings.service\";\nimport { UuidService } from \"../services/uuid.service\";\nimport { deepMerge, DeepPartial } from \"../services/object.helpers\";\nimport { BlobDownloaderService } from \"../services/blob-downloader.service\";\n\nexport function provideConsoleForge(config?: DeepPartial<ConsoleForgeConfig>): EnvironmentProviders {\n // merge provided with defaults\n const finalConfig = config ? deepMerge(defaultCfConfig, config) : defaultCfConfig;\n\n // provide to the env\n return makeEnvironmentProviders([\n { provide: BlobDownloaderService },\n { provide: ClipboardService },\n { provide: ConsoleClientFactoryService },\n { provide: FullScreenService },\n { provide: LoggerService },\n { provide: UserSettingsService },\n { provide: UuidService },\n {\n provide: ConsoleForgeConfig,\n useValue: finalConfig\n },\n ]);\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsoleClientType = \"vmware\" | \"vnc\";\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { ConsoleCredentials } from \"./console-credentials\";\n\nexport interface ConsoleConnectionOptions {\n autoFocusOnConnect?: boolean;\n backgroundStyle?: string;\n credentials?: ConsoleCredentials;\n hostElement: HTMLElement;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsoleConnectionStatus = \"connected\" | \"connecting\" | \"disconnected\";\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport interface ConsoleCredentials {\n accessTicket?: string;\n password?: string;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport interface ConsoleComponentNetworkConfig {\n available: string[];\n current?: string;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsolePowerRequest = \"reboot\" | \"rebootHard\" | \"shutdown\"\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport interface ConsoleSupportedFeatures {\n /**\n * This is basically a stupid kludge that is only here because VMWare's client has a very weird implementation of \"copy\".\n * \n * The VMWare \"WMKS\" client only emits clipboard events after the remote console's clipboard receives new data (i.e. you copy some content on the remote desktop)\n * AND after the console canvas loses focus. That is, no matter how much copying you do, the client doesn't know about until the canvas housing the console\n * is blurred. \n * \n * The downstream effect of this that, unlike with other protocols, we can't gracefully emit events when copies happen or automatically copy to your local\n * clipboard in a reasonable way, because we can't know when the remote copy happened and if you really want it copied to your local CB or not. So when this\n * flag is set to false (VMWare is the only service which does this), we show a panel in the default toolbar that you can manually copy content from and\n * automatically receives the last \"copy\" event from the console.\n * \n * Yuck.\n */\n clipboardAutomaticLocalCopy: boolean;\n\n /**\n * Indicates whether the remote console protocol allows us to write content directly to the clipboard of the remote machine. \n */\n clipboardRemoteWrite: boolean;\n\n /**\n * Indicates whether there remote console offers an on-screen keyboard. (Hint: probably not. As far as we know, VMWare's WMKS is the only one that will do this.)\n */\n onScreenKeyboard: boolean;\n\n /**\n * Indicates whether the remote console protocol allows us to issue power requests (like restart, reboot, and hard reboot). This is typically a configuration detail\n * of the machine, so we usually have to rely on the protocol-specific service to tell us whether the feature is enabled (see our VNC client, wrapping noVnc, for an example)\n */\n powerManagement: boolean;\n\n /**\n * Whether the remote console protocol/library supports a \"view/read\"-only canvas. If it doesn't, we have to do some CSS/JS hacking in the console component, so \n * we prefer the client lib/protocol's implementation if we can get it.\n */\n viewOnlyMode: boolean;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsoleToolbarPosition = \"left\" | \"right\" | \"top\" | \"bottom\";\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { InputSignal } from \"@angular/core\";\nimport { ConsoleToolbarContext } from \"../models/console-toolbar-context\";\n\nexport interface ConsoleToolbarComponentBase {\n consoleContext: InputSignal<ConsoleToolbarContext>;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Signal } from \"@angular/core\";\nimport { CanvasRecording } from \"../services/canvas-recorder/canvas-recording\";\nimport { ConsolePowerRequest } from \"./console-power-request\";\nimport { ConsoleSupportedFeatures } from \"./console-supported-features\";\nimport { ConsoleComponentNetworkConfig } from \"./console-component-network-config\";\nimport { UserSettingsService } from \"../services/user-settings.service\";\n\nexport interface ConsoleToolbarContext {\n clipboard: {\n consoleClipboardText: Signal<string>;\n sendTextToConsoleClipboard(text: string): Promise<void>;\n };\n console: {\n copyScreenshot(): Promise<void>;\n recordScreenStart(): void;\n recordScreenStop(): Promise<Blob>;\n sendCtrlAltDel(): Promise<void>;\n sendKeyboardInput(text: string): Promise<void>;\n sendPowerRequest(request: ConsolePowerRequest): Promise<void>;\n supportedFeatures: Signal<ConsoleSupportedFeatures>;\n toggleFullscreen(): Promise<void>;\n };\n networks: {\n config: Signal<ConsoleComponentNetworkConfig | undefined>;\n connectionRequested(networkName: string): void;\n disconnectRequested(): void;\n };\n state: {\n activeConsoleRecording: Signal<CanvasRecording | undefined>;\n isConnected: Signal<boolean>;\n isFullscreenAvailable: Signal<boolean>;\n isRecordingAvailable: Signal<boolean>;\n isViewOnly: Signal<boolean>;\n };\n userSettings: UserSettingsService;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\n/*\n * Public API Surface of console-forge\n */\nexport * from \"./lib/components/console/console.component\";\nexport * from \"./lib/components/console-tile/console-tile.component\";\nexport * from \"./lib/models/console-component-config\";\nexport * from \"./lib/directives/class-on-hover.directive\";\n\n// config\nexport * from \"./lib/config/provide-console-forge\";\n\n// models\nexport * from \"./lib/models/console-client-type\";\nexport * from \"./lib/models/console-connection-options\";\nexport * from \"./lib/models/console-connection-status\";\nexport * from \"./lib/models/console-credentials\";\nexport * from \"./lib/models/console-component-network-config\";\nexport * from \"./lib/models/console-power-request\";\nexport * from \"./lib/models/console-supported-features\";\nexport * from \"./lib/models/console-toolbar-position\";\nexport * from \"./lib/models/console-toolbar-component-base\";\nexport * from \"./lib/models/console-toolbar-context\";\nexport * from \"./lib/models/log-level\";\n\n// services\nexport * from \"./lib/services/user-settings.service\";\n\n// helpers\nexport * from \"./lib/services/clipboard/clipboard.helpers\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}
1
+ {"version":3,"file":"cmusei-console-forge.mjs","sources":["../../../projects/console-forge/src/lib/models/log-level.ts","../../../projects/console-forge/src/lib/directives/class-on-hover.directive.ts","../../../projects/console-forge/src/lib/services/pico-css.service.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default-button/console-toolbar-default-button.component.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default-button/console-toolbar-default-button.component.html","../../../projects/console-forge/src/lib/injection/window.injection-token.ts","../../../projects/console-forge/src/lib/services/object.helpers.ts","../../../projects/console-forge/src/lib/services/logger.service.ts","../../../projects/console-forge/src/lib/services/user-settings.service.ts","../../../projects/console-forge/src/lib/services/clipboard/clipboard.helpers.ts","../../../projects/console-forge/src/lib/services/clipboard/clipboard.service.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default.component.ts","../../../projects/console-forge/src/lib/components/console-toolbar-default/console-toolbar-default.component.html","../../../projects/console-forge/src/lib/config/console-forge-config.ts","../../../projects/console-forge/src/lib/services/console-clients/vnc-console-client/vnc-console-client.service.ts","../../../projects/console-forge/src/lib/shims/vmware-wmks.shim.ts","../../../projects/console-forge/src/lib/shims/vmware-mks.models.ts","../../../projects/console-forge/src/lib/services/console-clients/vmware/vmware-console-client.service.ts","../../../projects/console-forge/src/lib/services/console-clients/console-client-factory.service.ts","../../../projects/console-forge/src/lib/services/uuid.service.ts","../../../projects/console-forge/src/lib/services/full-screen.service.ts","../../../projects/console-forge/src/lib/services/canvas-recorder/canvas-recording.ts","../../../projects/console-forge/src/lib/services/canvas-recorder/canvas-recorder.service.ts","../../../projects/console-forge/src/lib/services/canvas.service.ts","../../../projects/console-forge/src/lib/services/blob-downloader.service.ts","../../../projects/console-forge/src/lib/components/console-toolbar/console-toolbar.component.ts","../../../projects/console-forge/src/lib/components/console-toolbar/console-toolbar.component.html","../../../projects/console-forge/src/lib/services/browser-notifications/browser-notifications.service.ts","../../../projects/console-forge/src/lib/components/console-status/console-status.component.ts","../../../projects/console-forge/src/lib/components/console-status/console-status.component.html","../../../projects/console-forge/src/lib/components/console/console.component.ts","../../../projects/console-forge/src/lib/components/console/console.component.html","../../../projects/console-forge/src/lib/components/console-tile/console-tile.component.ts","../../../projects/console-forge/src/lib/components/console-tile/console-tile.component.html","../../../projects/console-forge/src/lib/models/console-component-config.ts","../../../projects/console-forge/src/lib/config/provide-console-forge.ts","../../../projects/console-forge/src/lib/models/console-client-type.ts","../../../projects/console-forge/src/lib/models/console-connection-options.ts","../../../projects/console-forge/src/lib/models/console-connection-status.ts","../../../projects/console-forge/src/lib/models/console-credentials.ts","../../../projects/console-forge/src/lib/models/console-component-network-config.ts","../../../projects/console-forge/src/lib/models/console-power-request.ts","../../../projects/console-forge/src/lib/models/console-supported-features.ts","../../../projects/console-forge/src/lib/models/console-toolbar-position.ts","../../../projects/console-forge/src/lib/models/console-toolbar-component-base.ts","../../../projects/console-forge/src/lib/models/console-toolbar-context.ts","../../../projects/console-forge/src/public-api.ts","../../../projects/console-forge/src/cmusei-console-forge.ts"],"sourcesContent":["// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport enum LogLevel {\n DEBUG = 0,\n INFO = 1,\n WARNING = 2,\n ERROR = 3\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Directive, ElementRef, HostListener, inject, input } from '@angular/core';\n\n@Directive({ selector: '[cfClassOnHover]' })\nexport class ClassOnHoverDirective {\n applyClasses = input.required<string>();\n directiveHost = inject(ElementRef);\n\n @HostListener(\"mouseenter\")\n protected handleMouseEnter() {\n if (this.directiveHost?.nativeElement) {\n this.directiveHost.nativeElement.classList.add(this.applyClasses());\n }\n }\n\n @HostListener(\"mouseleave\")\n protected handleMouseLeave() {\n if (this.directiveHost?.nativeElement) {\n this.directiveHost.nativeElement.classList.remove(this.applyClasses());\n }\n }\n}\n","import { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class PicoCssService {\n private sheet?: CSSStyleSheet;\n private loading?: Promise<void>;\n\n loadStyleSheet(): Promise<CSSStyleSheet | undefined> {\n if (this.sheet) return Promise.resolve(this.sheet);\n\n if (!this.loading) {\n this.loading = fetch('assets/pico.min.css')\n .then(r => r.text())\n .then(css => {\n const sheet = new CSSStyleSheet();\n sheet.replaceSync(css);\n this.sheet = sheet;\n });\n }\n\n return this.loading.then(() => this.sheet);\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { AfterViewInit, Component, ElementRef, inject, input, output } from '@angular/core';\nimport { ClassOnHoverDirective } from '../../../directives/class-on-hover.directive';\nimport { PicoCssService } from '../../../services/pico-css.service';\n\n@Component({\n selector: 'cf-console-toolbar-default-button',\n imports: [ClassOnHoverDirective],\n templateUrl: './console-toolbar-default-button.component.html',\n styleUrl: './console-toolbar-default-button.component.scss'\n})\nexport class ConsoleToolbarDefaultButtonComponent implements AfterViewInit {\n public clicked = output<void>();\n public disabled = input(false);\n public label = input<string>();\n public isOngoing = input(false);\n\n private readonly picoCssService = inject(PicoCssService);\n private readonly hostElement = inject(ElementRef<HTMLElement>)\n\n async ngAfterViewInit(): Promise<void> {\n const sheet = await this.picoCssService.loadStyleSheet();\n\n if (this.hostElement.nativeElement.shadowRoot) {\n this.hostElement.nativeElement.shadowRoot.adoptedStyleSheets = [sheet];\n }\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n<div class=\"svg-button\" cfClassOnHover applyClasses=\"hovered\" [ariaDisabled]=\"disabled()\"\n [class.cursor-pointer]=\"!disabled()\" [class.disabled]=\"disabled()\" [class.ongoing]=\"isOngoing()\"\n (click)=\"!disabled() && clicked.emit()\">\n <div class=\"svg-container\">\n <ng-content></ng-content>\n </div>\n\n @if (label()) {\n <div class=\"button-label\">{{ label() }}</div>\n }\n</div>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { InjectionToken } from \"@angular/core\";\n\nexport const WINDOW = new InjectionToken<Window>(\"Global window\", { factory: () => window });\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type DeepPartial<T> = {\n [P in keyof T]?: T[P] extends object ? DeepPartial<T[P]> : T[P];\n};\n\nexport function deepMerge<T>(target: T, patch: DeepPartial<T>): T {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const result: any = { ...target };\n for (const key in patch) {\n const patchValue = patch[key];\n const targetValue = target[key];\n if (\n patchValue &&\n typeof patchValue === 'object' &&\n !Array.isArray(patchValue) &&\n typeof targetValue === 'object'\n ) {\n result[key] = deepMerge(targetValue, patchValue);\n } else {\n result[key] = patchValue;\n }\n }\n return result;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable } from '@angular/core';\nimport { LogLevel } from '../models/log-level';\nimport { ConsoleForgeConfig } from '../config/console-forge-config';\n\n@Injectable({ providedIn: 'root' })\nexport class LoggerService {\n private libConfig = inject(ConsoleForgeConfig);\n\n // allow `any` here to mirror standard console.log behavior\n /* eslint-disable @typescript-eslint/no-explicit-any */\n log(logLevel: LogLevel, message: string, ...addl: any[]): void {\n const loggingFunction = this.resolveLoggingFunction(logLevel);\n\n if (logLevel >= this.libConfig.logThreshold) {\n loggingFunction(`ConsoleForge (${LogLevel[logLevel]}): ${message}`, ...addl);\n }\n }\n\n private resolveLoggingFunction(logLevel: LogLevel) {\n switch (logLevel) {\n case LogLevel.ERROR:\n return console.error;\n case LogLevel.WARNING:\n return console.warn;\n case LogLevel.INFO:\n return console.info;\n case LogLevel.DEBUG:\n return console.debug;\n default:\n return console.log;\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { effect, inject, Injectable, signal } from '@angular/core';\nimport { ConsoleUserSettings } from '../models/console-user-settings';\nimport { WINDOW } from '../injection/window.injection-token';\nimport { deepMerge, DeepPartial } from \"./object.helpers\";\nimport { LoggerService } from './logger.service';\nimport { LogLevel } from '../models/log-level';\n\n@Injectable({ providedIn: 'root' })\nexport class UserSettingsService {\n private readonly _settings = signal<ConsoleUserSettings>({\n console: {\n allowCopyToLocalClipboard: true,\n preserveAspectRatioOnScale: true\n },\n toolbar: {\n dockTo: \"left\"\n }\n });\n public readonly settings = this._settings.asReadonly();\n\n private readonly logger = inject(LoggerService);\n private readonly settingsKey = \"consoleForge:userSettings\";\n private readonly window = inject(WINDOW);\n\n constructor() {\n // read out of storage\n const storedValue = this.window.localStorage.getItem(this.settingsKey);\n\n if (storedValue) {\n try {\n const parsedValue: Partial<ConsoleUserSettings> = JSON.parse(storedValue);\n this._settings.update(current => ({ ...current, ...parsedValue }));\n }\n catch (err) {\n this.logger.log(LogLevel.WARNING, \"Couldn't load settings from local storage:\", err);\n\n }\n }\n\n // when settings are written, update local storage\n effect(() => {\n const current = this._settings();\n this.window.localStorage.setItem(this.settingsKey, JSON.stringify(current));\n this.logger.log(LogLevel.DEBUG, \"Settings saved to local storage.\");\n });\n }\n\n public patch(patch: DeepPartial<ConsoleUserSettings>) {\n this._settings.update(current => deepMerge(current, patch));\n }\n\n public update(update: Partial<ConsoleUserSettings>) {\n this._settings.update(current => ({\n ...current,\n ...update\n }));\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\n/**\n * Extracts plain text from a ClipboardItem, if available.\n *\n * @param clipboardItem - The ClipboardItem to extract text from.\n * @returns A promise that resolves to the extracted text, or null if no text is present.\n */\nexport async function getTextFromClipboardItem(clipboardItem?: ClipboardItem): Promise<string | null> {\n const textMimeType = \"text/plain\";\n\n if (!clipboardItem?.types?.includes(textMimeType)) {\n return null;\n }\n\n const blob = await clipboardItem.getType(textMimeType);\n if (!blob) {\n return null;\n }\n\n return blob.text();\n}\n\nexport function getClipboardItemFromText(text: string): ClipboardItem {\n return new ClipboardItem({ 'text/plain': new Blob([text], { type: 'text/plain' }) });\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { UserSettingsService } from '../user-settings.service';\nimport { getClipboardItemFromText } from './clipboard.helpers';\n\n@Injectable({ providedIn: 'root' })\nexport class ClipboardService {\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly document = inject(DOCUMENT);\n private readonly userSettings = inject(UserSettingsService);\n\n private _localClipboardContentWritten = signal<ClipboardItem | undefined>(undefined);\n public localClipboardContentWritten = this._localClipboardContentWritten.asReadonly();\n\n public copyBlob(blob: Blob) {\n return this.writeToClipboard(new ClipboardItem({ [blob.type]: blob }));\n }\n\n public copyText(text: string) {\n return this.writeToClipboard(getClipboardItemFromText(text));\n }\n\n public async readText() {\n const clipboard = this.getClipboard();\n if (!clipboard) {\n throw new Error(\"Can't access the clipboard to read text\");\n }\n\n return clipboard.readText();\n }\n\n private getClipboard(): Clipboard | undefined {\n if (this.cfConfig.disabledFeatures.clipboard) {\n throw new Error(\"ConsoleForge's clipboard access has been disabled.\");\n }\n\n return this.document?.defaultView?.navigator?.clipboard;\n }\n\n private writeToClipboard(item: ClipboardItem) {\n const clipboard = this.getClipboard();\n if (!clipboard) {\n throw new Error(\"Can't access the clipboard to write content\");\n }\n\n if (!this.userSettings.settings().console.allowCopyToLocalClipboard) {\n throw new Error(\"User has disabled ConsoleForge's access to their local clipboard.\");\n }\n\n clipboard.write([item]);\n this._localClipboardContentWritten.update(() => item);\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { AfterViewInit, Component, ElementRef, inject, input, model, viewChild, ViewEncapsulation } from '@angular/core';\nimport { ConsoleToolbarContext } from '../../models/console-toolbar-context';\nimport { ConsoleToolbarDefaultButtonComponent } from './console-toolbar-default-button/console-toolbar-default-button.component';\nimport { ConsoleToolbarComponentBase } from '../../models/console-toolbar-component-base';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { ConsoleToolbarPosition } from '../../models/console-toolbar-position';\nimport { ConsolePowerRequest } from '../../models/console-power-request';\nimport { ClipboardService } from '../../services/clipboard/clipboard.service';\nimport { FormsModule } from '@angular/forms';\nimport { PicoCssService } from '../../services/pico-css.service';\n\n@Component({\n selector: 'cf-console-toolbar-default',\n imports: [\n FormsModule,\n ConsoleToolbarDefaultButtonComponent\n ],\n standalone: true,\n templateUrl: './console-toolbar-default.component.html',\n styleUrl: './console-toolbar-default.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ConsoleToolbarDefaultComponent implements AfterViewInit, ConsoleToolbarComponentBase {\n consoleContext = input.required<ConsoleToolbarContext>();\n\n // component state\n protected isClipboardDialogOpen = false;\n protected isKeyboardDialogOpen = false;\n protected isNetworkDialogOpen = false;\n protected isPowerDialogOpen = false;\n protected isSettingsDialogOpen = false;\n\n protected keyboardInputText = model<string>(\"\");\n\n // services and viewkids\n protected readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly clipboardService = inject(ClipboardService);\n protected readonly clipboardTextInput = viewChild<ElementRef>(\"clipboardText\");\n private readonly picoCssService = inject(PicoCssService);\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n\n async ngAfterViewInit(): Promise<void> {\n // apply pico to this component\n const sheet = await this.picoCssService.loadStyleSheet();\n\n if (this.hostElement.nativeElement.shadowRoot) {\n this.hostElement.nativeElement.shadowRoot.adoptedStyleSheets = [sheet];\n }\n }\n\n protected handleChangeToolbarPosition(position: ConsoleToolbarPosition) {\n this.consoleContext().userSettings.patch({ toolbar: { dockTo: position } });\n }\n\n protected handleClipboardDialogOpenClose(isOpen: boolean) {\n this.isClipboardDialogOpen = isOpen;\n\n if (isOpen) {\n // Is there a better way to ensure .focus works other than timeouting it?\n setTimeout(() => this.clipboardTextInput()?.nativeElement?.focus(), 100);\n }\n }\n\n protected handleClipboardCopyLastText(text: string) {\n this.clipboardService.copyText(text);\n }\n\n protected handleNetworkChangeRequested(networkName?: string) {\n if (!networkName) {\n this.consoleContext().networks.disconnectRequested();\n } else {\n this.consoleContext().networks.connectionRequested(networkName);\n }\n this.isNetworkDialogOpen = false;\n }\n\n protected handleNetworkDialogOpenClose(isOpen: boolean) {\n this.isNetworkDialogOpen = isOpen;\n }\n\n protected handleRecordToggle() {\n if (this.consoleContext().state.activeConsoleRecording()) {\n this.consoleContext().console.recordScreenStop();\n } else {\n this.consoleContext().console.recordScreenStart();\n }\n }\n\n protected async handleSendClipboardText(event: Event, text: string) {\n event.preventDefault();\n\n if (text) {\n await this.consoleContext().clipboard.sendTextToConsoleClipboard(text);\n }\n\n this.isClipboardDialogOpen = false;\n }\n\n protected async handlSendKeyboardCtrlAltDel(): Promise<void> {\n await this.consoleContext().console.sendCtrlAltDel();\n this.isKeyboardDialogOpen = false;\n }\n\n protected async handleSendKeyboardInput(event: Event, text: string) {\n // prevent the form submit default\n event.preventDefault();\n\n if (text) {\n await this.consoleContext().console.sendKeyboardInput(text);\n }\n\n this.keyboardInputText.update(() => \"\");\n this.isKeyboardDialogOpen = false;\n }\n\n protected async handleSendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n await this.consoleContext().console.sendPowerRequest(request);\n this.isPowerDialogOpen = false;\n }\n\n protected handleSettingsDialogOpenClose(isOpen: boolean) {\n this.isSettingsDialogOpen = isOpen;\n }\n\n protected handleSettingsAllowLocalClipboardWrite(allow: boolean) {\n this.consoleContext().userSettings.patch({ console: { allowCopyToLocalClipboard: allow } });\n }\n\n protected handleSettingsPreserveAspectRatioChange(preserveAspectRatioOnScale: boolean) {\n this.consoleContext().userSettings.patch({ console: { preserveAspectRatioOnScale } });\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n@if (consoleContext()) {\n<div class=\"toolbar-container\"\n [class.horizontal]=\"consoleContext().userSettings.settings().toolbar.dockTo == 'top' || consoleContext().userSettings.settings().toolbar.dockTo == 'bottom' \">\n <div class=\"button-container\">\n <cf-console-toolbar-default-button label=\"Settings\" (clicked)=\"handleSettingsDialogOpenClose(true)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M12.0002 8C9.79111 8 8.00024 9.79086 8.00024 12C8.00024 14.2091 9.79111 16 12.0002 16C14.2094 16 16.0002 14.2091 16.0002 12C16.0002 9.79086 14.2094 8 12.0002 8ZM10.0002 12C10.0002 10.8954 10.8957 10 12.0002 10C13.1048 10 14.0002 10.8954 14.0002 12C14.0002 13.1046 13.1048 14 12.0002 14C10.8957 14 10.0002 13.1046 10.0002 12Z\"\n fill=\"#000000\"></path>\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M11.2867 0.5C9.88583 0.5 8.6461 1.46745 8.37171 2.85605L8.29264 3.25622C8.10489 4.20638 7.06195 4.83059 6.04511 4.48813L5.64825 4.35447C4.32246 3.90796 2.83873 4.42968 2.11836 5.63933L1.40492 6.83735C0.67773 8.05846 0.954349 9.60487 2.03927 10.5142L2.35714 10.7806C3.12939 11.4279 3.12939 12.5721 2.35714 13.2194L2.03927 13.4858C0.954349 14.3951 0.67773 15.9415 1.40492 17.1626L2.11833 18.3606C2.83872 19.5703 4.3225 20.092 5.64831 19.6455L6.04506 19.5118C7.06191 19.1693 8.1049 19.7935 8.29264 20.7437L8.37172 21.1439C8.6461 22.5325 9.88584 23.5 11.2867 23.5H12.7136C14.1146 23.5 15.3543 22.5325 15.6287 21.1438L15.7077 20.7438C15.8954 19.7936 16.9384 19.1693 17.9553 19.5118L18.3521 19.6455C19.6779 20.092 21.1617 19.5703 21.8821 18.3606L22.5955 17.1627C23.3227 15.9416 23.046 14.3951 21.9611 13.4858L21.6432 13.2194C20.8709 12.5722 20.8709 11.4278 21.6432 10.7806L21.9611 10.5142C23.046 9.60489 23.3227 8.05845 22.5955 6.83732L21.8821 5.63932C21.1617 4.42968 19.678 3.90795 18.3522 4.35444L17.9552 4.48814C16.9384 4.83059 15.8954 4.20634 15.7077 3.25617L15.6287 2.85616C15.3543 1.46751 14.1146 0.5 12.7136 0.5H11.2867ZM10.3338 3.24375C10.4149 2.83334 10.7983 2.5 11.2867 2.5H12.7136C13.2021 2.5 13.5855 2.83336 13.6666 3.24378L13.7456 3.64379C14.1791 5.83811 16.4909 7.09167 18.5935 6.38353L18.9905 6.24984C19.4495 6.09527 19.9394 6.28595 20.1637 6.66264L20.8771 7.86064C21.0946 8.22587 21.0208 8.69271 20.6764 8.98135L20.3586 9.24773C18.6325 10.6943 18.6325 13.3057 20.3586 14.7523L20.6764 15.0186C21.0208 15.3073 21.0946 15.7741 20.8771 16.1394L20.1637 17.3373C19.9394 17.714 19.4495 17.9047 18.9905 17.7501L18.5936 17.6164C16.4909 16.9082 14.1791 18.1618 13.7456 20.3562L13.6666 20.7562C13.5855 21.1666 13.2021 21.5 12.7136 21.5H11.2867C10.7983 21.5 10.4149 21.1667 10.3338 20.7562L10.2547 20.356C9.82113 18.1617 7.50931 16.9082 5.40665 17.6165L5.0099 17.7501C4.55092 17.9047 4.06104 17.714 3.83671 17.3373L3.1233 16.1393C2.9058 15.7741 2.97959 15.3073 3.32398 15.0186L3.64185 14.7522C5.36782 13.3056 5.36781 10.6944 3.64185 9.24779L3.32398 8.98137C2.97959 8.69273 2.9058 8.2259 3.1233 7.86067L3.83674 6.66266C4.06106 6.28596 4.55093 6.09528 5.0099 6.24986L5.40676 6.38352C7.50938 7.09166 9.82112 5.83819 10.2547 3.64392L10.3338 3.24375Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n\n @if(consoleContext().state.isManualReconnectAvailable())\n {\n <cf-console-toolbar-default-button label=\"Reconnect\"\n (clicked)=\"consoleContext().console.sendReconnectRequest()\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M12 2C6.47715 2 2 6.47715 2 12C2 17.5228 6.47715 22 12 22C16.3556 22 20.0584 19.2159 21.4307 15.3332C21.6148 14.8125 21.3418 14.2412 20.8211 14.0572C20.3004 13.8731 19.7291 14.146 19.545 14.6668C18.4463 17.7753 15.4817 20 12 20C7.58172 20 4 16.4183 4 12C4 7.58172 7.58172 4 12 4C13.5516 4 14.8662 4.56117 16.1162 5.4406C16.9569 6.03212 17.7348 6.74106 18.5242 7.5H15.5C14.9477 7.5 14.5 7.94772 14.5 8.5C14.5 9.05228 14.9477 9.5 15.5 9.5H21C21.5523 9.5 22 9.05228 22 8.5V3C22 2.44772 21.5523 2 21 2C20.4477 2 20 2.44772 20 3V6.14371C19.1517 5.32583 18.2456 4.49337 17.267 3.80489C15.7949 2.76916 14.0847 2 12 2Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n }\n\n @if (!consoleContext().state.isViewOnly() && consoleContext().state.isConnected()) {\n <div class=\"buttons-divider\"></div>\n\n <cf-console-toolbar-default-button label=\"Keyboard\" (clicked)=\"isKeyboardDialogOpen = true\">\n <svg fill=\"#000000\" viewBox=\"0 0 1920 1920\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M1807.059 1637.706c0 31.059-25.299 56.47-56.47 56.47H169.411c-31.172 0-56.47-25.411-56.47-56.47v-903.53c0-31.058 25.298-56.47 56.47-56.47h1581.176c31.172 0 56.47 25.412 56.47 56.47v903.53Zm-56.47-1072.941h-729.262c14.908-86.965 65.958-113.506 133.384-147.163 89.336-44.611 200.583-100.291 200.583-304.602h-112.941c0 134.513-57.939 163.426-138.24 203.633-80.301 40.094-177.544 90.24-196.518 248.132H169.412C76.009 564.765 0 640.775 0 734.176v903.53c0 93.402 76.01 169.412 169.412 169.412h1581.176c93.403 0 169.412-76.01 169.412-169.412v-903.53c0-93.402-76.01-169.411-169.412-169.411Zm-564.707 677.647H734.118c-31.172 0-56.47 25.299-56.47 56.47v112.942c0 31.171 25.298 56.47 56.47 56.47h451.764c31.172 0 56.47-25.299 56.47-56.47v-112.942c0-31.171-25.298-56.47-56.47-56.47m338.824 0h-112.941c-31.172 0-56.47 25.299-56.47 56.47v112.942c0 31.171 25.298 56.47 56.47 56.47h112.94c31.173 0 56.471-25.299 56.471-56.47v-112.942c0-31.171-25.298-56.47-56.47-56.47m-1016.47 0H395.293c-31.172 0-56.47 25.299-56.47 56.47v112.942c0 31.171 25.298 56.47 56.47 56.47h112.941c31.172 0 56.47-25.299 56.47-56.47v-112.942c0-31.171-25.298-56.47-56.47-56.47m0-338.824h-112.94c-31.173 0-56.471 25.3-56.471 56.47V1073c0 31.172 25.298 56.47 56.47 56.47h112.941c31.172 0 56.47-25.298 56.47-56.47V960.059c0-31.172-25.298-56.47-56.47-56.47m225.883 225.882h112.94c31.173 0 56.471-25.3 56.471-56.471V960.059c0-31.172-25.298-56.47-56.47-56.47h-112.94c-31.172 0-56.47 25.298-56.47 56.47V1073c0 31.172 25.298 56.47 56.47 56.47m451.764-225.882h-112.94c-31.173 0-56.471 25.3-56.471 56.47V1073c0 31.172 25.298 56.47 56.47 56.47h112.941c31.172 0 56.47-25.298 56.47-56.47V960.059c0-31.172-25.298-56.47-56.47-56.47m338.824 0h-112.941c-31.172 0-56.47 25.298-56.47 56.47V1073c0 31.172 25.298 56.47 56.47 56.47h112.94c31.173 0 56.471-25.298 56.471-56.47V960.059c0-31.172-25.298-56.47-56.47-56.47\"\n fill-rule=\"evenodd\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n\n @if(!cfConfig.disabledFeatures.clipboard) {\n <cf-console-toolbar-default-button [disabled]=\"!consoleContext().state.isConnected()\" label=\"Clipboard\"\n (clicked)=\"handleClipboardDialogOpenClose(true)\">\n <svg viewBox=\"0 0 24 24\" preserveAspectRatio=\"none\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M19.5 16.5L19.5 4.5L18.75 3.75H9L8.25 4.5L8.25 7.5L5.25 7.5L4.5 8.25V20.25L5.25 21H15L15.75 20.25V17.25H18.75L19.5 16.5ZM15.75 15.75L15.75 8.25L15 7.5L9.75 7.5V5.25L18 5.25V15.75H15.75ZM6 9L14.25 9L14.25 19.5L6 19.5L6 9Z\"\n fill=\"#080341\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n }\n\n @if (consoleContext().networks.config()?.available?.length) {\n <cf-console-toolbar-default-button\n label=\"Networks ({{ consoleContext().networks.config()?.available?.length }})\"\n (clicked)=\"handleNetworkDialogOpenClose(true)\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M3 12H21M12 8V12M6.5 12V16M17.5 12V16M10.1 8H13.9C14.4601 8 14.7401 8 14.954 7.89101C15.1422 7.79513 15.2951 7.64215 15.391 7.45399C15.5 7.24008 15.5 6.96005 15.5 6.4V4.6C15.5 4.03995 15.5 3.75992 15.391 3.54601C15.2951 3.35785 15.1422 3.20487 14.954 3.10899C14.7401 3 14.4601 3 13.9 3H10.1C9.53995 3 9.25992 3 9.04601 3.10899C8.85785 3.20487 8.70487 3.35785 8.60899 3.54601C8.5 3.75992 8.5 4.03995 8.5 4.6V6.4C8.5 6.96005 8.5 7.24008 8.60899 7.45399C8.70487 7.64215 8.85785 7.79513 9.04601 7.89101C9.25992 8 9.53995 8 10.1 8ZM15.6 21H19.4C19.9601 21 20.2401 21 20.454 20.891C20.6422 20.7951 20.7951 20.6422 20.891 20.454C21 20.2401 21 19.9601 21 19.4V17.6C21 17.0399 21 16.7599 20.891 16.546C20.7951 16.3578 20.6422 16.2049 20.454 16.109C20.2401 16 19.9601 16 19.4 16H15.6C15.0399 16 14.7599 16 14.546 16.109C14.3578 16.2049 14.2049 16.3578 14.109 16.546C14 16.7599 14 17.0399 14 17.6V19.4C14 19.9601 14 20.2401 14.109 20.454C14.2049 20.6422 14.3578 20.7951 14.546 20.891C14.7599 21 15.0399 21 15.6 21ZM4.6 21H8.4C8.96005 21 9.24008 21 9.45399 20.891C9.64215 20.7951 9.79513 20.6422 9.89101 20.454C10 20.2401 10 19.9601 10 19.4V17.6C10 17.0399 10 16.7599 9.89101 16.546C9.79513 16.3578 9.64215 16.2049 9.45399 16.109C9.24008 16 8.96005 16 8.4 16H4.6C4.03995 16 3.75992 16 3.54601 16.109C3.35785 16.2049 3.20487 16.3578 3.10899 16.546C3 16.7599 3 17.0399 3 17.6V19.4C3 19.9601 3 20.2401 3.10899 20.454C3.20487 20.6422 3.35785 20.7951 3.54601 20.891C3.75992 21 4.03995 21 4.6 21Z\"\n stroke=\"#000000\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n }\n\n @if (consoleContext().console.supportedFeatures().powerManagement) {\n <div class=\"buttons-divider\"></div>\n\n <cf-console-toolbar-default-button label=\"Power\" (clicked)=\"isPowerDialogOpen = true\">\n <svg width=\"800px\" height=\"800px\" viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <path\n d=\"M13 3C13 2.44772 12.5523 2 12 2C11.4477 2 11 2.44772 11 3V13C11 13.5523 11.4477 14 12 14C12.5523 14 13 13.5523 13 13V3Z\"\n fill=\"none\" />\n <path\n d=\"M6.2798 6.70707C6.67031 6.31653 6.67028 5.68337 6.27973 5.29286C5.88919 4.90235 5.25603 4.90238 4.86552 5.29293C3.09635 7.06226 2 9.49298 2 12.1764C2 17.6204 6.49591 22 12 22C17.5041 22 22 17.6204 22 12.1764C22 9.49298 20.9036 7.06226 19.1345 5.29293C18.744 4.90238 18.1108 4.90235 17.7203 5.29286C17.3297 5.68337 17.3297 6.31653 17.7202 6.70707C19.1338 8.12083 20 10.0503 20 12.1764C20 16.4787 16.437 20 12 20C7.56296 20 4 16.4787 4 12.1764C4 10.0503 4.86618 8.12083 6.2798 6.70707Z\"\n fill=\"none\" />\n </svg>\n </cf-console-toolbar-default-button> }\n }\n\n <div class=\"buttons-divider\"></div>\n\n <cf-console-toolbar-default-button (clicked)=\"consoleContext().console.copyScreenshot()\"\n [disabled]=\"!consoleContext().state.isConnected()\" label=\"Screenshot\">\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path fill-rule=\"evenodd\" clip-rule=\"evenodd\"\n d=\"M9.15023 3.01742C9.13605 3.03985 9.12278 3.0676 9.11298 3.09958C9.11044 3.10789 9.10778 3.11617 9.10502 3.12442L8.36963 5.31787C8.23301 5.72537 7.85129 6 7.4215 6H3C2.44772 6 2 6.44772 2 7V20C2 20.5523 2.44771 21 3 21H21C21.5523 21 22 20.5523 22 20V7C22 6.44771 21.5523 6 21 6H16.331C15.9011 6 15.5194 5.72528 15.3828 5.31769L14.6479 3.12423C14.6452 3.11605 14.6425 3.10783 14.64 3.09958C14.6302 3.0676 14.6169 3.03985 14.6027 3.01742C14.5986 3.01089 14.5946 3.00509 14.5908 3H9.16221C9.1584 3.00509 9.15437 3.01089 9.15023 3.01742ZM7.20525 2.49911C7.43535 1.76672 8.10563 1 9.06392 1H14.6891C15.6474 1 16.3177 1.76679 16.5478 2.49922L17.0506 4H21C22.6569 4 24 5.34315 24 7V20C24 21.6569 22.6569 23 21 23H3C1.34315 23 0 21.6569 0 20V7C0 5.34315 1.34315 4 3 4H6.70206L7.20525 2.49911ZM7 13C7 10.2386 9.23858 8 12 8C14.7614 8 17 10.2386 17 13C17 15.7614 14.7614 18 12 18C9.23858 18 7 15.7614 7 13ZM12 10C10.3431 10 9 11.3431 9 13C9 14.6569 10.3431 16 12 16C13.6569 16 15 14.6569 15 13C15 11.3431 13.6569 10 12 10Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n </cf-console-toolbar-default-button>\n\n @if (!cfConfig.disabledFeatures.consoleScreenRecord) {\n <cf-console-toolbar-default-button (clicked)=\"handleRecordToggle()\"\n [disabled]=\"!consoleContext().state.isRecordingAvailable()\"\n [isOngoing]=\"!!consoleContext().state.activeConsoleRecording()\" label=\"Record\">\n @if (!consoleContext().state.activeConsoleRecording()) {\n <svg viewBox=\"0 0 20 20\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <title>record [#979]</title>\n <desc>Created with Sketch.</desc>\n <defs> </defs>\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"Dribbble-Light-Preview\" transform=\"translate(-100.000000, -3879.000000)\" fill=\"#000000\">\n <g id=\"icons\" transform=\"translate(56.000000, 160.000000)\">\n <path\n d=\"M56,3719 L56,3721 L62,3721 L62,3727 L64,3727 L64,3719 L56,3719 Z M58,3729.151 C58,3726.942 56.209,3725.151 54,3725.151 C51.791,3725.151 50,3726.942 50,3729.151 C50,3731.36 51.791,3733.151 54,3733.151 C56.209,3733.151 58,3731.36 58,3729.151 L58,3729.151 Z M62,3737 L56,3737 L56,3739 L64,3739 L64,3731 L62,3731 L62,3737 Z M46,3731 L44,3731 L44,3739 L52,3739 L52,3737 L46,3737 L46,3731 Z M46,3727 L44,3727 L44,3719 L52,3719 L52,3721 L46,3721 L46,3727 Z\"\n id=\"record-[#979]\"> </path>\n </g>\n </g>\n </g>\n </g>\n </svg>\n } @else {\n <svg viewBox=\"0 -0.5 21 21\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\"\n xmlns:xlink=\"http://www.w3.org/1999/xlink\" fill=\"#000000\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <g id=\"Page-1\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\">\n <g id=\"Dribbble-Light-Preview\" transform=\"translate(-59.000000, -440.000000)\" fill=\"#000000\">\n <g id=\"icons\" transform=\"translate(56.000000, 160.000000)\">\n <path\n d=\"M9.3,294 L17.7,294 L17.7,286 L9.3,286 L9.3,294 Z M15.6,280 L15.6,282 L21.9,282 L21.9,288 L24,288 L24,280 L15.6,280 Z M21.9,298 L15.6,298 L15.6,300 L24,300 L24,292 L21.9,292 L21.9,298 Z M5.1,292 L3,292 L3,300 L11.4,300 L11.4,298 L5.1,298 L5.1,292 Z M5.1,288 L3,288 L3,280 L11.4,280 L11.4,282 L5.1,282 L5.1,288 Z\"\n id=\"stop-[#1470]\"> </path>\n </g>\n </g>\n </g>\n </g>\n </svg>\n }\n </cf-console-toolbar-default-button>\n }\n\n <cf-console-toolbar-default-button (clicked)=\"consoleContext().console.toggleFullscreen()\" label=\"Fullscreen\">\n @if (consoleContext().state.isFullscreenAvailable()) {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M4 2C2.89543 2 2 2.89543 2 4V8C2 8.55228 2.44772 9 3 9C3.55228 9 4 8.55228 4 8V4H8C8.55228 4 9 3.55228 9 3C9 2.44772 8.55228 2 8 2H4Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M20 2C21.1046 2 22 2.89543 22 4V8C22 8.55228 21.5523 9 21 9C20.4477 9 20 8.55228 20 8V4H16C15.4477 4 15 3.55228 15 3C15 2.44772 15.4477 2 16 2H20Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M20 22C21.1046 22 22 21.1046 22 20V16C22 15.4477 21.5523 15 21 15C20.4477 15 20 15.4477 20 16V20H16C15.4477 20 15 20.4477 15 21C15 21.5523 15.4477 22 16 22H20Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M2 20C2 21.1046 2.89543 22 4 22H8C8.55228 22 9 21.5523 9 21C9 20.4477 8.55228 20 8 20H4V16C4 15.4477 3.55228 15 3 15C2.44772 15 2 15.4477 2 16V20Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n } @else {\n <svg viewBox=\"0 0 24 24\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n <g id=\"SVGRepo_bgCarrier\" stroke-width=\"0\"></g>\n <g id=\"SVGRepo_tracerCarrier\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></g>\n <g id=\"SVGRepo_iconCarrier\">\n <path\n d=\"M7 9C8.10457 9 9 8.10457 9 7V3C9 2.44772 8.55228 2 8 2C7.44772 2 7 2.44772 7 3V7H3C2.44772 7 2 7.44772 2 8C2 8.55228 2.44772 9 3 9H7Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M17 9C15.8954 9 15 8.10457 15 7V3C15 2.44772 15.4477 2 16 2C16.5523 2 17 2.44772 17 3V7H21C21.5523 7 22 7.44772 22 8C22 8.55228 21.5523 9 21 9H17Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M17 15C15.8954 15 15 15.8954 15 17V21C15 21.5523 15.4477 22 16 22C16.5523 22 17 21.5523 17 21V17H21C21.5523 17 22 16.5523 22 16C22 15.4477 21.5523 15 21 15H17Z\"\n fill=\"#000000\"></path>\n <path\n d=\"M9 17C9 15.8954 8.10457 15 7 15H3C2.44772 15 2 15.4477 2 16C2 16.5523 2.44772 17 3 17H7V21C7 21.5523 7.44772 22 8 22C8.55228 22 9 21.5523 9 21V17Z\"\n fill=\"#000000\"></path>\n </g>\n </svg>\n }\n </cf-console-toolbar-default-button>\n </div>\n</div>\n}\n\n<dialog [open]=\"isClipboardDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"handleClipboardDialogOpenClose(false)\"></button>\n <p>\n <strong>Clipboard</strong>\n </p>\n </header>\n\n @if (consoleContext().console.supportedFeatures().clipboardRemoteWrite) {\n <div class=\"dialog-section\">\n <h2>Send Text to Console Clipboard</h2>\n <form (submit)=\"handleSendClipboardText($event, clipboardText.value)\">\n <fieldset role=\"group\">\n <input type=\"text\" class=\"clipboard-text\" aria-label=\"Clipboard text\"\n placeholder=\"Enter text to send to the console's clipboard\" #clipboardText autofocus>\n <button type=\"submit\"\n [disabled]=\"!clipboardText.value || !consoleContext().state.isConnected\">Send</button>\n </fieldset>\n </form>\n </div>\n }\n\n @if(!consoleContext().userSettings.settings().console.allowCopyToLocalClipboard ||\n !consoleContext().console.supportedFeatures().clipboardAutomaticLocalCopy) {\n <div class=\"dialog-section\">\n <h2>Console Clipboard Content</h2>\n <form (submit)=\"handleClipboardCopyLastText(consoleLastClipboardText.value)\">\n <fieldset role=\"group\">\n <input type=\"text\" class=\"clipboard-text\" aria-label=\"Clipboard text\" disabled\n [value]=\"consoleContext().clipboard.consoleClipboardText()\"\n placeholder=\"The console's clipboard content will appear here\" #consoleLastClipboardText>\n <button type=\"submit\" [disabled]=\"!consoleLastClipboardText.value\">Copy</button>\n </fieldset>\n </form>\n </div>\n }\n </article>\n</dialog>\n\n<dialog [open]=\"isKeyboardDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"isKeyboardDialogOpen = false\"></button>\n <p>\n <strong>Send Keystrokes</strong>\n </p>\n </header>\n\n <div class=\"dialog-section\">\n <h2>Send Keystrokes to Console</h2>\n <form (submit)=\"handleSendKeyboardInput($event, keyboardInputText())\">\n <fieldset role=\"group\">\n <input type=\"text\" name=\"keyboardInputText\" class=\"clipboard-text\" aria-label=\"Clipboard text\"\n placeholder=\"Enter text to send as keyboard input to the console\" autofocus\n [(ngModel)]=\"keyboardInputText\">\n <button type=\"submit\"\n [disabled]=\"!keyboardInputText() || !consoleContext().state.isConnected\">Send</button>\n </fieldset>\n </form>\n </div>\n\n <div class=\"dialog-section\">\n <h2>Special Key Combinations</h2>\n\n <div class=\"dialog-button-group\">\n <button type=\"button\" aria-label=\"Send Ctrl+Alt+Delete\" (click)=\"handlSendKeyboardCtrlAltDel()\">\n Ctrl + Alt + Delete\n </button>\n </div>\n </div>\n </article>\n</dialog>\n\n<dialog [open]=\"isNetworkDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"handleNetworkDialogOpenClose(false)\"></button>\n <p>\n <strong>Networks</strong>\n </p>\n </header>\n\n <form>\n <fieldset role=\"group\">\n <select #availableNetworksSelect name=\"current-network\" aria-label=\"Select a network to connect to\"\n required>\n <option selected value=\"\">\n [Disconnect from network]\n </option>\n\n @for(network of consoleContext().networks.config()?.available; track network) {\n <option [value]=\"network\" [selected]=\"network === consoleContext().networks.config()?.current\">\n {{ network }}\n </option>\n }\n </select>\n\n <button type=\"button\" (click)=\"handleNetworkChangeRequested(availableNetworksSelect.value)\">\n {{ availableNetworksSelect.value ? \"Connect\" : \"Disconnect\" }}\n </button>\n </fieldset>\n </form>\n </article>\n</dialog>\n\n<dialog [open]=\"isPowerDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"isPowerDialogOpen = false\"></button>\n <p>\n <strong>Power</strong>\n </p>\n </header>\n\n <div class=\"dialog-button-group\">\n <button type=\"button\" (click)=\"handleSendPowerRequest('reboot')\">Request Reboot</button>\n <button type=\"button\" (click)=\"handleSendPowerRequest('shutdown')\">Request Shutdown</button>\n <hr />\n <button class=\"secondary\" type=\"button\" (click)=\"handleSendPowerRequest('rebootHard')\">\n Request Hard Reboot\n </button>\n </div>\n </article>\n</dialog>\n\n<dialog [open]=\"isSettingsDialogOpen\">\n <article>\n <header>\n <button aria-label=\"Close\" rel=\"prev\" (click)=\"handleSettingsDialogOpenClose(false)\"></button>\n <p>\n <strong>Settings</strong>\n </p>\n </header>\n\n <div class=\"settings-form\">\n <h4>Behavior</h4>\n <fieldset>\n <label>\n <input #inputAllowLocalClipboardWrite type=\"checkbox\" name=\"allowLocalClipboardWrite\"\n [checked]=\"consoleContext().userSettings.settings().console.allowCopyToLocalClipboard\"\n (change)=\"handleSettingsAllowLocalClipboardWrite(inputAllowLocalClipboardWrite.checked)\" />\n Allow the remote machine to copy text to my local clipboard\n </label>\n <label>\n <input #inputScaleToContainerSize type=\"checkbox\" name=\"scaleToContainerSize\"\n [checked]=\"consoleContext().userSettings.settings().console.preserveAspectRatioOnScale\"\n (change)=\"handleSettingsPreserveAspectRatioChange(inputScaleToContainerSize.checked)\" />\n Preserve console aspect ratio when scaling size\n </label>\n </fieldset>\n\n <div class=\"settings-toolbar-dock\">\n <h4>Toolbar Position</h4>\n <div role=\"group\">\n <button (click)=\"handleChangeToolbarPosition('left')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'left'\">Left</button>\n <button (click)=\"handleChangeToolbarPosition('right')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'right'\">Right</button>\n <button (click)=\"handleChangeToolbarPosition('top')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'top'\">Top</button>\n <button (click)=\"handleChangeToolbarPosition('bottom')\"\n [disabled]=\"consoleContext().userSettings.settings().toolbar.dockTo === 'bottom'\">Bottom</button>\n </div>\n </div>\n </div>\n </article>\n</dialog>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Type } from \"@angular/core\";\nimport { LogLevel } from \"../models/log-level\";\nimport { ConsoleClientType } from \"../models/console-client-type\";\nimport { ConsoleToolbarComponentBase } from \"../models/console-toolbar-component-base\";\nimport { ConsoleToolbarDefaultComponent } from \"../components/console-toolbar-default/console-toolbar-default.component\";\n\nexport abstract class ConsoleForgeConfig {\n abstract canvasRecording: {\n autoDownloadCompletedRecordings?: boolean;\n chunkLength?: number;\n frameRate?: number;\n maxDuration?: number;\n mimeType?: string;\n };\n abstract consoleBackgroundStyle?: string;\n abstract defaultConsoleClientType?: ConsoleClientType;\n abstract disabledFeatures: {\n clipboard?: boolean;\n consoleScreenRecord?: boolean;\n manualConsoleReconnect?: boolean;\n };\n abstract logThreshold: LogLevel;\n abstract showBrowserNotificationsOnConsoleEvents: boolean;\n abstract toolbar: {\n component: Type<ConsoleToolbarComponentBase>;\n disabled: boolean;\n }\n}\n\nexport const defaultCfConfig: ConsoleForgeConfig = {\n canvasRecording: {\n autoDownloadCompletedRecordings: true,\n chunkLength: 1000,\n frameRate: 25,\n maxDuration: 10000,\n mimeType: \"video/webm\"\n },\n consoleBackgroundStyle: \"rgb(40, 40, 40)\",\n disabledFeatures: {\n clipboard: false,\n consoleScreenRecord: false,\n manualConsoleReconnect: false,\n },\n logThreshold: LogLevel.WARNING,\n showBrowserNotificationsOnConsoleEvents: true,\n toolbar: {\n component: ConsoleToolbarDefaultComponent,\n disabled: false\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport NoVncClient, { NoVncOptions } from '@novnc/novnc/core/rfb';\nimport { ConsoleForgeConfig } from '../../../config/console-forge-config';\nimport { ConsoleClientType } from '../../../models/console-client-type';\nimport { ConsoleConnectionOptions } from '../../../models/console-connection-options';\nimport { ConsoleConnectionStatus } from '../../../models/console-connection-status';\nimport { ConsolePowerRequest } from '../../../models/console-power-request';\nimport { ConsoleSupportedFeatures } from '../../../models/console-supported-features';\nimport { LogLevel } from '../../../models/log-level';\nimport { ConsoleClientService } from '../../../services/console-clients/console-client.service';\nimport { LoggerService } from '../../../services/logger.service';\nimport { UserSettingsService } from '../../user-settings.service';\nimport { ClipboardService } from '../../clipboard/clipboard.service';\n\n@Injectable({ providedIn: 'root' })\nexport class VncConsoleClientService implements ConsoleClientService {\n public readonly clientType: ConsoleClientType = \"vnc\";\n private readonly _consoleClipboardUpdated = signal<string>(\"\");\n public readonly consoleClipboardUpdated = this._consoleClipboardUpdated.asReadonly();\n\n private readonly _connectionStatus = signal<ConsoleConnectionStatus>(\"disconnected\");\n public readonly connectionStatus = this._connectionStatus.asReadonly();\n\n private readonly _supportedFeatures = signal<ConsoleSupportedFeatures>({\n clipboardAutomaticLocalCopy: true,\n clipboardRemoteWrite: true,\n onScreenKeyboard: false,\n powerManagement: false,\n viewOnlyMode: true\n });\n public readonly supportedFeatures = this._supportedFeatures.asReadonly();\n\n // injected services\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly clipboardService = inject(ClipboardService);\n private readonly logger = inject(LoggerService);\n private readonly userSettings = inject(UserSettingsService);\n\n // the actual client from @novnc/novnc\n private noVncClient?: NoVncClient;\n\n public async connect(url: string, options: ConsoleConnectionOptions): Promise<void> {\n if (this.noVncClient) {\n this.noVncClient = undefined;\n }\n\n try {\n this._connectionStatus.update(() => \"connecting\");\n this.logger.log(LogLevel.DEBUG, \"Connecting to\", url);\n this.logger.log(LogLevel.DEBUG, \"Connection options\", options);\n\n const noVncCredentials: NoVncOptions = {\n credentials: {\n password: options?.credentials?.accessTicket || options?.credentials?.password || \"\",\n // explicitly not supporting these for now\n username: \"\",\n target: \"\"\n },\n };\n\n this.logger.log(LogLevel.DEBUG, \"Connecting...\", noVncCredentials);\n let client = new NoVncClient(options.hostElement, url, noVncCredentials);\n\n this.logger.log(LogLevel.DEBUG, \"Client instantiated. Configuring...\");\n client = this.doPreConnectionConfig(client);\n this.logger.log(LogLevel.DEBUG, \"Pre-connection config done.\");\n\n client.addEventListener(\"connect\", () => {\n this._connectionStatus.update(() => \"connected\");\n this.logger.log(LogLevel.DEBUG, \"Connected. Performing post-connection configuration...\");\n\n // do other post-connection config\n this.noVncClient = this.doPostConnectionConfig(client, options);\n this.logger.log(LogLevel.DEBUG, \"Post-connection config done. Resolving supported features...\");\n\n // the vnc client knows its capabilities post-connection\n // so send this back along with the things we know we can't support\n const supportedFeatures: ConsoleSupportedFeatures = {\n clipboardAutomaticLocalCopy: true,\n clipboardRemoteWrite: true,\n onScreenKeyboard: false,\n powerManagement: this.noVncClient.capabilities.power,\n viewOnlyMode: true\n };\n\n this._supportedFeatures.update(() => supportedFeatures);\n this.noVncClient = client;\n\n this.logger.log(LogLevel.DEBUG, \"Supported features resolved. Connection complete!\");\n });\n }\n catch (err) {\n this._connectionStatus.update(() => \"disconnected\");\n this.logger.log(LogLevel.ERROR, \"Connection error\", err);\n throw err;\n }\n }\n\n public async disconnect(): Promise<void> {\n this.logger.log(LogLevel.DEBUG, \"Manual disconnection requested\");\n return this.handleDisconnect(true);\n }\n\n public dispose(): Promise<void> {\n return this.disconnect();\n }\n\n public async sendClipboardText(text: string) {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't send clipboard text.\");\n }\n\n this.noVncClient.clipboardPasteFrom(text);\n this._consoleClipboardUpdated.update(() => text);\n }\n\n public async sendCtrlAltDelete(): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't send Ctrl+Alt+Delete.\");\n }\n\n this.noVncClient.sendCtrlAltDel();\n }\n\n public async sendKeyboardInput(text: string): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't send keyboard input.\");\n }\n\n // split by line and remove empties\n const lines = text\n .split(/\\r?\\n|\\r|\\n/g)\n .map(line => line.trim())\n .filter(line => !!line);\n\n this.logger.log(LogLevel.INFO, \"Sending lines\", lines);\n\n for (let i = 0; i < lines.length; i++) {\n const lineCharacters = lines[i].split(\"\");\n\n for (const chr of lineCharacters) {\n this.noVncClient.sendKey(chr.charCodeAt(0), null);\n }\n\n if ((i + 1) < lines.length) {\n // send \"return\" between lines\n this.noVncClient.sendKey(0xFF0D, null);\n }\n }\n }\n\n public async sendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(`VNC client isn't connected; can't send power request \"${request}\"`);\n }\n\n if (!this.noVncClient.capabilities.power) {\n throw new Error(`The machine you're connected to over VNC doesn't have the \"power\" capability, so reboots, resets, and shutdowns aren't permitted.`);\n }\n\n switch (request) {\n case \"reboot\":\n this.noVncClient.machineReboot();\n return;\n case \"rebootHard\":\n this.noVncClient.machineReset();\n return;\n case \"shutdown\":\n this.noVncClient.machineShutdown();\n return;\n }\n }\n\n public async setIsViewOnly(isViewOnly: boolean): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't set properties\");\n }\n\n this.noVncClient.viewOnly = isViewOnly;\n }\n\n public async setPreserveAspectRatioOnScale(preserve: boolean): Promise<void> {\n if (!this.noVncClient) {\n throw new Error(\"VNC client isn't connected; can't set properties\");\n }\n\n this.logger.log(LogLevel.DEBUG, \"Set preserve aspect ratio to\", preserve);\n this.noVncClient.scaleViewport = preserve;\n }\n\n private doPreConnectionConfig(client: NoVncClient): NoVncClient {\n client.addEventListener(\"connect\", () => {\n this.logger.log(LogLevel.INFO, \"Connected!\");\n this._connectionStatus.update(() => \"connected\");\n });\n client.addEventListener(\"disconnect\", ev => this.handleDisconnect(ev.detail.clean));\n client.addEventListener(\"clipboard\", ev => {\n // emit the event\n this._consoleClipboardUpdated.update(() => ev.detail.text);\n\n // if enabled at the app level and permitted by the user, automatically copy text to local clipboard\n if (this.cfConfig.disabledFeatures.clipboard) {\n this.logger.log(LogLevel.INFO, \"The remote console tried to copy text to the local clipboard, but local clipboard access is disabled in ConsoleForge's configuration.\");\n return;\n }\n\n const currentUserSettings = this.userSettings.settings();\n if (!currentUserSettings.console.allowCopyToLocalClipboard) {\n this.logger.log(LogLevel.INFO, \"The remote console tried to copy text to the local clipboard, but you've disabled local clipboard copy. Use ConsoleForge's settings to allow it to copy text to your local clipboard.\");\n return;\n }\n\n if (ev.detail.text) {\n this.clipboardService.copyText(ev.detail.text);\n }\n });\n\n return client;\n }\n\n private doPostConnectionConfig(client: NoVncClient, options: ConsoleConnectionOptions): NoVncClient {\n client.background = options.backgroundStyle || \"\";\n client.resizeSession = this.userSettings.settings().console.preserveAspectRatioOnScale;\n\n // try focus if requested\n if (options.autoFocusOnConnect) {\n client.focus();\n }\n\n return client;\n }\n\n private handleDisconnect(isManualDisconnect: boolean) {\n this.logger.log(LogLevel.INFO, \"Disconnected. Manual?\", isManualDisconnect);\n this._connectionStatus.update(() => \"disconnected\");\n\n if (!isManualDisconnect) {\n this.logger.log(LogLevel.WARNING, \"Unexpected disconnection\");\n }\n\n if (this.noVncClient) {\n this.noVncClient = undefined;\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { WmksConnectionState, WmksEvents, WmksPosition, WmksSettableOptions } from \"./vmware-mks.models\";\n\nfunction resolveWMKSLib(): WMKS {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return (window as any).WMKS;\n}\n\nexport function createWmksClient(hostElementId: string, options?: WmksClientCreateOptions): WmksClient {\n const result = resolveWMKSLib();\n return result.createWMKS(hostElementId, options);\n}\n\nexport interface WmksClient {\n connect(url: string): Promise<void>;\n destroy(): void;\n disconnect(): void;\n\n getConnectionState(): WmksConnectionState;\n\n /**\n * This function is not documented by Broadcom but seems to exist and may be strictly related to\n * focus on the virtual console OR clipboard reading OR both OR neither.\n */\n grab(): void;\n\n register(event: WmksEvents, handler: WmksEventHandler): WmksClient;\n\n /**\n * Sends a Ctrl+Alt+Del key combination to the remote machine.\n */\n sendCAD(): void;\n\n /**\n * Sends a string as keyboard input to the server.\n */\n sendInputString(input: string): void;\n\n /**\n * Set an option WMKS client.\n * \n * @param option - which option's value to update.\n * @param value - a boolean value enabling/disabling the option.\n */\n setOption(option: WmksSettableOptions, value: boolean): void;\n\n showKeyboard(): void;\n\n /**\n * Forcibly remove focus from the remote console (I think)\n */\n ungrab(): void;\n\n /**\n * Broadcom's description: Changes the resolution or rescales the remote screen to match the container size. Behavior depends on settings for changeResolution, rescale, and position options described in createMKS Options.\n * \n * See: https://techdocs.broadcom.com/us/en/vmware-cis/vsphere/vsphere-sdks-tools/8-0/html-console-sdk-programming-guide/html-console-sdk-api/display-related-apis.html\n */\n updateScreen(): void;\n}\n\nexport interface WmksClientCreateOptions {\n changeResolution?: boolean;\n position?: WmksPosition;\n\n /**\n * Indicates whether to rescale the remote screen to fit the container size. (Defaults to true)\n */\n rescale?: boolean;\n useNativePixels?: boolean;\n useVNCHandshake?: boolean;\n}\n\nexport interface WMKS {\n get version(): string;\n\n /**\n * Create a client which connects to a remote console hosted on a VMWare cluster.\n * \n * @param hostElementId The ID of a DOM element that will have a canvas injected into it by Broadcom's HTML Console SDK upon successful connection.\n * @param options Options which identify and specify the behavior of the virtual console.\n */\n createWMKS(hostElementId: string, options?: WmksClientCreateOptions): WmksClient;\n}\n\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WmksEventHandler = (e: any, data: any) => void;\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport enum WmksAudioEncodingType {\n AAC = \"aac\",\n OPUS = \"opus\",\n VORBIS = \"vorbis\"\n}\n\nexport enum WmksConnectionState {\n CONNECTED = \"connected\",\n CONNECTING = \"connecting\",\n DISCONNECTED = \"disconnected\"\n}\n\nexport enum WmksErrorType {\n AUTHENTICATION_FAILED = \"authenticationfailed\",\n PROTOCOL_ERROR = \"protocolerror\",\n WEBSOCKET_ERROR = \"websocketerror\"\n}\n\nexport enum WmksEvents {\n AUDIO = \"audio\",\n CONNECTION_STATE_CHANGE = \"connectionstatechange\",\n COPY = \"copy\",\n ERROR = \"error\",\n FULL_SCREEN_CHANGE = \"fullscreenchange\",\n HEARTBEAT = \"heartbeat\",\n KEYBOARD_LEDS_CHANGE = \"keyboardledschanged\",\n REMOTE_SCREEN_SIZE_CHANGE = \"screensizechange\",\n TOGGLE = \"toggle\"\n}\n\nexport interface WmksEventData {\n state: WmksConnectionState;\n}\n\nexport enum WmksPosition {\n CENTER = 0,\n LEFT_TOP = 1\n}\n\nexport type WmksSettableOptions = \"changeResolution\" | \"position\" | \"rescale\"\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\nimport { takeUntilDestroyed } from \"@angular/core/rxjs-interop\"\nimport { debounceTime, Subject } from 'rxjs';\nimport { ConsoleClientService } from '../console-client.service';\nimport { LoggerService } from '../../logger.service';\nimport { ConsoleConnectionOptions } from '../../../models/console-connection-options';\nimport { ConsoleConnectionStatus } from '../../../models/console-connection-status';\nimport { ConsolePowerRequest } from '../../../models/console-power-request';\nimport { ConsoleSupportedFeatures } from '../../../models/console-supported-features';\nimport { LogLevel } from '../../../models/log-level';\nimport { createWmksClient, WmksClient } from \"../../../shims/vmware-wmks.shim\";\nimport { WmksConnectionState, WmksEvents, WmksPosition } from '../../../shims/vmware-mks.models';\nimport { WINDOW } from '../../../injection/window.injection-token';\nimport { ClipboardService } from '../../clipboard/clipboard.service';\nimport { ConsoleForgeConfig } from '../../../config/console-forge-config';\nimport { UserSettingsService } from '../../user-settings.service';\nimport { ConsoleClientType } from '../../../models/console-client-type';\n\n@Injectable({ providedIn: 'root' })\nexport class VmWareConsoleClientService implements ConsoleClientService {\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly clipboardService = inject(ClipboardService);\n private readonly logger = inject(LoggerService);\n private readonly document = inject(DOCUMENT);\n private readonly userSettings = inject(UserSettingsService);\n private readonly window = inject(WINDOW);\n private wmksClient?: WmksClient;\n\n public readonly clientType: ConsoleClientType = \"vmware\";\n private readonly _connectionStatus = signal<ConsoleConnectionStatus>(\"disconnected\")\n public readonly connectionStatus = this._connectionStatus.asReadonly();\n\n private readonly _consoleClipboardUpdated = signal<string>(\"\");\n public readonly consoleClipboardUpdated = this._consoleClipboardUpdated.asReadonly();\n\n private readonly _supportedFeatures = signal<ConsoleSupportedFeatures>({\n clipboardAutomaticLocalCopy: false,\n clipboardRemoteWrite: false,\n onScreenKeyboard: true,\n powerManagement: false,\n viewOnlyMode: false\n });\n public readonly supportedFeatures = this._supportedFeatures.asReadonly();\n\n private readonly _needsCanvasSizeUpdate = new Subject<void>();\n private readonly _needsCanvasSizeUpdateSub = this._needsCanvasSizeUpdate.pipe(\n debounceTime(250),\n takeUntilDestroyed()\n ).subscribe(() => {\n if (this.wmksClient) {\n this.logger.log(LogLevel.DEBUG, \"Document size change, updating canvas\");\n\n if (this.wmksClient && this.wmksClient.getConnectionState() == \"connected\") {\n this.wmksClient.updateScreen();\n }\n }\n });\n\n public connect(url: string, options: ConsoleConnectionOptions): Promise<void> {\n if (!options.hostElement) {\n throw new Error(\"A host element is required to connect to a VMWare WMKS console.\");\n }\n\n return new Promise((resolve, reject) => {\n this.wmksClient = createWmksClient(options.hostElement.id, {\n changeResolution: true,\n rescale: true,\n useNativePixels: true,\n useVNCHandshake: false,\n position: WmksPosition.CENTER\n })\n .register(WmksEvents.CONNECTION_STATE_CHANGE, (ev, data) => {\n this.logger.log(LogLevel.DEBUG, \"WMKS state change\", ev, data);\n\n if (data.state === WmksConnectionState.DISCONNECTED) {\n this._connectionStatus.update(() => \"disconnected\");\n this.doPostDisconnectionConfig();\n reject();\n }\n\n if (data.state === WmksConnectionState.CONNECTED) {\n this.logger.log(LogLevel.DEBUG, \"WMKS confirms connection\", this.wmksClient);\n this.doPostConnectionConfig(options.hostElement);\n this._supportedFeatures.update(() => ({\n clipboardAutomaticLocalCopy: false,\n clipboardRemoteWrite: false,\n onScreenKeyboard: true,\n powerManagement: false,\n viewOnlyMode: false\n }))\n this._connectionStatus.update(() => \"connected\");\n resolve();\n }\n })\n .register(WmksEvents.COPY, (ev, data) => {\n this.logger.log(LogLevel.DEBUG, \"Clipboard data available\", ev, data);\n\n // emit the event\n this._consoleClipboardUpdated.update(() => data);\n\n // if enabled in config and permitted by the user, copy text to local clipboard\n if (!this.cfConfig.disabledFeatures.clipboard && this.userSettings.settings().console.allowCopyToLocalClipboard) {\n this.clipboardService.copyText(data);\n }\n })\n .register(WmksEvents.ERROR, (ev, data) => {\n this.logger.log(LogLevel.ERROR, \"Error from WMKS:\", ev, data);\n })\n // as far as i can tell, this never happens\n .register(WmksEvents.HEARTBEAT, (ev, data) => this.logger.log(LogLevel.DEBUG, \"WMKS heartbeat\", ev, data))\n .register(WmksEvents.REMOTE_SCREEN_SIZE_CHANGE, (ev, data) => {\n if (!this.wmksClient) {\n return;\n }\n\n this.logger.log(LogLevel.DEBUG, \"Remote screen size change\", ev, data);\n this.wmksClient.updateScreen();\n })\n .register(WmksEvents.TOGGLE, (ev, data) => {\n this.logger.log(LogLevel.DEBUG, \"Visible devices toggle\", ev, data);\n });\n\n this.wmksClient.connect(url);\n });\n }\n\n public disconnect(): Promise<void> {\n if (this.wmksClient) {\n this.wmksClient.disconnect();\n this.wmksClient = undefined;\n }\n\n return Promise.resolve();\n }\n\n async sendClipboardText(text: string): Promise<void> {\n throw new Error(`Can't send clipboard text to VMWare-based consoles. (text: ${text})`);\n }\n\n public sendCtrlAltDelete(): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n if (!this.wmksClient) {\n throw new Error(\"Couldn't resolve client; can't send Ctrl+Alt+Del\");\n }\n\n this.wmksClient.sendCAD();\n resolve();\n }\n catch (err) {\n reject(err)\n }\n });\n }\n\n public async sendKeyboardInput(text: string): Promise<void> {\n if (!this.wmksClient) {\n throw new Error(\"Can't resolve WMKS client; can't send clipboard text.\");\n }\n\n const lines = text.trim().split(\"\\n\");\n if (lines.length === 1) {\n this.wmksClient.sendInputString(lines[0])\n } else {\n for (const line of text.split(\"\\n\")) {\n this.wmksClient.sendInputString(`${line}\\n`);\n await new Promise(r => setTimeout(r, 40));\n }\n }\n }\n\n public sendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n return Promise.reject(`Power management request aren't supported for VMWare consoles. (rejected request: \"${request}\")`);\n }\n\n public setIsViewOnly(isViewOnly: boolean): Promise<void> {\n this.logger.log(LogLevel.INFO, \"A 'view-only' request was issued, but this isn't directly supported at the protocol level for VMWare. The ConsoleComponent will do its best to make the console canvas view-only. Request:\", isViewOnly);\n return Promise.resolve();\n }\n\n public setPreserveAspectRatioOnScale(scaleToContainerSize: boolean): Promise<void> {\n return new Promise((resolve, reject) => {\n try {\n if (!this.wmksClient) {\n throw new Error(\"Couldn't resolve client; can't set option\");\n }\n\n this.wmksClient.setOption(\"rescale\", scaleToContainerSize);\n resolve();\n }\n catch (err) {\n reject(err);\n }\n });\n }\n\n public dispose(): Promise<void> {\n if (this.wmksClient) {\n this.wmksClient.destroy();\n this.wmksClient = undefined;\n }\n\n return Promise.resolve();\n }\n\n private doPostConnectionConfig(hostElement: HTMLElement) {\n if (!this.document) {\n this.logger.log(LogLevel.WARNING, \"Couldn't resolve the document for host event listening.\");\n }\n\n this.document.addEventListener(\"fullscreenchange\", this.handleWindowSizeChange.bind(this));\n this.document.addEventListener(\"resize\", this.handleWindowSizeChange.bind(this));\n\n if (!this.window) {\n this.logger.log(LogLevel.WARNING, \"Couldn't resolve the window for host event listening.\");\n }\n\n this.window.addEventListener(\"resize\", this.handleWindowSizeChange.bind(this));\n\n // also listen for canvas events i guess because it matters or something i hate everything\n const canvas = hostElement.querySelector(\"canvas\");\n if (canvas) {\n canvas.addEventListener(\"blur\", () => {\n if (this.wmksClient) {\n this.wmksClient.ungrab();\n }\n });\n\n canvas.addEventListener(\"focus\", () => {\n if (this.wmksClient) {\n this.wmksClient.grab();\n }\n })\n }\n }\n\n private doPostDisconnectionConfig() {\n this.document.removeEventListener(\"fullscreenchange\", this.handleWindowSizeChange.bind(this));\n this.document.removeEventListener(\"resize\", this.handleWindowSizeChange.bind(this));\n }\n\n private handleWindowSizeChange() {\n this._needsCanvasSizeUpdate.next();\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable, Injector } from '@angular/core';\nimport { ConsoleClientService } from './console-client.service';\nimport { ConsoleClientType } from '../../models/console-client-type';\nimport { VncConsoleClientService } from './vnc-console-client/vnc-console-client.service';\nimport { VmWareConsoleClientService } from './vmware/vmware-console-client.service';\n\n@Injectable({ providedIn: 'root' })\nexport class ConsoleClientFactoryService {\n private injector = inject(Injector);\n\n get(consoleClientType: ConsoleClientType): ConsoleClientService {\n switch (consoleClientType) {\n case \"vmware\": {\n const client = this.injector.get(VmWareConsoleClientService);\n if (!client) {\n throw new Error(`Couldn't resolve instance from injector token ${VmWareConsoleClientService}`);\n }\n\n return client;\n }\n case \"vnc\": {\n const client = this.injector.get(VncConsoleClientService);\n if (!client) {\n throw new Error(`Couldn't resolve instance from injector token ${VncConsoleClientService}`);\n }\n\n return client;\n }\n default:\n throw new Error(`Console type ${consoleClientType} NYI`);\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class UuidService {\n get(): `${string}-${string}-${string}-${string}-${string}` {\n if (!crypto) {\n throw new Error(\"Failed to generate UUID: Can't resolve the `crypto` dependency in this environment.\");\n }\n\n return crypto.randomUUID();\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable, signal } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class FullScreenService {\n private doc = inject(DOCUMENT);\n\n private readonly _isAvailable = signal(this.doc.fullscreenEnabled);\n public readonly isAvailable = this._isAvailable.asReadonly();\n\n constructor() {\n this.doc.addEventListener(\"fullscreenchange\", () => {\n this._isAvailable.update(() => this.doc.fullscreenEnabled && !this.doc.fullscreenElement);\n });\n this.doc.addEventListener(\"fullscreenerror\", () => {\n this._isAvailable.update(() => this.doc.fullscreenEnabled && !this.doc.fullscreenElement);\n });\n }\n\n public async exitFullscreen(): Promise<void> {\n return this.doc.exitFullscreen();\n }\n\n public async tryFullscreen(element: Element): Promise<void> {\n return element.requestFullscreen({ navigationUI: \"hide\" });\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { CanvasRecordingSettings } from \"./canvas-recording-settings\";\n\nexport class CanvasRecording {\n private readonly chunks: Blob[] = [];\n private readonly mimeType: string;\n private readonly recorder: MediaRecorder;\n private readonly window: Window;\n\n // Stopping is a bit tricky.\n //\n // The MediaRecorder doesn't guarantee the validity of the emitted blob until `onstop` is fired. This means that when someone\n // calls in to stop the recording, we need to create a (deferred) promise that `.onstop` can resolve when it fires successfully.\n //\n //\n // We store the promise at the class level, because we should only ever have one of them (set when .stop` is called). But we also\n // store the \"resolve\" call here, because its value is set in `.stop` but consumed in the `.onstop` event of the recorder.\n private stopPromise?: Promise<Blob>;\n private stopResolveFn?: (blob: Blob) => void;\n\n public readonly settings: CanvasRecordingSettings;\n\n constructor(settings: CanvasRecordingSettings) {\n this.settings = settings;\n this.mimeType = settings.mimeType;\n this.recorder = new MediaRecorder(settings.stream, { mimeType: settings.mimeType });\n this.window = settings.window;\n\n // pipe the output of the recorder into the local chunks array\n this.recorder.ondataavailable = ev => this.chunks.push(ev.data);\n this.recorder.onerror = (ev) => {\n throw (ev.error);\n }\n this.recorder.onstop = () => {\n // the \"resolve\" is set at the class level by the `.stop` method for access here\n if (this.stopResolveFn) {\n const blob = new Blob(this.chunks, { type: this.mimeType });\n this.stopResolveFn(blob);\n this.stopResolveFn = undefined;\n\n // the settings have an OnStop callback that should be invoked so\n // the service constructing these things can know if any are going on\n this.settings.onStopCallback();\n }\n }\n this.recorder.start(settings.chunkLength);\n }\n\n public stop(): Promise<Blob> {\n if (this.stopPromise) {\n // if defined, stop's already been called, so we \n // want to give back the same promise\n return this.stopPromise;\n }\n\n // record the stop promise we're about to send back, so we can return it to\n // anyone who calls .stop again by mistake\n this.stopPromise = new Promise(resolve => this.stopResolveFn = resolve);\n\n // stop the recorder and return\n this.recorder.stop();\n return this.stopPromise;\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable, signal } from '@angular/core';\nimport { CanvasRecording } from './canvas-recording';\nimport { WINDOW } from '../../injection/window.injection-token';\nimport { UuidService } from '../uuid.service';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\n\n@Injectable({ providedIn: 'root' })\nexport class CanvasRecorderService {\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly uuids = inject(UuidService);\n private readonly window = inject(WINDOW);\n\n private readonly activeRecordings = new Set<CanvasRecording>();\n private readonly _isRecording = signal<boolean>(false);\n public readonly isRecording = this._isRecording.asReadonly();\n\n public startRecord(canvas: HTMLCanvasElement): CanvasRecording {\n if (this.cfConfig.disabledFeatures.consoleScreenRecord) {\n throw new Error(\"Console recording has been disabled in ConsoleForge.\");\n }\n\n const recording = new CanvasRecording({\n id: this.uuids.get(),\n stream: canvas.captureStream(this.cfConfig.canvasRecording.frameRate || 25),\n window: this.window,\n chunkLength: this.cfConfig.canvasRecording.chunkLength || 1000,\n maxDuration: this.cfConfig.canvasRecording.maxDuration || 60000,\n mimeType: this.cfConfig.canvasRecording.mimeType || \"video/webm\",\n onStopCallback: () => this.recordingStopped(recording)\n });\n\n this.activeRecordings.add(recording);\n this._isRecording.set(true);\n return recording;\n }\n\n private recordingStopped(recording: CanvasRecording) {\n this.activeRecordings.delete(recording);\n this._isRecording.set(this.activeRecordings.size > 0)\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Injectable, signal } from '@angular/core';\n\n// EXPLICITLY not provided in root - this is provided by ConsoleComponent,\n// and each should get its own\n@Injectable()\nexport class CanvasService {\n private readonly _canvas = signal<HTMLCanvasElement | null>(null);\n public readonly canvas = this._canvas.asReadonly();\n\n clearCanvas() {\n this._canvas.update(() => null);\n }\n\n setCanvas(canvas: HTMLCanvasElement) {\n this._canvas.update(() => canvas);\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { inject, Injectable } from '@angular/core';\n\n@Injectable({ providedIn: 'root' })\nexport class BlobDownloaderService {\n private readonly doc = inject(DOCUMENT);\n\n download(blob: Blob, fileName: string) {\n const url = URL.createObjectURL(blob);\n const a = this.doc.createElement(\"a\");\n a.href = url;\n a.download = fileName;\n a.style.display = \"none\";\n this.doc.body.appendChild(a);\n a.click();\n this.doc.body.removeChild(a);\n URL.revokeObjectURL(url); // free memory\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { CommonModule } from '@angular/common';\nimport { Component, computed, inject, input, output, signal, Type } from '@angular/core';\nimport { ClipboardService } from '../../services/clipboard/clipboard.service';\nimport { ConsoleClientService } from '../../services/console-clients/console-client.service';\nimport { FullScreenService } from '../../services/full-screen.service';\nimport { ConsoleToolbarContext } from '../../models/console-toolbar-context';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { ConsoleToolbarComponentBase } from '../../models/console-toolbar-component-base';\nimport { CanvasRecorderService } from '../../services/canvas-recorder/canvas-recorder.service';\nimport { LoggerService } from '../../services/logger.service';\nimport { LogLevel } from '../../models/log-level';\nimport { CanvasRecording } from '../../services/canvas-recorder/canvas-recording';\nimport { ConsolePowerRequest } from '../../models/console-power-request';\nimport { ConsoleComponentNetworkConfig } from '../../models/console-component-network-config';\nimport { UserSettingsService } from '../../services/user-settings.service';\nimport { CanvasService } from '../../services/canvas.service';\nimport { BlobDownloaderService } from '../../services/blob-downloader.service';\nimport { WINDOW } from '../../injection/window.injection-token';\n\n@Component({\n selector: 'cf-console-toolbar',\n imports: [CommonModule],\n templateUrl: './console-toolbar.component.html',\n styleUrl: './console-toolbar.component.scss'\n})\nexport class ConsoleToolbarComponent {\n consoleClient = input.required<ConsoleClientService>();\n consoleNetworkConfig = input<ConsoleComponentNetworkConfig>();\n customToolbarComponent = input<Type<ConsoleToolbarComponentBase>>();\n isViewOnly = input.required<boolean>();\n\n canvasRecordingStarted = output<void>();\n canvasRecordingFinished = output<Blob>();\n ctrlAltDelSent = output<void>();\n keyboardInputSent = output<string>();\n networkConnectionRequested = output<string>();\n networkDisconnectRequested = output<void>();\n powerRequestSent = output<ConsolePowerRequest>();\n reconnectRequestSent = output<void>();\n screenshotCopied = output<Blob>();\n toggleFullscreen = output<void>();\n\n private readonly blobDownloader = inject(BlobDownloaderService);\n private readonly canvas = inject(CanvasService);\n private readonly canvasRecorder = inject(CanvasRecorderService);\n private readonly clipboardService = inject(ClipboardService);\n private readonly config = inject(ConsoleForgeConfig);\n private readonly logger = inject(LoggerService);\n private readonly userSettings = inject(UserSettingsService);\n private readonly window = inject(WINDOW);\n\n // component state\n private readonly activeConsoleRecording = signal<{ recording: CanvasRecording, timeoutRef?: number } | undefined>(undefined);\n private readonly isManualConsoleReconnectAvailable = computed(() => !this.config.disabledFeatures.manualConsoleReconnect && this.consoleClient()?.connectionStatus() !== \"connecting\");\n protected readonly toolbarComponentContext: ConsoleToolbarContext;\n protected readonly toolbarComponent = computed(() => this.customToolbarComponent() || this.config.toolbar.component);\n\n constructor() {\n this.toolbarComponentContext = {\n clipboard: {\n consoleClipboardText: computed(() => this.consoleClient()?.consoleClipboardUpdated()),\n sendTextToConsoleClipboard: this.handleSendTextToClipboard.bind(this)\n },\n console: {\n copyScreenshot: this.handleCopyScreenshot.bind(this),\n recordScreenStart: this.handleRecordScreenStart.bind(this),\n recordScreenStop: this.handleRecordScreenStop.bind(this),\n sendCtrlAltDel: this.handleSendCtrlAltDelete.bind(this),\n sendKeyboardInput: this.handleKeyboardInputSend.bind(this),\n sendPowerRequest: this.handleSendPowerRequest.bind(this),\n sendReconnectRequest: this.handleReconnectRequestSent.bind(this),\n supportedFeatures: computed(() => this.consoleClient()?.supportedFeatures() || {}),\n toggleFullscreen: this.handleFullscreen.bind(this)\n },\n networks: {\n config: this.consoleNetworkConfig,\n connectionRequested: this.handleNetworkConnectionRequest.bind(this),\n disconnectRequested: () => this.networkDisconnectRequested.emit(),\n },\n state: {\n activeConsoleRecording: computed(() => this.activeConsoleRecording()?.recording),\n isConnected: computed(() => this.consoleClient() && this.consoleClient().connectionStatus() === \"connected\"),\n isFullscreenAvailable: inject(FullScreenService).isAvailable,\n isManualReconnectAvailable: this.isManualConsoleReconnectAvailable,\n isRecordingAvailable: computed(() => !!this.canvas.canvas()),\n isViewOnly: this.isViewOnly\n },\n userSettings: this.userSettings\n };\n }\n\n protected async handleCopyScreenshot() {\n if (!this.canvas.canvas()) {\n throw new Error(\"Couldn't resolve the canvas; can't copy screenshot.\");\n }\n\n this.canvas.canvas()!.toBlob(blob => {\n if (!blob) {\n throw new Error(\"Couldn't resolve canvas blob.\");\n }\n\n this.clipboardService.copyBlob(blob);\n this.screenshotCopied.emit(blob);\n })\n }\n\n protected handleFullscreen(): Promise<void> {\n this.toggleFullscreen.emit();\n return Promise.resolve();\n }\n\n protected async handleKeyboardInputSend(text: string): Promise<void> {\n await this.consoleClient().sendKeyboardInput(text);\n this.keyboardInputSent.emit(text);\n }\n\n protected handleNetworkConnectionRequest(networkName: string) {\n const availableNetworks = this.consoleNetworkConfig()?.available || [];\n if (availableNetworks.indexOf(networkName) === -1) {\n throw new Error(`Network ${networkName} is not available to this console.`);\n }\n\n this.networkConnectionRequested.emit(networkName);\n }\n\n protected handleReconnectRequestSent(): Promise<void> {\n this.logger.log(LogLevel.DEBUG, \"Manual reconnect request from toolbar\");\n\n if (!this.isManualConsoleReconnectAvailable()) {\n return Promise.reject(\"Manual console reconnection is unavailable.\");\n }\n\n this.reconnectRequestSent.emit();\n return Promise.resolve();\n }\n\n protected handleRecordScreenStart(): void {\n if (!this.canvas.canvas()) {\n throw new Error(\"Can't resolve canvas for recording\");\n }\n\n this.logger.log(LogLevel.DEBUG, \"Recording canvas\", this.canvas.canvas());\n const recordingInstance = this.canvasRecorder.startRecord(this.canvas.canvas()!);\n\n // set a timeout listener if a max duration is configured in the lib\n let timeoutRef: number | undefined = undefined;\n if (this.config.canvasRecording?.maxDuration) {\n timeoutRef = this.window.setTimeout(() => this.handleRecordScreenStop(), this.config.canvasRecording.maxDuration);\n }\n\n this.activeConsoleRecording.update(() => ({\n recording: recordingInstance,\n timeoutRef: timeoutRef\n }));\n this.canvasRecordingStarted.emit();\n }\n\n protected async handleRecordScreenStop(): Promise<Blob> {\n if (!this.activeConsoleRecording()) {\n throw new Error(\"There is no active console recording - unable to stop and emit recorded data.\");\n }\n\n this.logger.log(LogLevel.DEBUG, \"Recording stopped.\");\n const recording = await this.activeConsoleRecording()!.recording.stop();\n this.activeConsoleRecording.update(() => undefined);\n\n // if configured, automatically offer a download\n if (recording && this.config.canvasRecording.autoDownloadCompletedRecordings) {\n this.blobDownloader.download(recording, \"your-console-recording.webm\");\n }\n\n this.canvasRecordingFinished.emit(recording);\n this.logger.log(LogLevel.DEBUG, \"Recording emitted.\");\n return recording;\n }\n\n protected handleSendCtrlAltDelete() {\n this.consoleClient().sendCtrlAltDelete();\n this.ctrlAltDelSent.emit();\n return Promise.resolve();\n }\n\n private async handleSendPowerRequest(request: ConsolePowerRequest): Promise<void> {\n this.consoleClient().sendPowerRequest(request);\n this.powerRequestSent.emit(request);\n return Promise.resolve();\n }\n\n protected async handleSendTextToClipboard(text: string) {\n if (text) {\n this.consoleClient().sendClipboardText(text);\n }\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n@if (toolbarComponent()) {\n<ng-container *ngComponentOutlet=\"toolbarComponent()!; inputs: { 'consoleContext': toolbarComponentContext }\" />\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { inject, Injectable } from '@angular/core';\nimport { WINDOW } from '../../injection/window.injection-token';\nimport { SendBrowserNotificationArgs } from './send-browser-notification';\nimport { LoggerService } from '../logger.service';\nimport { LogLevel } from '../../models/log-level';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\n\n@Injectable({ providedIn: 'root' })\nexport class BrowserNotificationsService {\n private config = inject(ConsoleForgeConfig);\n private logger = inject(LoggerService);\n private window = inject(WINDOW);\n\n public async send(args: SendBrowserNotificationArgs): Promise<void> {\n if (!this.config.showBrowserNotificationsOnConsoleEvents) {\n return;\n }\n\n const hasBrowserPermission = await Notification.requestPermission();\n if (hasBrowserPermission == \"denied\") {\n this.logger.log(LogLevel.WARNING, \"Can't send notification - browser permission denied.\", args);\n }\n\n const notification = new Notification(args.title, {\n body: args.body,\n tag: args.tag,\n });\n\n this.logger.log(LogLevel.DEBUG, \"Send browser notification\", notification);\n if (args.href?.url) {\n notification.onclick = (ev) => {\n ev.preventDefault();\n this.window.open(args.href?.url, args.href?.target);\n }\n }\n }\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { AfterViewInit, Component, ElementRef, inject, input, output, ViewEncapsulation } from '@angular/core';\nimport { ConsoleConnectionStatus } from '../../models/console-connection-status';\nimport { PicoCssService } from '../../services/pico-css.service';\n\n@Component({\n selector: 'cf-console-status',\n templateUrl: './console-status.component.html',\n styleUrl: './console-status.component.scss',\n encapsulation: ViewEncapsulation.ShadowDom\n})\nexport class ConsoleStatusComponent implements AfterViewInit {\n status = input<ConsoleConnectionStatus | undefined>(\"disconnected\");\n reconnectRequest = output<void>();\n\n private readonly picoCssService = inject(PicoCssService);\n private readonly hostElement = inject(ElementRef<HTMLElement>);\n\n async ngAfterViewInit(): Promise<void> {\n // apply pico to the progress bar\n const sheet = await this.picoCssService.loadStyleSheet();\n\n if (this.hostElement.nativeElement.shadowRoot) {\n this.hostElement.nativeElement.shadowRoot.adoptedStyleSheets = [sheet];\n }\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n<div>\n @if (status() === \"connecting\") {\n <progress></progress>\n }\n @else if(!status() || status() == \"disconnected\") {\n <div class=\"disconnected-banner\" (click)=\"reconnectRequest.emit()\">\n Console disconnected\n </div>\n }\n</div>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { DOCUMENT } from '@angular/common';\nimport { Component, computed, effect, ElementRef, inject, input, OnDestroy, output, signal, Type, untracked, viewChild } from '@angular/core';\nimport { ConsoleComponentConfig } from '../../models/console-component-config';\nimport { ConsoleClientService } from '../../services/console-clients/console-client.service';\nimport { ConsoleClientFactoryService } from '../../services/console-clients/console-client-factory.service';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { getTextFromClipboardItem } from \"../../services/clipboard/clipboard.helpers\";\nimport { UuidService } from '../../services/uuid.service';\nimport { LoggerService } from '../../services/logger.service';\nimport { FullScreenService } from '../../services/full-screen.service';\nimport { LogLevel } from '../../models/log-level';\nimport { ConsoleToolbarComponent } from '../console-toolbar/console-toolbar.component';\nimport { ConsoleToolbarComponentBase } from '../../models/console-toolbar-component-base';\nimport { BrowserNotificationsService } from '../../services/browser-notifications/browser-notifications.service';\nimport { ConsoleStatusComponent } from '../console-status/console-status.component';\nimport { UserSettingsService } from '../../services/user-settings.service';\nimport { ConsolePowerRequest } from '../../models/console-power-request';\nimport { CanvasRecorderService } from '../../services/canvas-recorder/canvas-recorder.service';\nimport { ClipboardService } from '../../services/clipboard/clipboard.service';\nimport { ConsoleComponentNetworkConfig } from '../../models/console-component-network-config';\nimport { CanvasService } from '../../services/canvas.service';\nimport { ConsoleConnectionStatus } from '../../models/console-connection-status';\n\n@Component({\n selector: 'cf-console',\n standalone: true,\n imports: [\n ConsoleStatusComponent,\n ConsoleToolbarComponent\n ],\n providers: [\n // the console component has access to the canvas which is injected by \n CanvasService\n ],\n styleUrl: './console.component.scss',\n templateUrl: './console.component.html',\n})\nexport class ConsoleComponent implements OnDestroy {\n // component I/O\n autoConnect = input(true);\n config = input.required<ConsoleComponentConfig>();\n isViewOnly = input(false);\n networkConfig = input<ConsoleComponentNetworkConfig>();\n toolbarComponent = input<Type<ConsoleToolbarComponentBase>>();\n toolbarDisabled = input<boolean>(false);\n\n connectionStatusChanged = output<ConsoleConnectionStatus | undefined>();\n consoleClipboardUpdated = output<string>();\n consoleRecorded = output<Blob>();\n ctrlAltDelSent = output<void>();\n localClipboardUpdated = output<ClipboardItem>();\n networkConnectionRequested = output<string>();\n networkDisconnectRequested = output<void>();\n powerRequestSent = output<ConsolePowerRequest>();\n reconnectRequest = output<ConsoleComponentConfig>();\n screenshotCopied = output<Blob>();\n\n // services\n private readonly browserNotifications = inject(BrowserNotificationsService);\n private readonly canvasService = inject(CanvasService);\n private readonly clipboardService = inject(ClipboardService);\n private readonly consoleClientFactory = inject(ConsoleClientFactoryService);\n private readonly consoleForgeConfig = inject(ConsoleForgeConfig);\n private readonly document = inject(DOCUMENT);\n private readonly fullscreen = inject(FullScreenService);\n private readonly logger = inject(LoggerService);\n private readonly userSettingsService = inject(UserSettingsService);\n private readonly uuids = inject(UuidService);\n\n // viewkids\n protected readonly componentContainer = viewChild.required<ElementRef<HTMLElement>>(\"componentContainer\");\n protected readonly consoleHostElement = viewChild.required<ElementRef<HTMLElement>>(\"consoleHost\");\n\n // other component state\n protected readonly consoleClient = signal<ConsoleClientService | undefined>(undefined);\n protected readonly consoleHostBackgroundStyle = this.consoleForgeConfig.consoleBackgroundStyle;\n protected readonly consoleHostElementId = `cf-console-${this.uuids.get()}`;\n protected readonly isRecording = inject(CanvasRecorderService).isRecording;\n protected readonly toolbarEnabled = computed(() => {\n // toolbar is enabled if it hasn't been disabled locally or globally:\n return !(this.toolbarDisabled() || this.consoleForgeConfig.toolbar.disabled) &&\n // AND if a toolbar component has been specified either here or globally\n (this.toolbarComponent() || this.consoleForgeConfig.toolbar.component);\n });\n protected readonly userSettings = this.userSettingsService.settings;\n\n constructor() {\n // we need this component to emit from outputs or call the client when signals change, so an effect\n // is the recommended solution: https://github.com/angular/angular/issues/57208\n\n // when config is provided and autoconnect is on, attempt to automatically connect\n effect(() => {\n const currentConfig = this.config();\n if (this.autoConnect() && currentConfig) {\n this.logger.log(LogLevel.DEBUG, \"Autoconnect firing\", currentConfig);\n this.connect(currentConfig);\n }\n });\n\n // clipboard events\n effect(() => {\n if (this.consoleClient()) {\n this.consoleClipboardUpdated.emit(this.consoleClient()!.consoleClipboardUpdated());\n }\n });\n effect(() => {\n const clipboardItem = this.clipboardService.localClipboardContentWritten();\n\n if (clipboardItem) {\n this.localClipboardUpdated.emit(clipboardItem);\n getTextFromClipboardItem(clipboardItem).then(value => {\n if (value) {\n this.browserNotifications.send({ title: \"Copied to local clipboard\", body: value });\n }\n })\n }\n });\n effect(() => {\n // all supported console clients inject a canvas into the doc. We provide it to the canvas service so it\n // can be consumed by other components (e.g. the ConsoleToolbarComponent and its implementations)\n if (this.document && this.consoleClient() && this.consoleClient()!.connectionStatus() === \"connected\") {\n const canvas = this.resolveConsoleCanvas();\n if (canvas) {\n this.canvasService.setCanvas(canvas);\n } else {\n this.canvasService.clearCanvas();\n }\n }\n });\n\n // input changes\n effect(() => {\n if (this.consoleClient() && this.consoleClient()!.connectionStatus() === \"connected\") {\n this.consoleClient()!.setIsViewOnly(this.isViewOnly());\n\n // if view only mode is on, we need to flip the canvas's tab index\n if (!this.consoleClient()?.supportedFeatures().viewOnlyMode) {\n const canvas = this.canvasService.canvas();\n if (canvas) {\n canvas.tabIndex = this.isViewOnly() ? -1 : 0;\n }\n }\n }\n });\n\n // output emitters\n effect(() => {\n this.connectionStatusChanged.emit(this.consoleClient()?.connectionStatus());\n });\n\n // settings changes\n effect(() => {\n const currentSettings = this.userSettingsService.settings();\n if (this.consoleClient() && this.consoleClient()?.connectionStatus() === \"connected\") {\n this.consoleClient()!.setPreserveAspectRatioOnScale(currentSettings.console.preserveAspectRatioOnScale);\n }\n });\n }\n\n public async ngOnDestroy(): Promise<void> {\n if (this.consoleClient()) {\n await this.consoleClient()!.dispose();\n }\n }\n\n protected handleConsoleRecordingStarted(): Promise<void> {\n return this.browserNotifications.send({ title: \"Recording Console\", body: \"This console is being screen-recorded. Hit \\\"Record\\\" again to stop.\" })\n }\n\n protected async handleCtrlAltDelSent(): Promise<void> {\n this.ctrlAltDelSent.emit();\n await this.browserNotifications.send({ title: \"Ctrl + Alt + Del sent\", body: \"Sent a Ctrl + Alt + Del input to the remote machine.\" });\n }\n\n protected async handleFullscreen(): Promise<void> {\n if (!this.componentContainer()) {\n throw new Error(\"Can't manipulate fullscreen - can't find the host.\");\n }\n\n if (!this.fullscreen.isAvailable()) {\n await this.fullscreen.exitFullscreen();\n }\n else {\n await this.fullscreen.tryFullscreen(this.componentContainer().nativeElement);\n }\n }\n\n protected handleReconnectRequest() {\n this.reconnectRequest.emit(this.config());\n }\n\n protected async handleScreenshotCopied(screenshotData: Blob): Promise<Blob> {\n this.screenshotCopied.emit(screenshotData);\n await this.browserNotifications.send({ title: \"Screenshot copied\", body: \"A screenshot of this console has been copied to your clipboard.\" })\n return screenshotData;\n }\n\n // automatically invoked if autoConnect is on, but can also be manually invoked outside the component\n // if retrieved as a ViewChild or whatever\n // NOTE: we should really clean up this function and ensure that all signals it needs are passed to it as parameters. it's a little opaque,\n // but invoking this inside an effect above will cause it to happen whenever _any_ of its read effects change, and it reads a lot of them.\n public async connect(config: ConsoleComponentConfig) {\n this.logger.log(LogLevel.DEBUG, \"Connecting with config\", config);\n\n const currentConnectionStatus = untracked(() => this.consoleClient()?.connectionStatus());\n if (currentConnectionStatus !== undefined && currentConnectionStatus !== \"disconnected\") {\n const currentConsoleClient = untracked(() => this.consoleClient());\n\n if (currentConsoleClient) {\n await currentConsoleClient.disconnect();\n }\n }\n\n if (!config.url) {\n throw new Error(\"No url provided for console connection.\");\n }\n\n if (!this.consoleHostElement().nativeElement) {\n throw new Error(\"Couldn't resolve the console host before connection.\");\n }\n\n // resolve the console type from component settings + defaults\n const clientType = this.consoleForgeConfig.defaultConsoleClientType || config.consoleClientType;\n if (!clientType) {\n throw new Error(\"Couldn't resolve the console client type. Did you specify a default using provideConsoleForgeConfig or pass a console type to this component?\");\n }\n\n const client = this.consoleClientFactory.get(clientType);\n this.consoleClient.update(() => client);\n\n // connect\n this.consoleClient()!.connect(config.url, {\n autoFocusOnConnect: config.autoFocusOnConnect,\n credentials: config.credentials,\n hostElement: this.consoleHostElement().nativeElement,\n });\n }\n\n public async disconnect() {\n this.logger.log(LogLevel.DEBUG, \"Console component disconnect invoked.\");\n await this.consoleClient()?.disconnect();\n this.consoleClient.update(() => undefined);\n }\n\n private resolveConsoleCanvas() {\n if (!this.document) {\n return null;\n }\n\n return (this.document.querySelector(`#${this.consoleHostElementId} canvas`) as HTMLCanvasElement) || undefined;\n }\n}\n","<!-- ===BEGIN LICENSE=== -->\n<!-- Copyright 2025 Carnegie Mellon University. All rights reserved. -->\n<!-- Released under an MIT (SEI)-style license. See the LICENSE.md file for license information. -->\n<!-- ===END LICENSE=== -->\n\n<div #componentContainer class=\"console-component flex\"\n [class.console-client-type-vnc]=\"consoleClient()?.clientType == 'vnc'\"\n [class.console-client-type-vmware]=\"consoleClient()?.clientType == 'vmware'\"\n [class.flex-column]=\"userSettings().toolbar.dockTo === 'top' || userSettings().toolbar.dockTo === 'bottom'\">\n\n @if (toolbarEnabled()) {\n <cf-console-toolbar\n [class.flex-order-1]=\"userSettings().toolbar.dockTo === 'right' || userSettings().toolbar.dockTo === 'bottom'\"\n [consoleClient]=\"consoleClient()!\" [consoleNetworkConfig]=\"networkConfig()\" [isViewOnly]=\"isViewOnly()\"\n (canvasRecordingFinished)=\"consoleRecorded.emit($event)\"\n (canvasRecordingStarted)=\"handleConsoleRecordingStarted()\" [customToolbarComponent]=\"toolbarComponent()\"\n (ctrlAltDelSent)=\"handleCtrlAltDelSent()\" (networkConnectionRequested)=\"networkConnectionRequested.emit($event)\"\n (powerRequestSent)=\"powerRequestSent.emit($event)\"\n (networkDisconnectRequested)=\"networkDisconnectRequested.emit()\"\n (reconnectRequestSent)=\"handleReconnectRequest()\" (screenshotCopied)=\"handleScreenshotCopied($event)\"\n (toggleFullscreen)=\"handleFullscreen()\"></cf-console-toolbar>\n }\n\n <div class=\"console-host-container\" [style.background]=\"consoleHostBackgroundStyle\"\n [class.flex-order-0]=\"userSettings().toolbar.dockTo === 'right' || userSettings().toolbar.dockTo === 'bottom'\">\n <cf-console-status [status]=\"consoleClient()?.connectionStatus()\"\n (reconnectRequest)=\"reconnectRequest.emit(this.config())\"></cf-console-status>\n\n <div #consoleHost [id]=\"consoleHostElementId\" class=\"console-host\" [class.recording]=\"isRecording()\"\n [class.view-only]=\"isViewOnly()\">\n </div>\n </div>\n</div>\n","import { Component, computed, effect, ElementRef, inject, input, output, viewChild } from '@angular/core';\nimport { ConsoleStatusComponent } from '../console-status/console-status.component';\nimport { ConsoleComponentConfig } from '../../models/console-component-config';\nimport { ConsoleClientService } from '../../services/console-clients/console-client.service';\nimport { ConsoleForgeConfig } from '../../config/console-forge-config';\nimport { ConsoleClientFactoryService } from '../../services/console-clients/console-client-factory.service';\nimport { UuidService } from '../../services/uuid.service';\n\n@Component({\n selector: 'cf-console-tile',\n imports: [\n ConsoleStatusComponent\n ],\n templateUrl: './console-tile.component.html',\n styleUrl: './console-tile.component.scss'\n})\nexport class ConsoleTileComponent {\n public config = input<ConsoleComponentConfig>();\n public reconnectRequest = output<ConsoleComponentConfig | undefined>();\n\n private readonly cfConfig = inject(ConsoleForgeConfig);\n private readonly consoleClientFactory = inject(ConsoleClientFactoryService);\n private readonly consoleClientType = computed(() => this.config()?.consoleClientType || this.cfConfig.defaultConsoleClientType);\n private readonly consoleHostElement = viewChild<ElementRef<HTMLElement>>(\"consoleHost\");\n private readonly uuids = inject(UuidService);\n\n protected consoleClient?: ConsoleClientService;\n\n // even though nothing here explicitly references this, every console host element needs an ID\n // because the vmware client relies on the ID, not the element reference, to create its canvas\n protected consoleHostElementId = \"console-host-tile-\" + this.uuids.get();\n\n constructor() {\n effect(() => {\n if (this.config() && this.consoleHostElement() && !this.consoleClient) {\n this.connect(this.consoleHostElement()!.nativeElement);\n }\n });\n }\n\n private async connect(hostElement: HTMLElement) {\n const connectionConfig = this.config()!;\n\n if (!connectionConfig.url) {\n throw new Error(\"No url provided for console connection.\");\n }\n\n if (!hostElement) {\n throw new Error(\"Couldn't resolve the console host before connection.\");\n }\n\n this.consoleClient = this.consoleClientFactory.get(this.consoleClientType()!);\n await this.consoleClient.connect(connectionConfig.url, {\n autoFocusOnConnect: false,\n credentials: connectionConfig.credentials,\n hostElement: hostElement\n });\n\n this.consoleClient.setIsViewOnly(true);\n }\n}\n","<div class=\"console-tile-component\">\n <cf-console-status [status]=\"consoleClient?.connectionStatus()\"\n (reconnectRequest)=\"reconnectRequest.emit(this.config())\"></cf-console-status>\n\n <div #consoleHost [id]=\"consoleHostElementId\" class=\"console-host\">\n </div>\n</div>\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { ConsoleCredentials } from \"./console-credentials\";\nimport { ConsoleClientType } from \"./console-client-type\";\n\nexport interface ConsoleComponentConfig {\n /**\n * If true, the client will attempt to set control focus on the console session after connection. Defaults to false.\n */\n autoFocusOnConnect?: boolean;\n\n /**\n * Specifies the client that will be used to connect to the console (e.g. VNC, VMWare WMKS, etc.) Note that\n * you can configure a default for all ConsoleForge consoles in your app or module by using the `provideConsoleForgeConfig`\n * provider.\n */\n consoleClientType?: ConsoleClientType;\n\n /**\n * An optional identifier for this console. ConsoleForge doesn't use this value internally at all, but some of its events\n * (e.g. reconnect requests) will return this configuration to you. You may want to set this identifier to something that allows\n * you to uniquely identify the console so you can handle its events as desired.\n */\n consoleId?: string;\n\n /**\n * An optional username, password, or sessionId to use to authenticate to the console. Configuration here is specific\n * to the protocol being used and the configuration of the target virtual console. See ConsoleForge's documentation\n * for details.\n */\n credentials?: ConsoleCredentials;\n\n /**\n * The URL of the console's accessible web socket interface.\n */\n url: string;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { EnvironmentProviders, makeEnvironmentProviders } from \"@angular/core\";\nimport { ConsoleForgeConfig, defaultCfConfig } from \"./console-forge-config\";\nimport { ClipboardService } from \"../services/clipboard/clipboard.service\";\nimport { ConsoleClientFactoryService } from \"../services/console-clients/console-client-factory.service\";\nimport { FullScreenService } from \"../services/full-screen.service\";\nimport { LoggerService } from \"../services/logger.service\";\nimport { UserSettingsService } from \"../services/user-settings.service\";\nimport { UuidService } from \"../services/uuid.service\";\nimport { deepMerge, DeepPartial } from \"../services/object.helpers\";\nimport { BlobDownloaderService } from \"../services/blob-downloader.service\";\n\nexport function provideConsoleForge(config?: DeepPartial<ConsoleForgeConfig>): EnvironmentProviders {\n // merge provided with defaults\n const finalConfig = config ? deepMerge(defaultCfConfig, config) : defaultCfConfig;\n\n // provide to the env\n return makeEnvironmentProviders([\n { provide: BlobDownloaderService },\n { provide: ClipboardService },\n { provide: ConsoleClientFactoryService },\n { provide: FullScreenService },\n { provide: LoggerService },\n { provide: UserSettingsService },\n { provide: UuidService },\n {\n provide: ConsoleForgeConfig,\n useValue: finalConfig\n },\n ]);\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsoleClientType = \"vmware\" | \"vnc\";\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { ConsoleCredentials } from \"./console-credentials\";\n\nexport interface ConsoleConnectionOptions {\n autoFocusOnConnect?: boolean;\n backgroundStyle?: string;\n credentials?: ConsoleCredentials;\n hostElement: HTMLElement;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsoleConnectionStatus = \"connected\" | \"connecting\" | \"disconnected\";\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport interface ConsoleCredentials {\n accessTicket?: string;\n password?: string;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport interface ConsoleComponentNetworkConfig {\n available: string[];\n current?: string;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsolePowerRequest = \"reboot\" | \"rebootHard\" | \"shutdown\"\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport interface ConsoleSupportedFeatures {\n /**\n * This is basically a stupid kludge that is only here because VMWare's client has a very weird implementation of \"copy\".\n * \n * The VMWare \"WMKS\" client only emits clipboard events after the remote console's clipboard receives new data (i.e. you copy some content on the remote desktop)\n * AND after the console canvas loses focus. That is, no matter how much copying you do, the client doesn't know about until the canvas housing the console\n * is blurred. \n * \n * The downstream effect of this that, unlike with other protocols, we can't gracefully emit events when copies happen or automatically copy to your local\n * clipboard in a reasonable way, because we can't know when the remote copy happened and if you really want it copied to your local CB or not. So when this\n * flag is set to false (VMWare is the only service which does this), we show a panel in the default toolbar that you can manually copy content from and\n * automatically receives the last \"copy\" event from the console.\n * \n * Yuck.\n */\n clipboardAutomaticLocalCopy: boolean;\n\n /**\n * Indicates whether the remote console protocol allows us to write content directly to the clipboard of the remote machine. \n */\n clipboardRemoteWrite: boolean;\n\n /**\n * Indicates whether there remote console offers an on-screen keyboard. (Hint: probably not. As far as we know, VMWare's WMKS is the only one that will do this.)\n */\n onScreenKeyboard: boolean;\n\n /**\n * Indicates whether the remote console protocol allows us to issue power requests (like restart, reboot, and hard reboot). This is typically a configuration detail\n * of the machine, so we usually have to rely on the protocol-specific service to tell us whether the feature is enabled (see our VNC client, wrapping noVnc, for an example)\n */\n powerManagement: boolean;\n\n /**\n * Whether the remote console protocol/library supports a \"view/read\"-only canvas. If it doesn't, we have to do some CSS/JS hacking in the console component, so \n * we prefer the client lib/protocol's implementation if we can get it.\n */\n viewOnlyMode: boolean;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nexport type ConsoleToolbarPosition = \"left\" | \"right\" | \"top\" | \"bottom\";\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { InputSignal } from \"@angular/core\";\nimport { ConsoleToolbarContext } from \"../models/console-toolbar-context\";\n\nexport interface ConsoleToolbarComponentBase {\n consoleContext: InputSignal<ConsoleToolbarContext>;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\nimport { Signal } from \"@angular/core\";\nimport { CanvasRecording } from \"../services/canvas-recorder/canvas-recording\";\nimport { ConsolePowerRequest } from \"./console-power-request\";\nimport { ConsoleSupportedFeatures } from \"./console-supported-features\";\nimport { ConsoleComponentNetworkConfig } from \"./console-component-network-config\";\nimport { UserSettingsService } from \"../services/user-settings.service\";\n\nexport interface ConsoleToolbarContext {\n clipboard: {\n consoleClipboardText: Signal<string>;\n sendTextToConsoleClipboard(text: string): Promise<void>;\n };\n console: {\n copyScreenshot(): Promise<void>;\n recordScreenStart(): void;\n recordScreenStop(): Promise<Blob>;\n sendCtrlAltDel(): Promise<void>;\n sendKeyboardInput(text: string): Promise<void>;\n sendPowerRequest(request: ConsolePowerRequest): Promise<void>;\n sendReconnectRequest(): Promise<void>;\n supportedFeatures: Signal<ConsoleSupportedFeatures>;\n toggleFullscreen(): Promise<void>;\n };\n networks: {\n config: Signal<ConsoleComponentNetworkConfig | undefined>;\n connectionRequested(networkName: string): void;\n disconnectRequested(): void;\n };\n state: {\n activeConsoleRecording: Signal<CanvasRecording | undefined>;\n isConnected: Signal<boolean>;\n isFullscreenAvailable: Signal<boolean>;\n isManualReconnectAvailable: Signal<boolean>;\n isRecordingAvailable: Signal<boolean>;\n isViewOnly: Signal<boolean>;\n };\n userSettings: UserSettingsService;\n}\n","// ===BEGIN LICENSE===\n// Copyright 2025 Carnegie Mellon University. All rights reserved.\n// Released under an MIT (SEI)-style license. See the LICENSE.md file for license information.\n// ===END LICENSE===\n\n/*\n * Public API Surface of console-forge\n */\nexport * from \"./lib/components/console/console.component\";\nexport * from \"./lib/components/console-tile/console-tile.component\";\nexport * from \"./lib/models/console-component-config\";\nexport * from \"./lib/directives/class-on-hover.directive\";\n\n// config\nexport * from \"./lib/config/provide-console-forge\";\n\n// models\nexport * from \"./lib/models/console-client-type\";\nexport * from \"./lib/models/console-connection-options\";\nexport * from \"./lib/models/console-connection-status\";\nexport * from \"./lib/models/console-credentials\";\nexport * from \"./lib/models/console-component-network-config\";\nexport * from \"./lib/models/console-power-request\";\nexport * from \"./lib/models/console-supported-features\";\nexport * from \"./lib/models/console-toolbar-position\";\nexport * from \"./lib/models/console-toolbar-component-base\";\nexport * from \"./lib/models/console-toolbar-context\";\nexport * from \"./lib/models/log-level\";\n\n// services\nexport * from \"./lib/services/user-settings.service\";\n\n// helpers\nexport * from \"./lib/services/clipboard/clipboard.helpers\";\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["i1"],"mappings":"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"}