@xterm/addon-webgl 0.19.0-beta.45 → 0.19.0-beta.47
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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
|
-
"sources": ["../../../src/common/
|
|
4
|
-
"sourcesContent": ["/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\ninterface IListener<T, U = void> {\n (arg1: T, arg2: U): void;\n}\n\nexport interface IEvent<T, U = void> {\n (listener: (arg1: T, arg2: U) => any): IDisposable;\n}\n\nexport interface IEventEmitter<T, U = void> {\n event: IEvent<T, U>;\n fire(arg1: T, arg2: U): void;\n dispose(): void;\n}\n\nexport class EventEmitter<T, U = void> implements IEventEmitter<T, U> {\n private _listeners: Set<IListener<T, U>> = new Set();\n private _event?: IEvent<T, U>;\n private _disposed: boolean = false;\n\n public get event(): IEvent<T, U> {\n if (!this._event) {\n this._event = (listener: (arg1: T, arg2: U) => any) => {\n this._listeners.add(listener);\n const disposable = {\n dispose: () => {\n if (!this._disposed) {\n this._listeners.delete(listener);\n }\n }\n };\n return disposable;\n };\n }\n return this._event;\n }\n\n public fire(arg1: T, arg2: U): void {\n const queue: IListener<T, U>[] = [];\n for (const l of this._listeners.values()) {\n queue.push(l);\n }\n for (let i = 0; i < queue.length; i++) {\n queue[i].call(undefined, arg1, arg2);\n }\n }\n\n public dispose(): void {\n this.clearListeners();\n this._disposed = true;\n }\n\n public clearListeners(): void {\n if (this._listeners) {\n this._listeners.clear();\n }\n }\n}\n\nexport function forwardEvent<T>(from: IEvent<T>, to: IEventEmitter<T>): IDisposable {\n return from(e => to.fire(e));\n}\n\nexport function runAndSubscribe<T>(event: IEvent<T>, handler: (e: T | undefined) => any): IDisposable {\n handler(undefined);\n return event(e => handler(e));\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n /**\n * Gets the value if it exists.\n */\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n /**\n * Sets the value, disposing of the old value if it exists.\n */\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n /**\n * Resets the stored value and disposes of the previously stored value.\n */\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any)) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n node: Element | Window | Document,\n type: string,\n handler: (e: any) => void,\n options?: boolean | AddEventListenerOptions\n): IDisposable {\n node.addEventListener(type, handler, options);\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n node.removeEventListener(type, handler, options);\n }\n };\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.codepointMask;`\n * write: `content |= codepoint & Content.codepointMask;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indication whether a cell contains combined content\n * read: `isCombined = content & Content.isCombined;`\n * set: `content |= Content.isCombined;`\n * clear: `content &= ~Content.isCombined;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.hasContent)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.widthMask) >> Content.widthShift;`\n * `hasWidth = content & Content.widthMask;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.widthShift;`\n * write: `content |= (width << Content.widthShift) & Content.widthMask;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.widthShift;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1]);\n $g = parseInt(rgbaMatch[2]);\n $b = parseInt(rgbaMatch[3]);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IBlockVector {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n // Block elements (0x2580-0x2590)\n '\u2580': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n '\u2581': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n '\u2582': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n '\u2583': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n '\u2584': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n '\u2585': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n '\u2586': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n '\u2587': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n '\u2588': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n '\u2589': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n '\u258A': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n '\u258B': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n '\u258C': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n '\u258D': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n '\u258E': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n '\u258F': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n '\u2590': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n // Block elements (0x2594-0x2595)\n '\u2594': [{ x: 0, y: 0, w: 8, h: 1 }], // UPPER ONE EIGHTH BLOCK\n '\u2595': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (0x2596-0x259F)\n '\u2596': [{ x: 0, y: 4, w: 4, h: 4 }], // QUADRANT LOWER LEFT\n '\u2597': [{ x: 4, y: 4, w: 4, h: 4 }], // QUADRANT LOWER RIGHT\n '\u2598': [{ x: 0, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT\n '\u2599': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n '\u259A': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n '\u259B': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '\u259C': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '\u259D': [{ x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER RIGHT\n '\u259E': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n '\u259F': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // UPPER AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n // HORIZONTAL ONE EIGHTH BLOCK-1358\n '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n // UPPER ONE QUARTER BLOCK\n '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n // UPPER THREE QUARTERS BLOCK\n '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n // RIGHT ONE QUARTER BLOCK\n '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n // RIGHT SEVEN EIGHTHS B0OCK\n '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n // CHECKER BOARD FILL\n '\\u{1FB95}': [\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ],\n // INVERSE CHECKER BOARD FILL\n '\\u{1FB96}': [\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ],\n // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n // Shade characters (0x2591-0x2593)\n '\u2591': [ // LIGHT SHADE (25%)\n [1, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 0]\n ],\n '\u2592': [ // MEDIUM SHADE (50%)\n [1, 0],\n [0, 0],\n [0, 1],\n [0, 0]\n ],\n '\u2593': [ // DARK SHADE (75%)\n [0, 1],\n [1, 1],\n [1, 0],\n [1, 1]\n ]\n};\n\nconst enum Shapes {\n /** \u2502 */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** \u2500 */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** \u2514 */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** \u2518 */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** \u2510 */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** \u250C */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** \u2575 */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** \u2574 */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** \u2576 */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** \u2577 */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** \u2534 */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** \u2524 */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** \u251C */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** \u252C */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** \u253C */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** \u254C */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** \u2504 */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** \u2509 */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** \u254E */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** \u2506 */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** \u250A */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n NORMAL = 1,\n BOLD = 3\n}\n\n/**\n * @param xp The percentage of 15% of the x axis.\n * @param yp The percentage of 15% of the x axis on the y axis.\n */\ntype DrawFunctionDefinition = (xp: number, yp: number) => string;\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | DrawFunctionDefinition } | undefined } = {\n // Uniform normal and bold\n '\u2500': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n '\u2501': { [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2502': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n '\u2503': { [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u250C': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n '\u250F': { [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2510': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n '\u2513': { [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2514': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n '\u2517': { [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2518': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n '\u251B': { [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u251C': { [Style.NORMAL]: Shapes.T_RIGHT },\n '\u2523': { [Style.BOLD]: Shapes.T_RIGHT },\n '\u2524': { [Style.NORMAL]: Shapes.T_LEFT },\n '\u252B': { [Style.BOLD]: Shapes.T_LEFT },\n '\u252C': { [Style.NORMAL]: Shapes.T_BOTTOM },\n '\u2533': { [Style.BOLD]: Shapes.T_BOTTOM },\n '\u2534': { [Style.NORMAL]: Shapes.T_TOP },\n '\u253B': { [Style.BOLD]: Shapes.T_TOP },\n '\u253C': { [Style.NORMAL]: Shapes.CROSS },\n '\u254B': { [Style.BOLD]: Shapes.CROSS },\n '\u2574': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n '\u2578': { [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2575': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n '\u2579': { [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2576': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n '\u257A': { [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2577': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n '\u257B': { [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n\n // Double border\n '\u2550': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u2551': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u2552': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '\u2553': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n '\u2554': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '\u2555': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n '\u2556': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n '\u2557': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n '\u2558': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n '\u2559': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '\u255A': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n '\u255B': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n '\u255C': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n '\u255D': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n '\u255E': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '\u255F': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n '\u2560': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '\u2561': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n '\u2562': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u2563': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n '\u2564': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n '\u2565': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n '\u2566': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '\u2567': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u2568': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '\u2569': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '\u256A': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u256B': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u256C': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n // Diagonal\n '\u2571': { [Style.NORMAL]: 'M1,0 L0,1' },\n '\u2572': { [Style.NORMAL]: 'M0,0 L1,1' },\n '\u2573': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n // Mixed weight\n '\u257C': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u257D': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u257E': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u257F': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u250D': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u250E': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2511': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2512': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2515': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2516': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2519': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u251A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u251D': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u251E': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u251F': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2520': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2521': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2522': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2525': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2526': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2527': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2528': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2529': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u252A': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u252D': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u252E': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u252F': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2530': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2531': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2532': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2535': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2536': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2537': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2538': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2539': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u253A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u253D': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u253E': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u253F': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2540': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2541': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2542': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2543': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u2544': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2545': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2546': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2547': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n '\u2548': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n '\u2549': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n '\u254A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n // Dashed\n '\u254C': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n '\u254D': { [Style.BOLD]: Shapes.TWO_DASHES_HORIZONTAL },\n '\u2504': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n '\u2505': { [Style.BOLD]: Shapes.THREE_DASHES_HORIZONTAL },\n '\u2508': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n '\u2509': { [Style.BOLD]: Shapes.FOUR_DASHES_HORIZONTAL },\n '\u254E': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n '\u254F': { [Style.BOLD]: Shapes.TWO_DASHES_VERTICAL },\n '\u2506': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL },\n '\u2507': { [Style.BOLD]: Shapes.THREE_DASHES_VERTICAL },\n '\u250A': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n '\u250B': { [Style.BOLD]: Shapes.FOUR_DASHES_VERTICAL },\n\n // Curved\n '\u256D': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5` },\n '\u256E': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5` },\n '\u256F': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5` },\n '\u2570': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5` }\n};\n\ninterface IVectorShape {\n d: string;\n type: VectorType;\n leftPadding?: number;\n rightPadding?: number;\n}\n\nconst enum VectorType {\n FILL,\n STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n * visible.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n // Git branch\n '\\u{E0A0}': { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: VectorType.FILL },\n // L N\n '\\u{E0A1}': { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: VectorType.FILL },\n // Lock\n '\\u{E0A2}': { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: VectorType.FILL },\n // Right triangle solid\n '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL, rightPadding: 2 },\n // Right triangle line\n '\\u{E0B1}': { d: 'M-1,-.5 L1,.5 L-1,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Left triangle solid\n '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL, leftPadding: 2 },\n // Left triangle line\n '\\u{E0B3}': { d: 'M2,-.5 L0,.5 L2,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Right semi-circle solid\n '\\u{E0B4}': { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: VectorType.FILL, rightPadding: 1 },\n // Right semi-circle line\n '\\u{E0B5}': { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: VectorType.STROKE, rightPadding: 1 },\n // Left semi-circle solid\n '\\u{E0B6}': { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: VectorType.FILL, leftPadding: 1 },\n // Left semi-circle line\n '\\u{E0B7}': { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: VectorType.STROKE, leftPadding: 1 },\n // Lower left triangle\n '\\u{E0B8}': { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: VectorType.FILL },\n // Backslash separator\n '\\u{E0B9}': { d: 'M-.5,-.5 L1.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Lower right triangle\n '\\u{E0BA}': { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: VectorType.FILL },\n // Upper left triangle\n '\\u{E0BC}': { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: VectorType.FILL },\n // Forward slash separator\n '\\u{E0BD}': { d: 'M1.5,-.5 L-.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Upper right triangle\n '\\u{E0BE}': { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: VectorType.FILL }\n};\n// Forward slash separator redundant\npowerlineDefinitions['\\u{E0BB}'] = powerlineDefinitions['\\u{E0BD}'];\n// Backslash separator redundant\npowerlineDefinitions['\\u{E0BF}'] = powerlineDefinitions['\\u{E0B9}'];\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number\n): boolean {\n const blockElementDefinition = blockElementDefinitions[c];\n if (blockElementDefinition) {\n drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n return true;\n }\n\n const patternDefinition = patternCharacterDefinitions[c];\n if (patternDefinition) {\n drawPatternChar(ctx, patternDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n return true;\n }\n\n const boxDrawingDefinition = boxDrawingDefinitions[c];\n if (boxDrawingDefinition) {\n drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, devicePixelRatio);\n return true;\n }\n\n const powerlineDefinition = powerlineDefinitions[c];\n if (powerlineDefinition) {\n drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, fontSize, devicePixelRatio);\n return true;\n }\n\n return false;\n}\n\nfunction drawBlockElementChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n const tmpCanvas = ctx.canvas.ownerDocument.createElement('canvas');\n tmpCanvas.width = width;\n tmpCanvas.height = height;\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles: \u250E\u2530\u2512\u250D\u252F\u2511\u2553\u2565\u2556\u2552\u2564\u2555 \u250F\u2533\u2513\u250C\u2532\u2513\u250C\u252C\u2510\u250F\u2531\u2510\n * \u250C\u2500\u252C\u2500\u2510 \u250F\u2501\u2533\u2501\u2513 \u2554\u2550\u2566\u2550\u2557 \u2520\u2542\u2528\u251D\u253F\u2525\u255F\u256B\u2562\u255E\u256A\u2561 \u2521\u2547\u2529\u251C\u254A\u252B\u2522\u2548\u252A\u2523\u2549\u2524\n * \u2502 \u2502 \u2502 \u2503 \u2503 \u2503 \u2551 \u2551 \u2551 \u2516\u2538\u251A\u2515\u2537\u2519\u2559\u2568\u255C\u2558\u2567\u255B \u2514\u2534\u2518\u2514\u253A\u251B\u2517\u253B\u251B\u2517\u2539\u2518\n * \u251C\u2500\u253C\u2500\u2524 \u2523\u2501\u254B\u2501\u252B \u2560\u2550\u256C\u2550\u2563 \u250F\u2531\u2510\u250C\u2532\u2513\u250C\u252C\u2510\u250C\u252C\u2510 \u250F\u2533\u2513\u250C\u252E\u2513\u250C\u252C\u2510\u250F\u252D\u2510\n * \u2502 \u2502 \u2502 \u2503 \u2503 \u2503 \u2551 \u2551 \u2551 \u2521\u2543\u2524\u251C\u2544\u2529\u251C\u2546\u252A\u2522\u2545\u2524 \u251E\u2540\u2526\u251C\u253E\u252B\u251F\u2541\u2527\u2523\u253D\u2524\n * \u2514\u2500\u2534\u2500\u2518 \u2517\u2501\u253B\u2501\u251B \u255A\u2550\u2569\u2550\u255D \u2514\u2534\u2518\u2514\u2534\u2518\u2514\u253A\u251B\u2517\u2539\u2518 \u2514\u2534\u2518\u2514\u2536\u251B\u2517\u253B\u251B\u2517\u2535\u2518\n *\n * Other:\n * \u256D\u2500\u256E \u2572 \u2571 \u2577\u257B\u254E\u254F\u2506\u2507\u250A\u250B \u257A\u257E\u2574 \u254C\u254C\u254C \u2504\u2504\u2504 \u2508\u2508\u2508\n * \u2502 \u2502 \u2573 \u257D\u257F\u254E\u254F\u2506\u2507\u250A\u250B \u2576\u257C\u2578 \u254D\u254D\u254D \u2505\u2505\u2505 \u2509\u2509\u2509\n * \u2570\u2500\u256F \u2571 \u2572 \u2579\u2575\u254E\u254F\u2506\u2507\u250A\u250B\n *\n * All box drawing characters:\n * \u2500 \u2501 \u2502 \u2503 \u2504 \u2505 \u2506 \u2507 \u2508 \u2509 \u250A \u250B \u250C \u250D \u250E \u250F\n * \u2510 \u2511 \u2512 \u2513 \u2514 \u2515 \u2516 \u2517 \u2518 \u2519 \u251A \u251B \u251C \u251D \u251E \u251F\n * \u2520 \u2521 \u2522 \u2523 \u2524 \u2525 \u2526 \u2527 \u2528 \u2529 \u252A \u252B \u252C \u252D \u252E \u252F\n * \u2530 \u2531 \u2532 \u2533 \u2534 \u2535 \u2536 \u2537 \u2538 \u2539 \u253A \u253B \u253C \u253D \u253E \u253F\n * \u2540 \u2541 \u2542 \u2543 \u2544 \u2545 \u2546 \u2547 \u2548 \u2549 \u254A \u254B \u254C \u254D \u254E \u254F\n * \u2550 \u2551 \u2552 \u2553 \u2554 \u2555 \u2556 \u2557 \u2558 \u2559 \u255A \u255B \u255C \u255D \u255E \u255F\n * \u2560 \u2561 \u2562 \u2563 \u2564 \u2565 \u2566 \u2567 \u2568 \u2569 \u256A \u256B \u256C \u256D \u256E \u256F\n * \u2570 \u2571 \u2572 \u2573 \u2574 \u2575 \u2576 \u2577 \u2578 \u2579 \u257A \u257B \u257C \u257D \u257E \u257F\n *\n * ---\n *\n * Box drawing alignment tests: \u2588\n * \u2589\n * \u2554\u2550\u2550\u2566\u2550\u2550\u2557 \u250C\u2500\u2500\u252C\u2500\u2500\u2510 \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u250F\u2501\u2501\u2533\u2501\u2501\u2513 \u250E\u2512\u250F\u2511 \u2577 \u257B \u250F\u252F\u2513 \u250C\u2530\u2510 \u258A \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n * \u2551\u250C\u2500\u2568\u2500\u2510\u2551 \u2502\u2554\u2550\u2567\u2550\u2557\u2502 \u2502\u2552\u2550\u256A\u2550\u2555\u2502 \u2502\u2553\u2500\u2541\u2500\u2556\u2502 \u2503\u250C\u2500\u2542\u2500\u2510\u2503 \u2517\u2543\u2544\u2519 \u2576\u253C\u2574\u257A\u254B\u2578\u2520\u253C\u2528 \u251D\u254B\u2525 \u258B \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n * \u2551\u2502\u2572 \u2571\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257F \u2502\u2503 \u250D\u2545\u2546\u2513 \u2575 \u2579 \u2517\u2537\u251B \u2514\u2538\u2518 \u258C \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n * \u2560\u2561 \u2573 \u255E\u2563 \u251C\u2562 \u255F\u2524 \u251C\u253C\u2500\u253C\u2500\u253C\u2524 \u251C\u256B\u2500\u2542\u2500\u256B\u2524 \u2523\u253F\u257E\u253C\u257C\u253F\u252B \u2515\u251B\u2516\u251A \u250C\u2504\u2504\u2510 \u254E \u250F\u2505\u2505\u2513 \u250B \u258D \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n * \u2551\u2502\u2571 \u2572\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257D \u2502\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258E\n * \u2551\u2514\u2500\u2565\u2500\u2518\u2551 \u2502\u255A\u2550\u2564\u2550\u255D\u2502 \u2502\u2558\u2550\u256A\u2550\u255B\u2502 \u2502\u2559\u2500\u2540\u2500\u255C\u2502 \u2503\u2514\u2500\u2542\u2500\u2518\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258F\n * \u255A\u2550\u2550\u2569\u2550\u2550\u255D \u2514\u2500\u2500\u2534\u2500\u2500\u2518 \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2517\u2501\u2501\u253B\u2501\u2501\u251B \u2514\u254C\u254C\u2518 \u254E \u2517\u254D\u254D\u251B \u250B \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number\n): void {\n ctx.strokeStyle = ctx.fillStyle;\n for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n ctx.beginPath();\n ctx.lineWidth = devicePixelRatio * Number.parseInt(fontWeight);\n let actualInstructions: string;\n if (typeof instructions === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = instructions(xp, yp);\n } else {\n actualInstructions = instructions;\n }\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio));\n }\n ctx.stroke();\n ctx.closePath();\n }\n}\n\nfunction drawPowerlineChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ));\n }\n if (charDefinition.type === VectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n 'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n 'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n 'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (doClamp && result[x] !== 0) {\n result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (doClamp && result[y] !== 0) {\n result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration = 0;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining = 0;\n while (this._i < this._tasks.length) {\n taskDuration = Date.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n // this is not an issue here as a clock change during a short running task is very unlikely\n // in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, Date.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = Date.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - Date.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor() {\n this._queue = new IdleTaskQueue();\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { EventEmitter } from 'common/EventEmitter';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { IUnicodeService } from 'common/services/Services';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap<number, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap<string, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transfered to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new EventEmitter<HTMLCanvasElement>();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue();\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _requestClearModel = false;\n public beginFrame(): boolean {\n return this._requestClearModel;\n }\n\n public clearTexture(): void {\n if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n return;\n }\n for (const page of this._pages) {\n page.clear();\n }\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a > b ? 1 : -1);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version++;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Request the model to be cleared to refresh all texture pages.\n this._requestClearModel = true;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version++;\n }\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap<string | number, number, number, number, IRasterizedGlyph>,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean = false\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor || undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._textureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n customGlyph = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yMid = yTop + lineWidth;\n const yBot = yTop + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n\n for (let i = 0; i < chWidth; i++) {\n this._tmpCtx.save();\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n const xChMid = xChLeft + this._config.deviceCellWidth / 2;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n this._tmpCtx.moveTo(xChLeft, yBot);\n this._tmpCtx.lineTo(xChRight, yBot);\n break;\n case UnderlineStyle.CURLY:\n // Choose the bezier top and bottom based on the device pixel ratio, the curly line is\n // made taller when the line width is as otherwise it's not very clear otherwise.\n const yCurlyBot = lineWidth <= 1 ? yBot : Math.ceil(padding + this._config.deviceCharHeight - lineWidth / 2) - yOffset;\n const yCurlyTop = lineWidth <= 1 ? yTop : Math.ceil(padding + this._config.deviceCharHeight + lineWidth / 2) - yOffset;\n // Clip the left and right edges of the underline such that it can be drawn just outside\n // the edge of the cell to ensure a continuous stroke when there are multiple underlined\n // glyphs adjacent to one another.\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n // Start 1/2 cell before and end 1/2 cells after to ensure a smooth curve with other\n // cells\n this._tmpCtx.moveTo(xChLeft - this._config.deviceCellWidth / 2, yMid);\n this._tmpCtx.bezierCurveTo(\n xChLeft - this._config.deviceCellWidth / 2, yCurlyTop,\n xChLeft, yCurlyTop,\n xChLeft, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChLeft, yCurlyBot,\n xChMid, yCurlyBot,\n xChMid, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChMid, yCurlyTop,\n xChRight, yCurlyTop,\n xChRight, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChRight, yCurlyBot,\n xChRight + this._config.deviceCellWidth / 2, yCurlyBot,\n xChRight + this._config.deviceCellWidth / 2, yMid\n );\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTop);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n break;\n }\n this._tmpCtx.stroke();\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version++;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray<IRasterizedGlyph> { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Used to check whether the canvas of the atlas page has changed.\n */\n public version = 0;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n if (sourcePages) {\n for (const p of sourcePages) {\n this._glyphs.push(...p.glyphs);\n this._usedPixels += p._usedPixels;\n }\n }\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version++;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevent pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required<ITerminalOptions>, colors: ReadonlyColorSet, devicePixelRatio: number): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n overviewRulerBorder: NULL_COLOR,\n scrollbarSliderBackground: NULL_COLOR,\n scrollbarSliderHoverBackground: NULL_COLOR,\n scrollbarSliderActiveBackground: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs: options.customGlyphs,\n devicePixelRatio,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required<ITerminalOptions>,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this.restartBlinkAnimation();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint = 0;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n cp <<= 6;\n cp |= tmp;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n console.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n console.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { IOptionsService } from 'common/services/Services';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals}\n}`);\n}\n\nconst INDICES_PER_CELL = 11;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages)));\n this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n this._vertexArrayObject = gl.createVertexArray();\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this.register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n public beginFrame(): boolean {\n return this._atlas ? this._atlas.beginFrame() : true;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed\n for (let i = 0; i < this._atlas.pages.length; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n gl.generateMipmap(gl.TEXTURE_2D);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 4;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\nexport const RENDER_MODEL_EXT_OFFSET = 3;\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RENDER_MODEL_INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n this._vertexArrayObject = gl.createVertexArray();\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this.register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + 4) {\n vertices.attributes = expandFloat32Array(vertices.attributes, this._terminal.rows * this._terminal.cols * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache';\nimport { TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this.register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this.register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from 'browser/renderer/shared/CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from 'browser/renderer/shared/CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache';\nimport { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { CharData, IBufferLine, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel';\nimport { IWebGL2RenderingContext } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();\n private _charAtlasDisposable = this.register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _observerDisposable = this.register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _workCell: ICellData = new CellData();\n private _workCell2: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable<RectangleRenderer> = this.register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable<GlyphRenderer> = this.register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this.register(new EventEmitter<IRequestRedrawEvent>());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this.register(new EventEmitter<void>());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n this.register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this.register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this.register(addDisposableDomListener(this._canvas, 'webglcontextlost', (e) => {\n console.log('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n console.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this.register(addDisposableDomListener(this._canvas, 'webglcontextrestored', (e) => {\n console.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this.register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement!);\n\n this.register(toDisposable(() => {\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = getDisposeArrayDisposable([\n forwardEvent(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n forwardEvent(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n ]);\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return -1;\n }\n\n public deregisterCharacterJoiner(joinerId: number): boolean {\n return false;\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let lastCharX: number;\n let range: [number, number];\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n line = terminal.buffer.lines.get(row)!;\n this._model.lineLengths[y] = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ?\n (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n (terminal.options.cursorStyle || 'block') === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x < lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0, 0);\n this._model.cells[j] = NULL_CELL_CODE;\n this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[j + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n }\n }\n }\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The the size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may causes blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n this._requestRedrawViewport();\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator.toString = () => id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[DI_TARGET] === target) {\n (target as any)[DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty } from '@xterm/xterm';\nimport { IEvent, IEventEmitter } from 'common/EventEmitter';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, IAttributeData, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IModes, IOscLinkData, IWindowOptions } from 'common/Types';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: IEvent<{ cols: number, rows: number }>;\n onScroll: IEvent<number>;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: IEvent<CoreMouseEventType>;\n\n /**\n * Human readable version of mouse events.\n */\n explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n\n readonly onData: IEvent<string>;\n readonly onUserInput: IEvent<void>;\n readonly onBinary: IEvent<string>;\n readonly onRequestScrollToBottom: IEvent<void>;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n getService<T>(id: IServiceIdentifier<T>): T | undefined;\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required<ITerminalOptions>;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required<ITerminalOptions>;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: IEvent<keyof ITerminalOptions>;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n customGlyphs?: boolean;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n /** @deprecated No longer supported */\n fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsMode?: boolean;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n overviewRulerWidth?: number;\n\n [key: string]: any;\n cancelEvents: boolean;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register an Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered, when activate version changed. */\n readonly onChange: IEvent<string>;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator<IInternalDecoration>;\n readonly onDecorationRegistered: IEvent<IInternalDecoration>;\n readonly onDecorationRemoved: IEvent<IInternalDecoration>;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: IEventEmitter<HTMLElement>;\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n // For trace logging, assume the latest created log service is valid\n traceLogger = this;\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n if (typeof descriptor.value !== 'function') {\n throw new Error('not supported');\n }\n const fnKey = 'value';\n const fn = descriptor.value;\n descriptor[fnKey] = function (...args: any[]) {\n // Early exit\n if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n return fn.apply(this, args);\n }\n\n traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n const result = fn.apply(this, args);\n traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n return result;\n };\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { EventEmitter, forwardEvent } from 'common/EventEmitter';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { setTraceLogger } from 'common/services/LogService';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this.register(new EventEmitter<HTMLCanvasElement>());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this.register(new EventEmitter<void>());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _preserveDrawingBuffer?: boolean\n ) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('Webgl2 is only supported on Safari 16 and above');\n }\n }\n super();\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this.register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n // Set trace logger just in case it hasn't been yet which could happen when the addon is\n // bundled separately to the core module\n setTraceLogger(logService);\n\n this._renderer = this.register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n optionsService,\n themeService,\n this._preserveDrawingBuffer\n ));\n this.register(forwardEvent(this._renderer.onContextLoss, this._onContextLoss));\n this.register(forwardEvent(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this.register(forwardEvent(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this.register(forwardEvent(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this.register(toDisposable(() => {\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"],
|
|
5
|
-
"mappings": "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G,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGhC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGhC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAG5D,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAG5H,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAExC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAExC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAExC,YAAa,CAAC,CAAE,EAAG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",
|
|
6
|
-
"names": ["EventEmitter", "listener", "arg1", "arg2", "queue", "l", "i", "forwardEvent", "from", "to", "e", "Disposable", "d", "index", "MutableDisposable", "value", "toDisposable", "f", "disposeArray", "disposables", "getDisposeArrayDisposable", "array", "isNode", "userAgent", "platform", "isFirefox", "isLegacyEdge", "isSafari", "getSafariVersion", "majorVersion", "isMac", "isWindows", "platform", "isLinux", "isChromeOS", "userAgent", "addDisposableDomListener", "node", "type", "handler", "options", "disposed", "NULL_CELL_CHAR", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isRestrictedPowerlineGlyph", "isNerdFontGlyph", "isBoxOrBlockGlyph", "isEmoji", "allowRescaling", "width", "glyphSizeX", "deviceCellWidth", "treatGlyphAsBackgroundColor", "createRenderDimensions", "createDimension", "computeNextVariantOffset", "cellWidth", "lineWidth", "currentOffset", "$fg", "$bg", "$hasFg", "$hasBg", "$isSelected", "$colors", "$variantOffset", "CellColorResolver", "_terminal", "_optionService", "_selectionRenderModel", "_decorationService", "_coreBrowserService", "_themeService", "cell", "x", "y", "deviceCellWidth", "lineWidth", "d", "rgba", "treatGlyphAsBackgroundColor", "INVERTED_DEFAULT_COLOR", "DIM_OPACITY", "TEXT_BASELINE", "isFirefox", "isLegacyEdge", "blockElementDefinitions", "patternCharacterDefinitions", "boxDrawingDefinitions", "xp", "yp", "powerlineDefinitions", "tryDrawCustomChar", "ctx", "c", "xOffset", "yOffset", "deviceCellWidth", "deviceCellHeight", "fontSize", "devicePixelRatio", "blockElementDefinition", "blockElementDefinitions", "drawBlockElementChar", "patternDefinition", "patternCharacterDefinitions", "drawPatternChar", "boxDrawingDefinition", "boxDrawingDefinitions", "drawBoxDrawingChar", "powerlineDefinition", "drawPowerlineChar", "charDefinition", "i", "box", "xEighth", "yEighth", "cachedPatterns", "patternSet", "fillStyle", "pattern", "width", "height", "tmpCanvas", "tmpCtx", "throwIfFalsy", "imageData", "r", "g", "b", "a", "e", "y", "x", "fontWeight", "instructions", "actualInstructions", "yp", "instruction", "type", "f", "svgToCanvasInstructionMap", "args", "translateArgs", "clipRegion", "cssLineWidth", "clamp", "value", "max", "min", "cellWidth", "cellHeight", "doClamp", "leftPadding", "rightPadding", "result", "TwoKeyMap", "first", "second", "value", "FourKeyMap", "third", "fourth", "TaskQueue", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "isNode", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "NULL_RASTERIZED_GLYPH", "TMP_CANVAS_GLYPH_PADDING", "$glyph", "TextureAtlas", "_TextureAtlas", "_document", "_config", "_unicodeService", "FourKeyMap", "AttributeData", "EventEmitter", "createCanvas", "TMP_CANVAS_GLYPH_PADDING", "throwIfFalsy", "page", "queue", "IdleTaskQueue", "i", "rasterizedGlyph", "pagesBySize", "e", "b", "sameSizeI", "size", "mergingPages", "sortedMergingPagesIndexes", "mergedPageIndex", "mergedPage", "newPage", "AtlasPage", "mergedSize", "p", "xOffset", "yOffset", "g", "index", "pageIndex", "j", "adjustingPage", "chars", "bg", "fg", "ext", "restrictToCellHeight", "code", "cacheMap", "key", "idx", "bgColorMode", "bgColor", "inverse", "dim", "NULL_COLOR", "result", "arr", "channels", "color", "fgColorMode", "fgColor", "bold", "excludeFromContrastRatioDemands", "minimumContrastColor", "DIM_OPACITY", "cache", "adjustedColor", "bgRgba", "fgRgba", "rgba", "codeOrChars", "allowedWidth", "allowedHeight", "NULL_RASTERIZED_GLYPH", "italic", "underline", "strikethrough", "overline", "temp", "temp2", "backgroundColor", "fontWeight", "fontStyle", "TEXT_BASELINE", "powerlineGlyph", "isPowerlineGlyph", "restrictedPowerlineGlyph", "isRestrictedPowerlineGlyph", "foregroundColor", "treatGlyphAsBackgroundColor", "padding", "customGlyph", "tryDrawCustomChar", "enableClearThresholdCheck", "chWidth", "lineWidth", "xLeft", "yTop", "yMid", "yBot", "nextOffset", "xChLeft", "xChRight", "xChMid", "yCurlyBot", "yCurlyTop", "clipRegion", "offsetWidth", "computeNextVariantOffset", "lineRatio", "gapRatio", "xChWidth", "line", "gap", "end", "metrics", "isBeyondCellBounds", "clearColor", "offset", "imageData", "isEmpty", "checkCompletelyTransparent", "activePage", "activeRow", "row", "wasPageAndRowFound", "candidatePage", "boundingBox", "restrictedGlyph", "height", "width", "found", "y", "x", "alphaOffset", "document", "sourcePages", "glyph", "enableThresholdCheck", "r", "fgR", "fgG", "fgB", "threshold", "canvas", "generateConfig", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "options", "colors", "devicePixelRatio", "clonedColors", "NULL_COLOR", "configEquals", "a", "b", "i", "is256Color", "colorCode", "charAtlasCache", "acquireTextureAtlas", "terminal", "options", "colors", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "devicePixelRatio", "newConfig", "generateConfig", "i", "entry", "ownedByIndex", "configEquals", "core", "newEntry", "TextureAtlas", "removeTerminalFromCache", "index", "BLINK_INTERVAL", "CursorBlinkStateManager", "_renderCallback", "_coreBrowserService", "timeToStart", "time", "observeDevicePixelDimensions", "element", "parentWindow", "callback", "observer", "entries", "entry", "width", "height", "toDisposable", "stringFromCodePoint", "codePoint", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "PROJECTION_MATRIX", "createProgram", "gl", "vertexSource", "fragmentSource", "program", "throwIfFalsy", "createShader", "type", "source", "shader", "expandFloat32Array", "max", "newLength", "newArray", "i", "GLTexture", "texture", "vertexShaderSource", "createFragmentShaderSource", "maxFragmentShaderTextureUnits", "textureConditionals", "i", "INDICES_PER_CELL", "BYTES_PER_CELL", "CELL_POSITION_INDICES", "$i", "$glyph", "$leftCellPadding", "$clippedPixels", "GlyphRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_optionsService", "gl", "TextureAtlas", "throwIfFalsy", "createProgram", "toDisposable", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "textureUnits", "PROJECTION_MATRIX", "glTexture", "GLTexture", "x", "y", "code", "bg", "fg", "ext", "chars", "width", "lastBg", "array", "allowRescaling", "terminal", "newCount", "renderModel", "activeBuffer", "bufferLength", "si", "sub", "atlas", "dimensions", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "RENDER_MODEL_EXT_OFFSET", "COMBINED_CHAR_BIT_MASK", "RenderModel", "createSelectionRenderModel", "cols", "rows", "indexCount", "vertexShaderSource", "fragmentShaderSource", "INDICES_PER_RECTANGLE", "BYTES_PER_RECTANGLE", "INITIAL_BUFFER_RECTANGLE_CAPACITY", "Vertices", "$rgba", "$x1", "$y1", "$r", "$g", "$b", "$a", "RectangleRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_themeService", "gl", "throwIfFalsy", "createProgram", "toDisposable", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "e", "vertices", "PROJECTION_MATRIX", "dimensions", "colors", "model", "terminal", "rectangleCount", "y", "x", "currentStartX", "currentBg", "currentFg", "currentInverse", "modelIndex", "bg", "fg", "inverse", "offset", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "cursor", "startX", "endX", "expandFloat32Array", "array", "x1", "y1", "width", "height", "r", "g", "b", "a", "color", "BaseRenderLayer", "Disposable", "terminal", "_container", "id", "zIndex", "_alpha", "_coreBrowserService", "_optionsService", "_themeService", "e", "toDisposable", "throwIfFalsy", "startRow", "endRow", "start", "end", "columnSelectMode", "alpha", "oldCanvas", "colorSet", "acquireTextureAtlas", "dim", "x", "y", "width", "height", "cell", "TEXT_BASELINE", "isBold", "isItalic", "fontWeight", "LinkRenderLayer", "BaseRenderLayer", "container", "zIndex", "terminal", "linkifier2", "coreBrowserService", "optionsService", "themeService", "e", "dim", "middleRowCount", "INVERTED_DEFAULT_COLOR", "is256Color", "y", "WebglRenderer", "Disposable", "_terminal", "_characterJoinerService", "_charSizeService", "_coreBrowserService", "_coreService", "_decorationService", "_optionsService", "_themeService", "preserveDrawingBuffer", "MutableDisposable", "RenderModel", "CellData", "EventEmitter", "CellColorResolver", "LinkRenderLayer", "createRenderDimensions", "contextAttributes", "addDisposableDomListener", "e", "removeTerminalFromCache", "observeDevicePixelDimensions", "w", "h", "toDisposable", "l", "cols", "rows", "start", "end", "columnSelectMode", "RectangleRenderer", "GlyphRenderer", "atlas", "acquireTextureAtlas", "getDisposeArrayDisposable", "forwardEvent", "clearGlyphRenderer", "handler", "joinerId", "CursorBlinkStateManager", "terminal", "cell", "lastBg", "y", "row", "line", "joinedRanges", "isJoined", "lastCharX", "range", "chars", "code", "width", "i", "x", "j", "clamp", "cursorY", "viewportRelativeCursorY", "cursorX", "lastCursorX", "isCursorVisible", "modelUpdated", "JoinedCellData", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "RENDER_MODEL_EXT_OFFSET", "COMBINED_CHAR_BIT_MASK", "NULL_CELL_CHAR", "height", "AttributeData", "firstCell", "value", "max", "min", "DI_TARGET", "DI_DEPENDENCIES", "serviceRegistry", "createDecorator", "id", "serviceRegistry", "decorator", "target", "key", "index", "storeServiceDependency", "DI_TARGET", "DI_DEPENDENCIES", "IBufferService", "createDecorator", "ICoreMouseService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "traceLogger", "optionalParams", "i", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "setTraceLogger", "logger", "WebglAddon", "Disposable", "_preserveDrawingBuffer", "isSafari", "getSafariVersion", "contextAttributes", "EventEmitter", "terminal", "core", "coreService", "optionsService", "unsafeCore", "renderService", "characterJoinerService", "charSizeService", "coreBrowserService", "decorationService", "logService", "themeService", "setTraceLogger", "WebglRenderer", "forwardEvent", "toDisposable"]
|
|
3
|
+
"sources": ["../../../src/common/Lifecycle.ts", "../../../src/common/Platform.ts", "../../../src/browser/Lifecycle.ts", "../../../src/common/buffer/Constants.ts", "../../../src/common/Color.ts", "../../../src/browser/renderer/shared/RendererUtils.ts", "../../../src/browser/renderer/shared/CellColorResolver.ts", "../../../src/browser/renderer/shared/Constants.ts", "../../../src/browser/renderer/shared/CustomGlyphs.ts", "../../../src/common/MultiKeyMap.ts", "../../../src/common/TaskQueue.ts", "../../../src/common/buffer/AttributeData.ts", "../../../src/vs/base/common/errors.ts", "../../../src/vs/base/common/functional.ts", "../../../src/vs/base/common/arraysFind.ts", "../../../src/vs/base/common/arrays.ts", "../../../src/vs/base/common/collections.ts", "../../../src/vs/base/common/map.ts", "../../../src/vs/base/common/iterator.ts", "../../../src/vs/base/common/lifecycle.ts", "../../../src/vs/base/common/linkedList.ts", "../../../src/vs/base/common/stopwatch.ts", "../../../src/vs/base/common/event.ts", "../../../src/browser/renderer/shared/TextureAtlas.ts", "../../../src/browser/renderer/shared/CharAtlasUtils.ts", "../../../src/browser/renderer/shared/CharAtlasCache.ts", "../../../src/browser/renderer/shared/CursorBlinkStateManager.ts", "../../../src/browser/renderer/shared/DevicePixelObserver.ts", "../../../src/common/input/TextDecoder.ts", "../../../src/common/buffer/CellData.ts", "../src/WebglUtils.ts", "../src/GlyphRenderer.ts", "../../../src/browser/renderer/shared/SelectionRenderModel.ts", "../src/RenderModel.ts", "../src/RectangleRenderer.ts", "../src/renderLayer/BaseRenderLayer.ts", "../src/renderLayer/LinkRenderLayer.ts", "../src/WebglRenderer.ts", "../../../src/common/services/ServiceRegistry.ts", "../../../src/common/services/Services.ts", "../../../src/common/services/LogService.ts", "../src/WebglAddon.ts"],
|
|
4
|
+
"sourcesContent": ["/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * A base class that can be extended to provide convenience methods for managing the lifecycle of an\n * object and its components.\n */\nexport abstract class Disposable implements IDisposable {\n protected _disposables: IDisposable[] = [];\n protected _isDisposed: boolean = false;\n\n /**\n * Disposes the object, triggering the `dispose` method on all registered IDisposables.\n */\n public dispose(): void {\n this._isDisposed = true;\n for (const d of this._disposables) {\n d.dispose();\n }\n this._disposables.length = 0;\n }\n\n /**\n * Registers a disposable object.\n * @param d The disposable to register.\n * @returns The disposable.\n */\n public register<T extends IDisposable>(d: T): T {\n this._disposables.push(d);\n return d;\n }\n\n /**\n * Unregisters a disposable object if it has been registered, if not do\n * nothing.\n * @param d The disposable to unregister.\n */\n public unregister<T extends IDisposable>(d: T): void {\n const index = this._disposables.indexOf(d);\n if (index !== -1) {\n this._disposables.splice(index, 1);\n }\n }\n}\n\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n private _value?: T;\n private _isDisposed = false;\n\n /**\n * Gets the value if it exists.\n */\n public get value(): T | undefined {\n return this._isDisposed ? undefined : this._value;\n }\n\n /**\n * Sets the value, disposing of the old value if it exists.\n */\n public set value(value: T | undefined) {\n if (this._isDisposed || value === this._value) {\n return;\n }\n this._value?.dispose();\n this._value = value;\n }\n\n /**\n * Resets the stored value and disposes of the previously stored value.\n */\n public clear(): void {\n this.value = undefined;\n }\n\n public dispose(): void {\n this._isDisposed = true;\n this._value?.dispose();\n this._value = undefined;\n }\n}\n\n/**\n * Wrap a function in a disposable.\n */\nexport function toDisposable(f: () => void): IDisposable {\n return { dispose: f };\n}\n\n/**\n * Dispose of all disposables in an array and set its length to 0.\n */\nexport function disposeArray(disposables: IDisposable[]): void {\n for (const d of disposables) {\n d.dispose();\n }\n disposables.length = 0;\n}\n\n/**\n * Creates a disposable that will dispose of an array of disposables when disposed.\n */\nexport function getDisposeArrayDisposable(array: IDisposable[]): IDisposable {\n return { dispose: () => disposeArray(array) };\n}\n", "/**\n * Copyright (c) 2016 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\ninterface INavigator {\n userAgent: string;\n language: string;\n platform: string;\n}\n\n// We're declaring a navigator global here as we expect it in all runtimes (node and browser), but\n// we want this module to live in common.\ndeclare const navigator: INavigator;\ndeclare const process: unknown;\n\nexport const isNode = (typeof process !== 'undefined' && 'title' in (process as any)) ? true : false;\nconst userAgent = (isNode) ? 'node' : navigator.userAgent;\nconst platform = (isNode) ? 'node' : navigator.platform;\n\nexport const isFirefox = userAgent.includes('Firefox');\nexport const isLegacyEdge = userAgent.includes('Edge');\nexport const isSafari = /^((?!chrome|android).)*safari/i.test(userAgent);\nexport function getSafariVersion(): number {\n if (!isSafari) {\n return 0;\n }\n const majorVersion = userAgent.match(/Version\\/(\\d+)/);\n if (majorVersion === null || majorVersion.length < 2) {\n return 0;\n }\n return parseInt(majorVersion[1]);\n}\n\n// Find the users platform. We use this to interpret the meta key\n// and ISO third level shifts.\n// http://stackoverflow.com/q/19877924/577598\nexport const isMac = ['Macintosh', 'MacIntel', 'MacPPC', 'Mac68K'].includes(platform);\nexport const isIpad = platform === 'iPad';\nexport const isIphone = platform === 'iPhone';\nexport const isWindows = ['Windows', 'Win16', 'Win32', 'WinCE'].includes(platform);\nexport const isLinux = platform.indexOf('Linux') >= 0;\n// Note that when this is true, isLinux will also be true.\nexport const isChromeOS = /\\bCrOS\\b/.test(userAgent);\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDisposable } from 'common/Types';\n\n/**\n * Adds a disposable listener to a node in the DOM, returning the disposable.\n * @param node The node to add a listener to.\n * @param type The event type.\n * @param handler The handler for the listener.\n * @param options The boolean or options object to pass on to the event\n * listener.\n */\nexport function addDisposableDomListener(\n node: Element | Window | Document,\n type: string,\n handler: (e: any) => void,\n options?: boolean | AddEventListenerOptions\n): IDisposable {\n node.addEventListener(type, handler, options);\n let disposed = false;\n return {\n dispose: () => {\n if (disposed) {\n return;\n }\n disposed = true;\n node.removeEventListener(type, handler, options);\n }\n };\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport const DEFAULT_COLOR = 0;\nexport const DEFAULT_ATTR = (0 << 18) | (DEFAULT_COLOR << 9) | (256 << 0);\nexport const DEFAULT_EXT = 0;\n\nexport const CHAR_DATA_ATTR_INDEX = 0;\nexport const CHAR_DATA_CHAR_INDEX = 1;\nexport const CHAR_DATA_WIDTH_INDEX = 2;\nexport const CHAR_DATA_CODE_INDEX = 3;\n\n/**\n * Null cell - a real empty cell (containing nothing).\n * Note that code should always be 0 for a null cell as\n * several test condition of the buffer line rely on this.\n */\nexport const NULL_CELL_CHAR = '';\nexport const NULL_CELL_WIDTH = 1;\nexport const NULL_CELL_CODE = 0;\n\n/**\n * Whitespace cell.\n * This is meant as a replacement for empty cells when needed\n * during rendering lines to preserve correct aligment.\n */\nexport const WHITESPACE_CELL_CHAR = ' ';\nexport const WHITESPACE_CELL_WIDTH = 1;\nexport const WHITESPACE_CELL_CODE = 32;\n\n/**\n * Bitmasks for accessing data in `content`.\n */\nexport const enum Content {\n /**\n * bit 1..21 codepoint, max allowed in UTF32 is 0x10FFFF (21 bits taken)\n * read: `codepoint = content & Content.codepointMask;`\n * write: `content |= codepoint & Content.codepointMask;`\n * shortcut if precondition `codepoint <= 0x10FFFF` is met:\n * `content |= codepoint;`\n */\n CODEPOINT_MASK = 0x1FFFFF,\n\n /**\n * bit 22 flag indication whether a cell contains combined content\n * read: `isCombined = content & Content.isCombined;`\n * set: `content |= Content.isCombined;`\n * clear: `content &= ~Content.isCombined;`\n */\n IS_COMBINED_MASK = 0x200000, // 1 << 21\n\n /**\n * bit 1..22 mask to check whether a cell contains any string data\n * we need to check for codepoint and isCombined bits to see\n * whether a cell contains anything\n * read: `isEmpty = !(content & Content.hasContent)`\n */\n HAS_CONTENT_MASK = 0x3FFFFF,\n\n /**\n * bit 23..24 wcwidth value of cell, takes 2 bits (ranges from 0..2)\n * read: `width = (content & Content.widthMask) >> Content.widthShift;`\n * `hasWidth = content & Content.widthMask;`\n * as long as wcwidth is highest value in `content`:\n * `width = content >> Content.widthShift;`\n * write: `content |= (width << Content.widthShift) & Content.widthMask;`\n * shortcut if precondition `0 <= width <= 3` is met:\n * `content |= width << Content.widthShift;`\n */\n WIDTH_MASK = 0xC00000, // 3 << 22\n WIDTH_SHIFT = 22\n}\n\nexport const enum Attributes {\n /**\n * bit 1..8 blue in RGB, color in P256 and P16\n */\n BLUE_MASK = 0xFF,\n BLUE_SHIFT = 0,\n PCOLOR_MASK = 0xFF,\n PCOLOR_SHIFT = 0,\n\n /**\n * bit 9..16 green in RGB\n */\n GREEN_MASK = 0xFF00,\n GREEN_SHIFT = 8,\n\n /**\n * bit 17..24 red in RGB\n */\n RED_MASK = 0xFF0000,\n RED_SHIFT = 16,\n\n /**\n * bit 25..26 color mode: DEFAULT (0) | P16 (1) | P256 (2) | RGB (3)\n */\n CM_MASK = 0x3000000,\n CM_DEFAULT = 0,\n CM_P16 = 0x1000000,\n CM_P256 = 0x2000000,\n CM_RGB = 0x3000000,\n\n /**\n * bit 1..24 RGB room\n */\n RGB_MASK = 0xFFFFFF\n}\n\nexport const enum FgFlags {\n /**\n * bit 27..32\n */\n INVERSE = 0x4000000,\n BOLD = 0x8000000,\n UNDERLINE = 0x10000000,\n BLINK = 0x20000000,\n INVISIBLE = 0x40000000,\n STRIKETHROUGH = 0x80000000,\n}\n\nexport const enum BgFlags {\n /**\n * bit 27..32 (upper 2 unused)\n */\n ITALIC = 0x4000000,\n DIM = 0x8000000,\n HAS_EXTENDED = 0x10000000,\n PROTECTED = 0x20000000,\n OVERLINE = 0x40000000\n}\n\nexport const enum ExtFlags {\n /**\n * bit 27..29\n */\n UNDERLINE_STYLE = 0x1C000000,\n\n /**\n * bit 30..32\n *\n * An optional variant for the glyph, this can be used for example to offset underlines by a\n * number of pixels to create a perfect pattern.\n */\n VARIANT_OFFSET = 0xE0000000\n}\n\nexport const enum UnderlineStyle {\n NONE = 0,\n SINGLE = 1,\n DOUBLE = 2,\n CURLY = 3,\n DOTTED = 4,\n DASHED = 5\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColor, IColorRGB } from 'common/Types';\n\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport const NULL_COLOR: IColor = {\n css: '#00000000',\n rgba: 0\n};\n\n/**\n * Helper functions where the source type is \"channels\" (individual color channels as numbers).\n */\nexport namespace channels {\n export function toCss(r: number, g: number, b: number, a?: number): string {\n if (a !== undefined) {\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}${toPaddedHex(a)}`;\n }\n return `#${toPaddedHex(r)}${toPaddedHex(g)}${toPaddedHex(b)}`;\n }\n\n export function toRgba(r: number, g: number, b: number, a: number = 0xFF): number {\n // Note: The aggregated number is RGBA32 (BE), thus needs to be converted to ABGR32\n // on LE systems, before it can be used for direct 32-bit buffer writes.\n // >>> 0 forces an unsigned int\n return (r << 24 | g << 16 | b << 8 | a) >>> 0;\n }\n\n export function toColor(r: number, g: number, b: number, a?: number): IColor {\n return {\n css: channels.toCss(r, g, b, a),\n rgba: channels.toRgba(r, g, b, a)\n };\n }\n}\n\n/**\n * Helper functions where the source type is `IColor`.\n */\nexport namespace color {\n export function blend(bg: IColor, fg: IColor): IColor {\n $a = (fg.rgba & 0xFF) / 255;\n if ($a === 1) {\n return {\n css: fg.css,\n rgba: fg.rgba\n };\n }\n const fgR = (fg.rgba >> 24) & 0xFF;\n const fgG = (fg.rgba >> 16) & 0xFF;\n const fgB = (fg.rgba >> 8) & 0xFF;\n const bgR = (bg.rgba >> 24) & 0xFF;\n const bgG = (bg.rgba >> 16) & 0xFF;\n const bgB = (bg.rgba >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n const css = channels.toCss($r, $g, $b);\n const rgba = channels.toRgba($r, $g, $b);\n return { css, rgba };\n }\n\n export function isOpaque(color: IColor): boolean {\n return (color.rgba & 0xFF) === 0xFF;\n }\n\n export function ensureContrastRatio(bg: IColor, fg: IColor, ratio: number): IColor | undefined {\n const result = rgba.ensureContrastRatio(bg.rgba, fg.rgba, ratio);\n if (!result) {\n return undefined;\n }\n return channels.toColor(\n (result >> 24 & 0xFF),\n (result >> 16 & 0xFF),\n (result >> 8 & 0xFF)\n );\n }\n\n export function opaque(color: IColor): IColor {\n const rgbaColor = (color.rgba | 0xFF) >>> 0;\n [$r, $g, $b] = rgba.toChannels(rgbaColor);\n return {\n css: channels.toCss($r, $g, $b),\n rgba: rgbaColor\n };\n }\n\n export function opacity(color: IColor, opacity: number): IColor {\n $a = Math.round(opacity * 0xFF);\n [$r, $g, $b] = rgba.toChannels(color.rgba);\n return {\n css: channels.toCss($r, $g, $b, $a),\n rgba: channels.toRgba($r, $g, $b, $a)\n };\n }\n\n export function multiplyOpacity(color: IColor, factor: number): IColor {\n $a = color.rgba & 0xFF;\n return opacity(color, ($a * factor) / 0xFF);\n }\n\n export function toColorRGB(color: IColor): IColorRGB {\n return [(color.rgba >> 24) & 0xFF, (color.rgba >> 16) & 0xFF, (color.rgba >> 8) & 0xFF];\n }\n}\n\n/**\n * Helper functions where the source type is \"css\" (string: '#rgb', '#rgba', '#rrggbb',\n * '#rrggbbaa').\n */\nexport namespace css {\n // Attempt to set get the shared canvas context\n let $ctx: CanvasRenderingContext2D | undefined;\n let $litmusColor: CanvasGradient | undefined;\n try {\n // This is guaranteed to run in the first window, so document should be correct\n const canvas = document.createElement('canvas');\n canvas.width = 1;\n canvas.height = 1;\n const ctx = canvas.getContext('2d', {\n willReadFrequently: true\n });\n if (ctx) {\n $ctx = ctx;\n $ctx.globalCompositeOperation = 'copy';\n $litmusColor = $ctx.createLinearGradient(0, 0, 1, 1);\n }\n }\n catch {\n // noop\n }\n\n /**\n * Converts a css string to an IColor, this should handle all valid CSS color strings and will\n * throw if it's invalid. The ideal format to use is `#rrggbb[aa]` as it's the fastest to parse.\n *\n * Only `#rgb[a]`, `#rrggbb[aa]`, `rgb()` and `rgba()` formats are supported when run in a Node\n * environment.\n */\n export function toColor(css: string): IColor {\n // Formats: #rgb[a] and #rrggbb[aa]\n if (css.match(/#[\\da-f]{3,8}/i)) {\n switch (css.length) {\n case 4: { // #rgb\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n return channels.toColor($r, $g, $b);\n }\n case 5: { // #rgba\n $r = parseInt(css.slice(1, 2).repeat(2), 16);\n $g = parseInt(css.slice(2, 3).repeat(2), 16);\n $b = parseInt(css.slice(3, 4).repeat(2), 16);\n $a = parseInt(css.slice(4, 5).repeat(2), 16);\n return channels.toColor($r, $g, $b, $a);\n }\n case 7: // #rrggbb\n return {\n css,\n rgba: (parseInt(css.slice(1), 16) << 8 | 0xFF) >>> 0\n };\n case 9: // #rrggbbaa\n return {\n css,\n rgba: parseInt(css.slice(1), 16) >>> 0\n };\n }\n }\n\n // Formats: rgb() or rgba()\n const rgbaMatch = css.match(/rgba?\\(\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*,\\s*(\\d{1,3})\\s*(,\\s*(0|1|\\d?\\.(\\d+))\\s*)?\\)/);\n if (rgbaMatch) {\n $r = parseInt(rgbaMatch[1]);\n $g = parseInt(rgbaMatch[2]);\n $b = parseInt(rgbaMatch[3]);\n $a = Math.round((rgbaMatch[5] === undefined ? 1 : parseFloat(rgbaMatch[5])) * 0xFF);\n return channels.toColor($r, $g, $b, $a);\n }\n\n // Validate the context is available for canvas-based color parsing\n if (!$ctx || !$litmusColor) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Validate the color using canvas fillStyle\n // See https://html.spec.whatwg.org/multipage/canvas.html#fill-and-stroke-styles\n $ctx.fillStyle = $litmusColor;\n $ctx.fillStyle = css;\n if (typeof $ctx.fillStyle !== 'string') {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n $ctx.fillRect(0, 0, 1, 1);\n [$r, $g, $b, $a] = $ctx.getImageData(0, 0, 1, 1).data;\n\n // Validate the color is non-transparent as color hue gets lost when drawn to the canvas\n if ($a !== 0xFF) {\n throw new Error('css.toColor: Unsupported css format');\n }\n\n // Extract the color from the canvas' fillStyle property which exposes the color value in rgba()\n // format\n // See https://html.spec.whatwg.org/multipage/canvas.html#serialisation-of-a-color\n return {\n rgba: channels.toRgba($r, $g, $b, $a),\n css\n };\n }\n}\n\n/**\n * Helper functions where the source type is \"rgb\" (number: 0xrrggbb).\n */\nexport namespace rgb {\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param rgb The color to use.\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance(rgb: number): number {\n return relativeLuminance2(\n (rgb >> 16) & 0xFF,\n (rgb >> 8 ) & 0xFF,\n (rgb ) & 0xFF);\n }\n\n /**\n * Gets the relative luminance of an RGB color, this is useful in determining the contrast ratio\n * between two colors.\n * @param r The red channel (0x00 to 0xFF).\n * @param g The green channel (0x00 to 0xFF).\n * @param b The blue channel (0x00 to 0xFF).\n * @see https://www.w3.org/TR/WCAG20/#relativeluminancedef\n */\n export function relativeLuminance2(r: number, g: number, b: number): number {\n const rs = r / 255;\n const gs = g / 255;\n const bs = b / 255;\n const rr = rs <= 0.03928 ? rs / 12.92 : Math.pow((rs + 0.055) / 1.055, 2.4);\n const rg = gs <= 0.03928 ? gs / 12.92 : Math.pow((gs + 0.055) / 1.055, 2.4);\n const rb = bs <= 0.03928 ? bs / 12.92 : Math.pow((bs + 0.055) / 1.055, 2.4);\n return rr * 0.2126 + rg * 0.7152 + rb * 0.0722;\n }\n}\n\n/**\n * Helper functions where the source type is \"rgba\" (number: 0xrrggbbaa).\n */\nexport namespace rgba {\n export function blend(bg: number, fg: number): number {\n $a = (fg & 0xFF) / 0xFF;\n if ($a === 1) {\n return fg;\n }\n const fgR = (fg >> 24) & 0xFF;\n const fgG = (fg >> 16) & 0xFF;\n const fgB = (fg >> 8) & 0xFF;\n const bgR = (bg >> 24) & 0xFF;\n const bgG = (bg >> 16) & 0xFF;\n const bgB = (bg >> 8) & 0xFF;\n $r = bgR + Math.round((fgR - bgR) * $a);\n $g = bgG + Math.round((fgG - bgG) * $a);\n $b = bgB + Math.round((fgB - bgB) * $a);\n return channels.toRgba($r, $g, $b);\n }\n\n /**\n * Given a foreground color and a background color, either increase or reduce the luminance of the\n * foreground color until the specified contrast ratio is met. If pure white or black is hit\n * without the contrast ratio being met, go the other direction using the background color as the\n * foreground color and take either the first or second result depending on which has the higher\n * contrast ratio.\n *\n * `undefined` will be returned if the contrast ratio is already met.\n *\n * @param bgRgba The background color in rgba format.\n * @param fgRgba The foreground color in rgba format.\n * @param ratio The contrast ratio to achieve.\n */\n export function ensureContrastRatio(bgRgba: number, fgRgba: number, ratio: number): number | undefined {\n const bgL = rgb.relativeLuminance(bgRgba >> 8);\n const fgL = rgb.relativeLuminance(fgRgba >> 8);\n const cr = contrastRatio(bgL, fgL);\n if (cr < ratio) {\n if (fgL < bgL) {\n const resultA = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n const resultA = increaseLuminance(bgRgba, fgRgba, ratio);\n const resultARatio = contrastRatio(bgL, rgb.relativeLuminance(resultA >> 8));\n if (resultARatio < ratio) {\n const resultB = reduceLuminance(bgRgba, fgRgba, ratio);\n const resultBRatio = contrastRatio(bgL, rgb.relativeLuminance(resultB >> 8));\n return resultARatio > resultBRatio ? resultA : resultB;\n }\n return resultA;\n }\n return undefined;\n }\n\n export function reduceLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to reducing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR > 0 || fgG > 0 || fgB > 0)) {\n // Reduce by 10% until the ratio is hit\n fgR -= Math.max(0, Math.ceil(fgR * 0.1));\n fgG -= Math.max(0, Math.ceil(fgG * 0.1));\n fgB -= Math.max(0, Math.ceil(fgB * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function increaseLuminance(bgRgba: number, fgRgba: number, ratio: number): number {\n // This is a naive but fast approach to increasing luminance as converting to\n // HSL and back is expensive\n const bgR = (bgRgba >> 24) & 0xFF;\n const bgG = (bgRgba >> 16) & 0xFF;\n const bgB = (bgRgba >> 8) & 0xFF;\n let fgR = (fgRgba >> 24) & 0xFF;\n let fgG = (fgRgba >> 16) & 0xFF;\n let fgB = (fgRgba >> 8) & 0xFF;\n let cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n while (cr < ratio && (fgR < 0xFF || fgG < 0xFF || fgB < 0xFF)) {\n // Increase by 10% until the ratio is hit\n fgR = Math.min(0xFF, fgR + Math.ceil((255 - fgR) * 0.1));\n fgG = Math.min(0xFF, fgG + Math.ceil((255 - fgG) * 0.1));\n fgB = Math.min(0xFF, fgB + Math.ceil((255 - fgB) * 0.1));\n cr = contrastRatio(rgb.relativeLuminance2(fgR, fgG, fgB), rgb.relativeLuminance2(bgR, bgG, bgB));\n }\n return (fgR << 24 | fgG << 16 | fgB << 8 | 0xFF) >>> 0;\n }\n\n export function toChannels(value: number): [number, number, number, number] {\n return [(value >> 24) & 0xFF, (value >> 16) & 0xFF, (value >> 8) & 0xFF, value & 0xFF];\n }\n}\n\nexport function toPaddedHex(c: number): string {\n const s = c.toString(16);\n return s.length < 2 ? '0' + s : s;\n}\n\n/**\n * Gets the contrast ratio between two relative luminance values.\n * @param l1 The first relative luminance.\n * @param l2 The first relative luminance.\n * @see https://www.w3.org/TR/WCAG20/#contrast-ratiodef\n */\nexport function contrastRatio(l1: number, l2: number): number {\n if (l1 < l2) {\n return (l2 + 0.05) / (l1 + 0.05);\n }\n return (l1 + 0.05) / (l2 + 0.05);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDimensions, IRenderDimensions } from 'browser/renderer/shared/Types';\n\nexport function throwIfFalsy<T>(value: T | undefined | null): T {\n if (!value) {\n throw new Error('value must not be falsy');\n }\n return value;\n}\n\nexport function isPowerlineGlyph(codepoint: number): boolean {\n // Only return true for Powerline symbols which require\n // different padding and should be excluded from minimum contrast\n // ratio standards\n return 0xE0A4 <= codepoint && codepoint <= 0xE0D6;\n}\n\nexport function isRestrictedPowerlineGlyph(codepoint: number): boolean {\n return 0xE0B0 <= codepoint && codepoint <= 0xE0B7;\n}\n\nfunction isNerdFontGlyph(codepoint: number): boolean {\n return 0xE000 <= codepoint && codepoint <= 0xF8FF;\n}\n\nfunction isBoxOrBlockGlyph(codepoint: number): boolean {\n return 0x2500 <= codepoint && codepoint <= 0x259F;\n}\n\nexport function isEmoji(codepoint: number): boolean {\n return (\n codepoint >= 0x1F600 && codepoint <= 0x1F64F || // Emoticons\n codepoint >= 0x1F300 && codepoint <= 0x1F5FF || // Misc Symbols and Pictographs\n codepoint >= 0x1F680 && codepoint <= 0x1F6FF || // Transport and Map\n codepoint >= 0x2600 && codepoint <= 0x26FF || // Misc symbols\n codepoint >= 0x2700 && codepoint <= 0x27BF || // Dingbats\n codepoint >= 0xFE00 && codepoint <= 0xFE0F || // Variation Selectors\n codepoint >= 0x1F900 && codepoint <= 0x1F9FF || // Supplemental Symbols and Pictographs\n codepoint >= 0x1F1E6 && codepoint <= 0x1F1FF\n );\n}\n\nexport function allowRescaling(codepoint: number | undefined, width: number, glyphSizeX: number, deviceCellWidth: number): boolean {\n return (\n // Is single cell width\n width === 1 &&\n // Glyph exceeds cell bounds, add 50% to avoid hurting readability by rescaling glyphs that\n // barely overlap\n glyphSizeX > Math.ceil(deviceCellWidth * 1.5) &&\n // Never rescale ascii\n codepoint !== undefined && codepoint > 0xFF &&\n // Never rescale emoji\n !isEmoji(codepoint) &&\n // Never rescale powerline or nerd fonts\n !isPowerlineGlyph(codepoint) && !isNerdFontGlyph(codepoint)\n );\n}\n\nexport function treatGlyphAsBackgroundColor(codepoint: number): boolean {\n return isPowerlineGlyph(codepoint) || isBoxOrBlockGlyph(codepoint);\n}\n\nexport function createRenderDimensions(): IRenderDimensions {\n return {\n css: {\n canvas: createDimension(),\n cell: createDimension()\n },\n device: {\n canvas: createDimension(),\n cell: createDimension(),\n char: {\n width: 0,\n height: 0,\n left: 0,\n top: 0\n }\n }\n };\n}\n\nfunction createDimension(): IDimensions {\n return {\n width: 0,\n height: 0\n };\n}\n\nexport function computeNextVariantOffset(cellWidth: number, lineWidth: number, currentOffset: number = 0): number {\n return (cellWidth - (Math.round(lineWidth) * 2 - currentOffset)) % (Math.round(lineWidth) * 2);\n}\n", "import { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, BgFlags, ExtFlags, FgFlags, NULL_CELL_CODE, UnderlineStyle } from 'common/buffer/Constants';\nimport { IDecorationService, IOptionsService } from 'common/services/Services';\nimport { ICellData } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { rgba } from 'common/Color';\nimport { treatGlyphAsBackgroundColor } from 'browser/renderer/shared/RendererUtils';\n\n// Work variables to avoid garbage collection\nlet $fg = 0;\nlet $bg = 0;\nlet $hasFg = false;\nlet $hasBg = false;\nlet $isSelected = false;\nlet $colors: ReadonlyColorSet | undefined;\nlet $variantOffset = 0;\n\nexport class CellColorResolver {\n /**\n * The shared result of the {@link resolve} call. This is only safe to use immediately after as\n * any other calls will share object.\n */\n public readonly result: { fg: number, bg: number, ext: number } = {\n fg: 0,\n bg: 0,\n ext: 0\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _optionService: IOptionsService,\n private readonly _selectionRenderModel: ISelectionRenderModel,\n private readonly _decorationService: IDecorationService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _themeService: IThemeService\n ) {\n }\n\n /**\n * Resolves colors for the cell, putting the result into the shared {@link result}. This resolves\n * overrides, inverse and selection for the cell which can then be used to feed into the renderer.\n */\n public resolve(cell: ICellData, x: number, y: number, deviceCellWidth: number): void {\n this.result.bg = cell.bg;\n this.result.fg = cell.fg;\n this.result.ext = cell.bg & BgFlags.HAS_EXTENDED ? cell.extended.ext : 0;\n // Get any foreground/background overrides, this happens on the model to avoid spreading\n // override logic throughout the different sub-renderers\n\n // Reset overrides work variables\n $bg = 0;\n $fg = 0;\n $hasBg = false;\n $hasFg = false;\n $isSelected = false;\n $colors = this._themeService.colors;\n $variantOffset = 0;\n\n const code = cell.getCode();\n if (code !== NULL_CELL_CODE && cell.extended.underlineStyle === UnderlineStyle.DOTTED) {\n const lineWidth = Math.max(1, Math.floor(this._optionService.rawOptions.fontSize * this._coreBrowserService.dpr / 15));\n $variantOffset = x * deviceCellWidth % (Math.round(lineWidth) * 2);\n }\n\n // Apply decorations on the bottom layer\n this._decorationService.forEachDecorationAtCell(x, y, 'bottom', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Apply the selection color if needed\n $isSelected = this._selectionRenderModel.isCellSelected(this._terminal, x, y);\n if ($isSelected) {\n // If the cell has a bg color, retain the color by blending it with the selection color\n if (\n (this.result.fg & FgFlags.INVERSE) ||\n (this.result.bg & Attributes.CM_MASK) !== Attributes.CM_DEFAULT\n ) {\n // Resolve the standard bg color\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $bg = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $bg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $bg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n }\n // Blend with selection bg color\n $bg = rgba.blend(\n $bg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n } else {\n $bg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n }\n $hasBg = true;\n\n // Apply explicit selection foreground if present\n if ($colors.selectionForeground) {\n $fg = $colors.selectionForeground.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n\n // Overwrite fg as bg if it's a special decorative glyph (eg. powerline)\n if (treatGlyphAsBackgroundColor(cell.getCode())) {\n // Inverse default background should be treated as transparent\n if (\n (this.result.fg & FgFlags.INVERSE) &&\n (this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT\n ) {\n $fg = (this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba >> 8 & Attributes.RGB_MASK;\n } else {\n\n if (this.result.fg & FgFlags.INVERSE) {\n switch (this.result.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.bg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n // No need to consider default bg color here as it's not possible\n }\n } else {\n switch (this.result.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $fg = this._themeService.colors.ansi[this.result.fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $fg = ((this.result.fg & Attributes.RGB_MASK) << 8) | 0xFF;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $fg = this._themeService.colors.foreground.rgba;\n }\n }\n\n $fg = rgba.blend(\n $fg,\n ((this._coreBrowserService.isFocused ? $colors.selectionBackgroundOpaque : $colors.selectionInactiveBackgroundOpaque).rgba & 0xFFFFFF00) | 0x80\n ) >> 8 & Attributes.RGB_MASK;\n }\n $hasFg = true;\n }\n }\n\n // Apply decorations on the top layer\n this._decorationService.forEachDecorationAtCell(x, y, 'top', d => {\n if (d.backgroundColorRGB) {\n $bg = d.backgroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasBg = true;\n }\n if (d.foregroundColorRGB) {\n $fg = d.foregroundColorRGB.rgba >> 8 & Attributes.RGB_MASK;\n $hasFg = true;\n }\n });\n\n // Convert any overrides from rgba to the fg/bg packed format. This resolves the inverse flag\n // ahead of time in order to use the correct cache key\n if ($hasBg) {\n if ($isSelected) {\n // Non-RGB attributes from model + force non-dim + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK & ~BgFlags.DIM) | $bg | Attributes.CM_RGB;\n } else {\n // Non-RGB attributes from model + override + force RGB color mode\n $bg = (cell.bg & ~Attributes.RGB_MASK) | $bg | Attributes.CM_RGB;\n }\n }\n if ($hasFg) {\n // Non-RGB attributes from model + force disable inverse + override + force RGB color mode\n $fg = (cell.fg & ~Attributes.RGB_MASK & ~FgFlags.INVERSE) | $fg | Attributes.CM_RGB;\n }\n\n // Handle case where inverse was specified by only one of bg override or fg override was set,\n // resolving the other inverse color and setting the inverse flag if needed.\n if (this.result.fg & FgFlags.INVERSE) {\n if ($hasBg && !$hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.bg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | (($colors.background.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $fg = (this.result.fg & ~(Attributes.RGB_MASK | FgFlags.INVERSE | Attributes.CM_MASK)) | this.result.bg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasFg = true;\n }\n if (!$hasBg && $hasFg) {\n // Resolve bg color type (default color has a different meaning in fg vs bg)\n if ((this.result.fg & Attributes.CM_MASK) === Attributes.CM_DEFAULT) {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | (($colors.foreground.rgba >> 8 & Attributes.RGB_MASK) & Attributes.RGB_MASK) | Attributes.CM_RGB;\n } else {\n $bg = (this.result.bg & ~(Attributes.RGB_MASK | Attributes.CM_MASK)) | this.result.fg & (Attributes.RGB_MASK | Attributes.CM_MASK);\n }\n $hasBg = true;\n }\n }\n\n // Release object\n $colors = undefined;\n\n // Use the override if it exists\n this.result.bg = $hasBg ? $bg : this.result.bg;\n this.result.fg = $hasFg ? $fg : this.result.fg;\n\n // Reset overrides variantOffset\n this.result.ext &= ~ExtFlags.VARIANT_OFFSET;\n this.result.ext |= ($variantOffset << 29) & ExtFlags.VARIANT_OFFSET;\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isFirefox, isLegacyEdge } from 'common/Platform';\n\nexport const INVERTED_DEFAULT_COLOR = 257;\n\nexport const DIM_OPACITY = 0.5;\n// The text baseline is set conditionally by browser. Using 'ideographic' for Firefox or Legacy Edge\n// would result in truncated text (Issue 3353). Using 'bottom' for Chrome would result in slightly\n// unaligned Powerline fonts (PR 3356#issuecomment-850928179).\nexport const TEXT_BASELINE: CanvasTextBaseline = isFirefox || isLegacyEdge ? 'bottom' : 'ideographic';\n", "/**\n * Copyright (c) 2021 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\ninterface IBlockVector {\n x: number;\n y: number;\n w: number;\n h: number;\n}\n\nexport const blockElementDefinitions: { [index: string]: IBlockVector[] | undefined } = {\n // Block elements (0x2580-0x2590)\n '\u2580': [{ x: 0, y: 0, w: 8, h: 4 }], // UPPER HALF BLOCK\n '\u2581': [{ x: 0, y: 7, w: 8, h: 1 }], // LOWER ONE EIGHTH BLOCK\n '\u2582': [{ x: 0, y: 6, w: 8, h: 2 }], // LOWER ONE QUARTER BLOCK\n '\u2583': [{ x: 0, y: 5, w: 8, h: 3 }], // LOWER THREE EIGHTHS BLOCK\n '\u2584': [{ x: 0, y: 4, w: 8, h: 4 }], // LOWER HALF BLOCK\n '\u2585': [{ x: 0, y: 3, w: 8, h: 5 }], // LOWER FIVE EIGHTHS BLOCK\n '\u2586': [{ x: 0, y: 2, w: 8, h: 6 }], // LOWER THREE QUARTERS BLOCK\n '\u2587': [{ x: 0, y: 1, w: 8, h: 7 }], // LOWER SEVEN EIGHTHS BLOCK\n '\u2588': [{ x: 0, y: 0, w: 8, h: 8 }], // FULL BLOCK\n '\u2589': [{ x: 0, y: 0, w: 7, h: 8 }], // LEFT SEVEN EIGHTHS BLOCK\n '\u258A': [{ x: 0, y: 0, w: 6, h: 8 }], // LEFT THREE QUARTERS BLOCK\n '\u258B': [{ x: 0, y: 0, w: 5, h: 8 }], // LEFT FIVE EIGHTHS BLOCK\n '\u258C': [{ x: 0, y: 0, w: 4, h: 8 }], // LEFT HALF BLOCK\n '\u258D': [{ x: 0, y: 0, w: 3, h: 8 }], // LEFT THREE EIGHTHS BLOCK\n '\u258E': [{ x: 0, y: 0, w: 2, h: 8 }], // LEFT ONE QUARTER BLOCK\n '\u258F': [{ x: 0, y: 0, w: 1, h: 8 }], // LEFT ONE EIGHTH BLOCK\n '\u2590': [{ x: 4, y: 0, w: 4, h: 8 }], // RIGHT HALF BLOCK\n\n // Block elements (0x2594-0x2595)\n '\u2594': [{ x: 0, y: 0, w: 8, h: 1 }], // UPPER ONE EIGHTH BLOCK\n '\u2595': [{ x: 7, y: 0, w: 1, h: 8 }], // RIGHT ONE EIGHTH BLOCK\n\n // Terminal graphic characters (0x2596-0x259F)\n '\u2596': [{ x: 0, y: 4, w: 4, h: 4 }], // QUADRANT LOWER LEFT\n '\u2597': [{ x: 4, y: 4, w: 4, h: 4 }], // QUADRANT LOWER RIGHT\n '\u2598': [{ x: 0, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT\n '\u2599': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER LEFT AND LOWER LEFT AND LOWER RIGHT\n '\u259A': [{ x: 0, y: 0, w: 4, h: 4 }, { x: 4, y: 4, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND LOWER RIGHT\n '\u259B': [{ x: 0, y: 0, w: 4, h: 8 }, { x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER LEFT\n '\u259C': [{ x: 0, y: 0, w: 8, h: 4 }, { x: 4, y: 0, w: 4, h: 8 }], // QUADRANT UPPER LEFT AND UPPER RIGHT AND LOWER RIGHT\n '\u259D': [{ x: 4, y: 0, w: 4, h: 4 }], // QUADRANT UPPER RIGHT\n '\u259E': [{ x: 4, y: 0, w: 4, h: 4 }, { x: 0, y: 4, w: 4, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT\n '\u259F': [{ x: 4, y: 0, w: 4, h: 8 }, { x: 0, y: 4, w: 8, h: 4 }], // QUADRANT UPPER RIGHT AND LOWER LEFT AND LOWER RIGHT\n\n // VERTICAL ONE EIGHTH BLOCK-2 through VERTICAL ONE EIGHTH BLOCK-7\n '\\u{1FB70}': [{ x: 1, y: 0, w: 1, h: 8 }],\n '\\u{1FB71}': [{ x: 2, y: 0, w: 1, h: 8 }],\n '\\u{1FB72}': [{ x: 3, y: 0, w: 1, h: 8 }],\n '\\u{1FB73}': [{ x: 4, y: 0, w: 1, h: 8 }],\n '\\u{1FB74}': [{ x: 5, y: 0, w: 1, h: 8 }],\n '\\u{1FB75}': [{ x: 6, y: 0, w: 1, h: 8 }],\n\n // HORIZONTAL ONE EIGHTH BLOCK-2 through HORIZONTAL ONE EIGHTH BLOCK-7\n '\\u{1FB76}': [{ x: 0, y: 1, w: 8, h: 1 }],\n '\\u{1FB77}': [{ x: 0, y: 2, w: 8, h: 1 }],\n '\\u{1FB78}': [{ x: 0, y: 3, w: 8, h: 1 }],\n '\\u{1FB79}': [{ x: 0, y: 4, w: 8, h: 1 }],\n '\\u{1FB7A}': [{ x: 0, y: 5, w: 8, h: 1 }],\n '\\u{1FB7B}': [{ x: 0, y: 6, w: 8, h: 1 }],\n\n // LEFT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7C}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // LEFT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7D}': [{ x: 0, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND UPPER ONE EIGHTH BLOCK\n '\\u{1FB7E}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 0, w: 8, h: 1 }],\n // RIGHT AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB7F}': [{ x: 7, y: 0, w: 1, h: 8 }, { x: 0, y: 7, w: 8, h: 1 }],\n // UPPER AND LOWER ONE EIGHTH BLOCK\n '\\u{1FB80}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n // HORIZONTAL ONE EIGHTH BLOCK-1358\n '\\u{1FB81}': [{ x: 0, y: 0, w: 8, h: 1 }, { x: 0, y: 2, w: 8, h: 1 }, { x: 0, y: 4, w: 8, h: 1 }, { x: 0, y: 7, w: 8, h: 1 }],\n\n // UPPER ONE QUARTER BLOCK\n '\\u{1FB82}': [{ x: 0, y: 0, w: 8, h: 2 }],\n // UPPER THREE EIGHTHS BLOCK\n '\\u{1FB83}': [{ x: 0, y: 0, w: 8, h: 3 }],\n // UPPER FIVE EIGHTHS BLOCK\n '\\u{1FB84}': [{ x: 0, y: 0, w: 8, h: 5 }],\n // UPPER THREE QUARTERS BLOCK\n '\\u{1FB85}': [{ x: 0, y: 0, w: 8, h: 6 }],\n // UPPER SEVEN EIGHTHS BLOCK\n '\\u{1FB86}': [{ x: 0, y: 0, w: 8, h: 7 }],\n\n // RIGHT ONE QUARTER BLOCK\n '\\u{1FB87}': [{ x: 6, y: 0, w: 2, h: 8 }],\n // RIGHT THREE EIGHTHS B0OCK\n '\\u{1FB88}': [{ x: 5, y: 0, w: 3, h: 8 }],\n // RIGHT FIVE EIGHTHS BL0CK\n '\\u{1FB89}': [{ x: 3, y: 0, w: 5, h: 8 }],\n // RIGHT THREE QUARTERS 0LOCK\n '\\u{1FB8A}': [{ x: 2, y: 0, w: 6, h: 8 }],\n // RIGHT SEVEN EIGHTHS B0OCK\n '\\u{1FB8B}': [{ x: 1, y: 0, w: 7, h: 8 }],\n\n // CHECKER BOARD FILL\n '\\u{1FB95}': [\n { x: 0, y: 0, w: 2, h: 2 }, { x: 4, y: 0, w: 2, h: 2 },\n { x: 2, y: 2, w: 2, h: 2 }, { x: 6, y: 2, w: 2, h: 2 },\n { x: 0, y: 4, w: 2, h: 2 }, { x: 4, y: 4, w: 2, h: 2 },\n { x: 2, y: 6, w: 2, h: 2 }, { x: 6, y: 6, w: 2, h: 2 }\n ],\n // INVERSE CHECKER BOARD FILL\n '\\u{1FB96}': [\n { x: 2, y: 0, w: 2, h: 2 }, { x: 6, y: 0, w: 2, h: 2 },\n { x: 0, y: 2, w: 2, h: 2 }, { x: 4, y: 2, w: 2, h: 2 },\n { x: 2, y: 4, w: 2, h: 2 }, { x: 6, y: 4, w: 2, h: 2 },\n { x: 0, y: 6, w: 2, h: 2 }, { x: 4, y: 6, w: 2, h: 2 }\n ],\n // HEAVY HORIZONTAL FILL (upper middle and lower one quarter block)\n '\\u{1FB97}': [{ x: 0, y: 2, w: 8, h: 2 }, { x: 0, y: 6, w: 8, h: 2 }]\n};\n\ntype PatternDefinition = number[][];\n\n/**\n * Defines the repeating pattern used by special characters, the pattern is made up of a 2d array of\n * pixel values to be filled (1) or not filled (0).\n */\nconst patternCharacterDefinitions: { [key: string]: PatternDefinition | undefined } = {\n // Shade characters (0x2591-0x2593)\n '\u2591': [ // LIGHT SHADE (25%)\n [1, 0, 0, 0],\n [0, 0, 0, 0],\n [0, 0, 1, 0],\n [0, 0, 0, 0]\n ],\n '\u2592': [ // MEDIUM SHADE (50%)\n [1, 0],\n [0, 0],\n [0, 1],\n [0, 0]\n ],\n '\u2593': [ // DARK SHADE (75%)\n [0, 1],\n [1, 1],\n [1, 0],\n [1, 1]\n ]\n};\n\nconst enum Shapes {\n /** \u2502 */ TOP_TO_BOTTOM = 'M.5,0 L.5,1',\n /** \u2500 */ LEFT_TO_RIGHT = 'M0,.5 L1,.5',\n\n /** \u2514 */ TOP_TO_RIGHT = 'M.5,0 L.5,.5 L1,.5',\n /** \u2518 */ TOP_TO_LEFT = 'M.5,0 L.5,.5 L0,.5',\n /** \u2510 */ LEFT_TO_BOTTOM = 'M0,.5 L.5,.5 L.5,1',\n /** \u250C */ RIGHT_TO_BOTTOM = 'M0.5,1 L.5,.5 L1,.5',\n\n /** \u2575 */ MIDDLE_TO_TOP = 'M.5,.5 L.5,0',\n /** \u2574 */ MIDDLE_TO_LEFT = 'M.5,.5 L0,.5',\n /** \u2576 */ MIDDLE_TO_RIGHT = 'M.5,.5 L1,.5',\n /** \u2577 */ MIDDLE_TO_BOTTOM = 'M.5,.5 L.5,1',\n\n /** \u2534 */ T_TOP = 'M0,.5 L1,.5 M.5,.5 L.5,0',\n /** \u2524 */ T_LEFT = 'M.5,0 L.5,1 M.5,.5 L0,.5',\n /** \u251C */ T_RIGHT = 'M.5,0 L.5,1 M.5,.5 L1,.5',\n /** \u252C */ T_BOTTOM = 'M0,.5 L1,.5 M.5,.5 L.5,1',\n\n /** \u253C */ CROSS = 'M0,.5 L1,.5 M.5,0 L.5,1',\n\n /** \u254C */ TWO_DASHES_HORIZONTAL = 'M.1,.5 L.4,.5 M.6,.5 L.9,.5', // .2 empty, .3 filled\n /** \u2504 */ THREE_DASHES_HORIZONTAL = 'M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5', // .1333 empty, .2 filled\n /** \u2509 */ FOUR_DASHES_HORIZONTAL = 'M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5', // .1 empty, .15 filled\n /** \u254E */ TWO_DASHES_VERTICAL = 'M.5,.1 L.5,.4 M.5,.6 L.5,.9',\n /** \u2506 */ THREE_DASHES_VERTICAL = 'M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333',\n /** \u250A */ FOUR_DASHES_VERTICAL = 'M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95',\n}\n\nconst enum Style {\n NORMAL = 1,\n BOLD = 3\n}\n\n/**\n * @param xp The percentage of 15% of the x axis.\n * @param yp The percentage of 15% of the x axis on the y axis.\n */\ntype DrawFunctionDefinition = (xp: number, yp: number) => string;\n\n/**\n * This contains the definitions of all box drawing characters in the format of SVG paths (ie. the\n * svg d attribute).\n */\nexport const boxDrawingDefinitions: { [character: string]: { [fontWeight: number]: string | DrawFunctionDefinition } | undefined } = {\n // Uniform normal and bold\n '\u2500': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT },\n '\u2501': { [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2502': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM },\n '\u2503': { [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u250C': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM },\n '\u250F': { [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2510': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM },\n '\u2513': { [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2514': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT },\n '\u2517': { [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2518': { [Style.NORMAL]: Shapes.TOP_TO_LEFT },\n '\u251B': { [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u251C': { [Style.NORMAL]: Shapes.T_RIGHT },\n '\u2523': { [Style.BOLD]: Shapes.T_RIGHT },\n '\u2524': { [Style.NORMAL]: Shapes.T_LEFT },\n '\u252B': { [Style.BOLD]: Shapes.T_LEFT },\n '\u252C': { [Style.NORMAL]: Shapes.T_BOTTOM },\n '\u2533': { [Style.BOLD]: Shapes.T_BOTTOM },\n '\u2534': { [Style.NORMAL]: Shapes.T_TOP },\n '\u253B': { [Style.BOLD]: Shapes.T_TOP },\n '\u253C': { [Style.NORMAL]: Shapes.CROSS },\n '\u254B': { [Style.BOLD]: Shapes.CROSS },\n '\u2574': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT },\n '\u2578': { [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2575': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP },\n '\u2579': { [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2576': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT },\n '\u257A': { [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2577': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM },\n '\u257B': { [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n\n // Double border\n '\u2550': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u2551': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u2552': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '\u2553': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},1 L${.5 - xp},.5 L1,.5 M${.5 + xp},.5 L${.5 + xp},1` },\n '\u2554': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '\u2555': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L.5,${.5 - yp} L.5,1 M0,${.5 + yp} L.5,${.5 + yp}` },\n '\u2556': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},1 L${.5 + xp},.5 L0,.5 M${.5 - xp},.5 L${.5 - xp},1` },\n '\u2557': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},1` },\n '\u2558': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 + yp} L1,${.5 + yp} M.5,${.5 - yp} L1,${.5 - yp}` },\n '\u2559': { [Style.NORMAL]: (xp, yp) => `M1,.5 L${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '\u255A': { [Style.NORMAL]: (xp, yp) => `M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0 M1,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},0` },\n '\u255B': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L.5,${.5 + yp} L.5,0 M0,${.5 - yp} L.5,${.5 - yp}` },\n '\u255C': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 + xp},.5 L${.5 + xp},0 M${.5 - xp},.5 L${.5 - xp},0` },\n '\u255D': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M0,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},0` },\n '\u255E': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M.5,${.5 - yp} L1,${.5 - yp} M.5,${.5 + yp} L1,${.5 + yp}` },\n '\u255F': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1 M${.5 + xp},.5 L1,.5` },\n '\u2560': { [Style.NORMAL]: (xp, yp) => `M${.5 - xp},0 L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '\u2561': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L.5,${.5 - yp} M0,${.5 + yp} L.5,${.5 + yp}` },\n '\u2562': { [Style.NORMAL]: (xp, yp) => `M0,.5 L${.5 - xp},.5 M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u2563': { [Style.NORMAL]: (xp, yp) => `M${.5 + xp},0 L${.5 + xp},1 M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0` },\n '\u2564': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp} M.5,${.5 + yp} L.5,1` },\n '\u2565': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},1 M${.5 + xp},.5 L${.5 + xp},1` },\n '\u2566': { [Style.NORMAL]: (xp, yp) => `M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1` },\n '\u2567': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - yp} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u2568': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},.5 L${.5 - xp},0 M${.5 + xp},.5 L${.5 + xp},0` },\n '\u2569': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L1,${.5 + yp} M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n '\u256A': { [Style.NORMAL]: (xp, yp) => `${Shapes.TOP_TO_BOTTOM} M0,${.5 - yp} L1,${.5 - yp} M0,${.5 + yp} L1,${.5 + yp}` },\n '\u256B': { [Style.NORMAL]: (xp, yp) => `${Shapes.LEFT_TO_RIGHT} M${.5 - xp},0 L${.5 - xp},1 M${.5 + xp},0 L${.5 + xp},1` },\n '\u256C': { [Style.NORMAL]: (xp, yp) => `M0,${.5 + yp} L${.5 - xp},${.5 + yp} L${.5 - xp},1 M1,${.5 + yp} L${.5 + xp},${.5 + yp} L${.5 + xp},1 M0,${.5 - yp} L${.5 - xp},${.5 - yp} L${.5 - xp},0 M1,${.5 - yp} L${.5 + xp},${.5 - yp} L${.5 + xp},0` },\n\n // Diagonal\n '\u2571': { [Style.NORMAL]: 'M1,0 L0,1' },\n '\u2572': { [Style.NORMAL]: 'M0,0 L1,1' },\n '\u2573': { [Style.NORMAL]: 'M1,0 L0,1 M0,0 L1,1' },\n\n // Mixed weight\n '\u257C': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u257D': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u257E': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u257F': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u250D': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u250E': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2511': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2512': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2515': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2516': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2519': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u251A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u251D': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u251E': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u251F': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2520': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2521': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2522': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2525': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2526': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2527': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2528': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2529': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u252A': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u252D': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u252E': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u252F': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2530': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2531': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2532': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2535': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u2536': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u2537': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2538': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2539': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u253A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u253D': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_LEFT },\n '\u253E': { [Style.NORMAL]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}`, [Style.BOLD]: Shapes.MIDDLE_TO_RIGHT },\n '\u253F': { [Style.NORMAL]: Shapes.TOP_TO_BOTTOM, [Style.BOLD]: Shapes.LEFT_TO_RIGHT },\n '\u2540': { [Style.NORMAL]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}`, [Style.BOLD]: Shapes.MIDDLE_TO_TOP },\n '\u2541': { [Style.NORMAL]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}`, [Style.BOLD]: Shapes.MIDDLE_TO_BOTTOM },\n '\u2542': { [Style.NORMAL]: Shapes.LEFT_TO_RIGHT, [Style.BOLD]: Shapes.TOP_TO_BOTTOM },\n '\u2543': { [Style.NORMAL]: Shapes.RIGHT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_LEFT },\n '\u2544': { [Style.NORMAL]: Shapes.LEFT_TO_BOTTOM, [Style.BOLD]: Shapes.TOP_TO_RIGHT },\n '\u2545': { [Style.NORMAL]: Shapes.TOP_TO_RIGHT, [Style.BOLD]: Shapes.LEFT_TO_BOTTOM },\n '\u2546': { [Style.NORMAL]: Shapes.TOP_TO_LEFT, [Style.BOLD]: Shapes.RIGHT_TO_BOTTOM },\n '\u2547': { [Style.NORMAL]: Shapes.MIDDLE_TO_BOTTOM, [Style.BOLD]: `${Shapes.MIDDLE_TO_TOP} ${Shapes.LEFT_TO_RIGHT}` },\n '\u2548': { [Style.NORMAL]: Shapes.MIDDLE_TO_TOP, [Style.BOLD]: `${Shapes.LEFT_TO_RIGHT} ${Shapes.MIDDLE_TO_BOTTOM}` },\n '\u2549': { [Style.NORMAL]: Shapes.MIDDLE_TO_RIGHT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_LEFT}` },\n '\u254A': { [Style.NORMAL]: Shapes.MIDDLE_TO_LEFT, [Style.BOLD]: `${Shapes.TOP_TO_BOTTOM} ${Shapes.MIDDLE_TO_RIGHT}` },\n\n // Dashed\n '\u254C': { [Style.NORMAL]: Shapes.TWO_DASHES_HORIZONTAL },\n '\u254D': { [Style.BOLD]: Shapes.TWO_DASHES_HORIZONTAL },\n '\u2504': { [Style.NORMAL]: Shapes.THREE_DASHES_HORIZONTAL },\n '\u2505': { [Style.BOLD]: Shapes.THREE_DASHES_HORIZONTAL },\n '\u2508': { [Style.NORMAL]: Shapes.FOUR_DASHES_HORIZONTAL },\n '\u2509': { [Style.BOLD]: Shapes.FOUR_DASHES_HORIZONTAL },\n '\u254E': { [Style.NORMAL]: Shapes.TWO_DASHES_VERTICAL },\n '\u254F': { [Style.BOLD]: Shapes.TWO_DASHES_VERTICAL },\n '\u2506': { [Style.NORMAL]: Shapes.THREE_DASHES_VERTICAL },\n '\u2507': { [Style.BOLD]: Shapes.THREE_DASHES_VERTICAL },\n '\u250A': { [Style.NORMAL]: Shapes.FOUR_DASHES_VERTICAL },\n '\u250B': { [Style.BOLD]: Shapes.FOUR_DASHES_VERTICAL },\n\n // Curved\n '\u256D': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,1,.5` },\n '\u256E': { [Style.NORMAL]: (xp, yp) => `M.5,1 L.5,${.5 + (yp / .15 * .5)} C.5,${.5 + (yp / .15 * .5)},.5,.5,0,.5` },\n '\u256F': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,0,.5` },\n '\u2570': { [Style.NORMAL]: (xp, yp) => `M.5,0 L.5,${.5 - (yp / .15 * .5)} C.5,${.5 - (yp / .15 * .5)},.5,.5,1,.5` }\n};\n\ninterface IVectorShape {\n d: string;\n type: VectorType;\n leftPadding?: number;\n rightPadding?: number;\n}\n\nconst enum VectorType {\n FILL,\n STROKE\n}\n\n/**\n * This contains the definitions of the primarily used box drawing characters as vector shapes. The\n * reason these characters are defined specially is to avoid common problems if a user's font has\n * not been patched with powerline characters and also to get pixel perfect rendering as rendering\n * issues can occur around AA/SPAA.\n *\n * The line variants draw beyond the cell and get clipped to ensure the end of the line is not\n * visible.\n *\n * Original symbols defined in https://github.com/powerline/fontpatcher\n */\nexport const powerlineDefinitions: { [index: string]: IVectorShape } = {\n // Git branch\n '\\u{E0A0}': { d: 'M.3,1 L.03,1 L.03,.88 C.03,.82,.06,.78,.11,.73 C.15,.7,.2,.68,.28,.65 L.43,.6 C.49,.58,.53,.56,.56,.53 C.59,.5,.6,.47,.6,.43 L.6,.27 L.4,.27 L.69,.1 L.98,.27 L.78,.27 L.78,.46 C.78,.52,.76,.56,.72,.61 C.68,.66,.63,.67,.56,.7 L.48,.72 C.42,.74,.38,.76,.35,.78 C.32,.8,.31,.84,.31,.88 L.31,1 M.3,.5 L.03,.59 L.03,.09 L.3,.09 L.3,.655', type: VectorType.FILL },\n // L N\n '\\u{E0A1}': { d: 'M.7,.4 L.7,.47 L.2,.47 L.2,.03 L.355,.03 L.355,.4 L.705,.4 M.7,.5 L.86,.5 L.86,.95 L.69,.95 L.44,.66 L.46,.86 L.46,.95 L.3,.95 L.3,.49 L.46,.49 L.71,.78 L.69,.565 L.69,.5', type: VectorType.FILL },\n // Lock\n '\\u{E0A2}': { d: 'M.25,.94 C.16,.94,.11,.92,.11,.87 L.11,.53 C.11,.48,.15,.455,.23,.45 L.23,.3 C.23,.25,.26,.22,.31,.19 C.36,.16,.43,.15,.51,.15 C.59,.15,.66,.16,.71,.19 C.77,.22,.79,.26,.79,.3 L.79,.45 C.87,.45,.91,.48,.91,.53 L.91,.87 C.91,.92,.86,.94,.77,.94 L.24,.94 M.53,.2 C.49,.2,.45,.21,.42,.23 C.39,.25,.38,.27,.38,.3 L.38,.45 L.68,.45 L.68,.3 C.68,.27,.67,.25,.64,.23 C.61,.21,.58,.2,.53,.2 M.58,.82 L.58,.66 C.63,.65,.65,.63,.65,.6 C.65,.58,.64,.57,.61,.56 C.58,.55,.56,.54,.52,.54 C.48,.54,.46,.55,.43,.56 C.4,.57,.39,.59,.39,.6 C.39,.63,.41,.64,.46,.66 L.46,.82 L.57,.82', type: VectorType.FILL },\n // Right triangle solid\n '\\u{E0B0}': { d: 'M0,0 L1,.5 L0,1', type: VectorType.FILL, rightPadding: 2 },\n // Right triangle line\n '\\u{E0B1}': { d: 'M-1,-.5 L1,.5 L-1,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Left triangle solid\n '\\u{E0B2}': { d: 'M1,0 L0,.5 L1,1', type: VectorType.FILL, leftPadding: 2 },\n // Left triangle line\n '\\u{E0B3}': { d: 'M2,-.5 L0,.5 L2,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Right semi-circle solid\n '\\u{E0B4}': { d: 'M0,0 L0,1 C0.552,1,1,0.776,1,.5 C1,0.224,0.552,0,0,0', type: VectorType.FILL, rightPadding: 1 },\n // Right semi-circle line\n '\\u{E0B5}': { d: 'M.2,1 C.422,1,.8,.826,.78,.5 C.8,.174,0.422,0,.2,0', type: VectorType.STROKE, rightPadding: 1 },\n // Left semi-circle solid\n '\\u{E0B6}': { d: 'M1,0 L1,1 C0.448,1,0,0.776,0,.5 C0,0.224,0.448,0,1,0', type: VectorType.FILL, leftPadding: 1 },\n // Left semi-circle line\n '\\u{E0B7}': { d: 'M.8,1 C0.578,1,0.2,.826,.22,.5 C0.2,0.174,0.578,0,0.8,0', type: VectorType.STROKE, leftPadding: 1 },\n // Lower left triangle\n '\\u{E0B8}': { d: 'M-.5,-.5 L1.5,1.5 L-.5,1.5', type: VectorType.FILL },\n // Backslash separator\n '\\u{E0B9}': { d: 'M-.5,-.5 L1.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Lower right triangle\n '\\u{E0BA}': { d: 'M1.5,-.5 L-.5,1.5 L1.5,1.5', type: VectorType.FILL },\n // Upper left triangle\n '\\u{E0BC}': { d: 'M1.5,-.5 L-.5,1.5 L-.5,-.5', type: VectorType.FILL },\n // Forward slash separator\n '\\u{E0BD}': { d: 'M1.5,-.5 L-.5,1.5', type: VectorType.STROKE, leftPadding: 1, rightPadding: 1 },\n // Upper right triangle\n '\\u{E0BE}': { d: 'M-.5,-.5 L1.5,1.5 L1.5,-.5', type: VectorType.FILL }\n};\n// Forward slash separator redundant\npowerlineDefinitions['\\u{E0BB}'] = powerlineDefinitions['\\u{E0BD}'];\n// Backslash separator redundant\npowerlineDefinitions['\\u{E0BF}'] = powerlineDefinitions['\\u{E0B9}'];\n\n/**\n * Try drawing a custom block element or box drawing character, returning whether it was\n * successfully drawn.\n */\nexport function tryDrawCustomChar(\n ctx: CanvasRenderingContext2D,\n c: string,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number\n): boolean {\n const blockElementDefinition = blockElementDefinitions[c];\n if (blockElementDefinition) {\n drawBlockElementChar(ctx, blockElementDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n return true;\n }\n\n const patternDefinition = patternCharacterDefinitions[c];\n if (patternDefinition) {\n drawPatternChar(ctx, patternDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n return true;\n }\n\n const boxDrawingDefinition = boxDrawingDefinitions[c];\n if (boxDrawingDefinition) {\n drawBoxDrawingChar(ctx, boxDrawingDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, devicePixelRatio);\n return true;\n }\n\n const powerlineDefinition = powerlineDefinitions[c];\n if (powerlineDefinition) {\n drawPowerlineChar(ctx, powerlineDefinition, xOffset, yOffset, deviceCellWidth, deviceCellHeight, fontSize, devicePixelRatio);\n return true;\n }\n\n return false;\n}\n\nfunction drawBlockElementChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IBlockVector[],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n for (let i = 0; i < charDefinition.length; i++) {\n const box = charDefinition[i];\n const xEighth = deviceCellWidth / 8;\n const yEighth = deviceCellHeight / 8;\n ctx.fillRect(\n xOffset + box.x * xEighth,\n yOffset + box.y * yEighth,\n box.w * xEighth,\n box.h * yEighth\n );\n }\n}\n\nconst cachedPatterns: Map<PatternDefinition, Map</* fillStyle */string, CanvasPattern>> = new Map();\n\nfunction drawPatternChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: number[][],\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number\n): void {\n let patternSet = cachedPatterns.get(charDefinition);\n if (!patternSet) {\n patternSet = new Map();\n cachedPatterns.set(charDefinition, patternSet);\n }\n const fillStyle = ctx.fillStyle;\n if (typeof fillStyle !== 'string') {\n throw new Error(`Unexpected fillStyle type \"${fillStyle}\"`);\n }\n let pattern = patternSet.get(fillStyle);\n if (!pattern) {\n const width = charDefinition[0].length;\n const height = charDefinition.length;\n const tmpCanvas = ctx.canvas.ownerDocument.createElement('canvas');\n tmpCanvas.width = width;\n tmpCanvas.height = height;\n const tmpCtx = throwIfFalsy(tmpCanvas.getContext('2d'));\n const imageData = new ImageData(width, height);\n\n // Extract rgba from fillStyle\n let r: number;\n let g: number;\n let b: number;\n let a: number;\n if (fillStyle.startsWith('#')) {\n r = parseInt(fillStyle.slice(1, 3), 16);\n g = parseInt(fillStyle.slice(3, 5), 16);\n b = parseInt(fillStyle.slice(5, 7), 16);\n a = fillStyle.length > 7 && parseInt(fillStyle.slice(7, 9), 16) || 1;\n } else if (fillStyle.startsWith('rgba')) {\n ([r, g, b, a] = fillStyle.substring(5, fillStyle.length - 1).split(',').map(e => parseFloat(e)));\n } else {\n throw new Error(`Unexpected fillStyle color format \"${fillStyle}\" when drawing pattern glyph`);\n }\n\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n imageData.data[(y * width + x) * 4 ] = r;\n imageData.data[(y * width + x) * 4 + 1] = g;\n imageData.data[(y * width + x) * 4 + 2] = b;\n imageData.data[(y * width + x) * 4 + 3] = charDefinition[y][x] * (a * 255);\n }\n }\n tmpCtx.putImageData(imageData, 0, 0);\n pattern = throwIfFalsy(ctx.createPattern(tmpCanvas, null));\n patternSet.set(fillStyle, pattern);\n }\n ctx.fillStyle = pattern;\n ctx.fillRect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n}\n\n/**\n * Draws the following box drawing characters by mapping a subset of SVG d attribute instructions to\n * canvas draw calls.\n *\n * Box styles: \u250E\u2530\u2512\u250D\u252F\u2511\u2553\u2565\u2556\u2552\u2564\u2555 \u250F\u2533\u2513\u250C\u2532\u2513\u250C\u252C\u2510\u250F\u2531\u2510\n * \u250C\u2500\u252C\u2500\u2510 \u250F\u2501\u2533\u2501\u2513 \u2554\u2550\u2566\u2550\u2557 \u2520\u2542\u2528\u251D\u253F\u2525\u255F\u256B\u2562\u255E\u256A\u2561 \u2521\u2547\u2529\u251C\u254A\u252B\u2522\u2548\u252A\u2523\u2549\u2524\n * \u2502 \u2502 \u2502 \u2503 \u2503 \u2503 \u2551 \u2551 \u2551 \u2516\u2538\u251A\u2515\u2537\u2519\u2559\u2568\u255C\u2558\u2567\u255B \u2514\u2534\u2518\u2514\u253A\u251B\u2517\u253B\u251B\u2517\u2539\u2518\n * \u251C\u2500\u253C\u2500\u2524 \u2523\u2501\u254B\u2501\u252B \u2560\u2550\u256C\u2550\u2563 \u250F\u2531\u2510\u250C\u2532\u2513\u250C\u252C\u2510\u250C\u252C\u2510 \u250F\u2533\u2513\u250C\u252E\u2513\u250C\u252C\u2510\u250F\u252D\u2510\n * \u2502 \u2502 \u2502 \u2503 \u2503 \u2503 \u2551 \u2551 \u2551 \u2521\u2543\u2524\u251C\u2544\u2529\u251C\u2546\u252A\u2522\u2545\u2524 \u251E\u2540\u2526\u251C\u253E\u252B\u251F\u2541\u2527\u2523\u253D\u2524\n * \u2514\u2500\u2534\u2500\u2518 \u2517\u2501\u253B\u2501\u251B \u255A\u2550\u2569\u2550\u255D \u2514\u2534\u2518\u2514\u2534\u2518\u2514\u253A\u251B\u2517\u2539\u2518 \u2514\u2534\u2518\u2514\u2536\u251B\u2517\u253B\u251B\u2517\u2535\u2518\n *\n * Other:\n * \u256D\u2500\u256E \u2572 \u2571 \u2577\u257B\u254E\u254F\u2506\u2507\u250A\u250B \u257A\u257E\u2574 \u254C\u254C\u254C \u2504\u2504\u2504 \u2508\u2508\u2508\n * \u2502 \u2502 \u2573 \u257D\u257F\u254E\u254F\u2506\u2507\u250A\u250B \u2576\u257C\u2578 \u254D\u254D\u254D \u2505\u2505\u2505 \u2509\u2509\u2509\n * \u2570\u2500\u256F \u2571 \u2572 \u2579\u2575\u254E\u254F\u2506\u2507\u250A\u250B\n *\n * All box drawing characters:\n * \u2500 \u2501 \u2502 \u2503 \u2504 \u2505 \u2506 \u2507 \u2508 \u2509 \u250A \u250B \u250C \u250D \u250E \u250F\n * \u2510 \u2511 \u2512 \u2513 \u2514 \u2515 \u2516 \u2517 \u2518 \u2519 \u251A \u251B \u251C \u251D \u251E \u251F\n * \u2520 \u2521 \u2522 \u2523 \u2524 \u2525 \u2526 \u2527 \u2528 \u2529 \u252A \u252B \u252C \u252D \u252E \u252F\n * \u2530 \u2531 \u2532 \u2533 \u2534 \u2535 \u2536 \u2537 \u2538 \u2539 \u253A \u253B \u253C \u253D \u253E \u253F\n * \u2540 \u2541 \u2542 \u2543 \u2544 \u2545 \u2546 \u2547 \u2548 \u2549 \u254A \u254B \u254C \u254D \u254E \u254F\n * \u2550 \u2551 \u2552 \u2553 \u2554 \u2555 \u2556 \u2557 \u2558 \u2559 \u255A \u255B \u255C \u255D \u255E \u255F\n * \u2560 \u2561 \u2562 \u2563 \u2564 \u2565 \u2566 \u2567 \u2568 \u2569 \u256A \u256B \u256C \u256D \u256E \u256F\n * \u2570 \u2571 \u2572 \u2573 \u2574 \u2575 \u2576 \u2577 \u2578 \u2579 \u257A \u257B \u257C \u257D \u257E \u257F\n *\n * ---\n *\n * Box drawing alignment tests: \u2588\n * \u2589\n * \u2554\u2550\u2550\u2566\u2550\u2550\u2557 \u250C\u2500\u2500\u252C\u2500\u2500\u2510 \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u256D\u2500\u2500\u252C\u2500\u2500\u256E \u250F\u2501\u2501\u2533\u2501\u2501\u2513 \u250E\u2512\u250F\u2511 \u2577 \u257B \u250F\u252F\u2513 \u250C\u2530\u2510 \u258A \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n * \u2551\u250C\u2500\u2568\u2500\u2510\u2551 \u2502\u2554\u2550\u2567\u2550\u2557\u2502 \u2502\u2552\u2550\u256A\u2550\u2555\u2502 \u2502\u2553\u2500\u2541\u2500\u2556\u2502 \u2503\u250C\u2500\u2542\u2500\u2510\u2503 \u2517\u2543\u2544\u2519 \u2576\u253C\u2574\u257A\u254B\u2578\u2520\u253C\u2528 \u251D\u254B\u2525 \u258B \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n * \u2551\u2502\u2572 \u2571\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257F \u2502\u2503 \u250D\u2545\u2546\u2513 \u2575 \u2579 \u2517\u2537\u251B \u2514\u2538\u2518 \u258C \u2571\u2572\u2571\u2572\u2573\u2573\u2573\n * \u2560\u2561 \u2573 \u255E\u2563 \u251C\u2562 \u255F\u2524 \u251C\u253C\u2500\u253C\u2500\u253C\u2524 \u251C\u256B\u2500\u2542\u2500\u256B\u2524 \u2523\u253F\u257E\u253C\u257C\u253F\u252B \u2515\u251B\u2516\u251A \u250C\u2504\u2504\u2510 \u254E \u250F\u2505\u2505\u2513 \u250B \u258D \u2572\u2571\u2572\u2571\u2573\u2573\u2573\n * \u2551\u2502\u2571 \u2572\u2502\u2551 \u2502\u2551 \u2551\u2502 \u2502\u2502 \u2502 \u2502\u2502 \u2502\u2551 \u2503 \u2551\u2502 \u2503\u2502 \u257D \u2502\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258E\n * \u2551\u2514\u2500\u2565\u2500\u2518\u2551 \u2502\u255A\u2550\u2564\u2550\u255D\u2502 \u2502\u2558\u2550\u256A\u2550\u255B\u2502 \u2502\u2559\u2500\u2540\u2500\u255C\u2502 \u2503\u2514\u2500\u2542\u2500\u2518\u2503 \u2591\u2591\u2592\u2592\u2593\u2593\u2588\u2588 \u250A \u2506 \u254E \u254F \u2507 \u250B \u258F\n * \u255A\u2550\u2550\u2569\u2550\u2550\u255D \u2514\u2500\u2500\u2534\u2500\u2500\u2518 \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2570\u2500\u2500\u2534\u2500\u2500\u256F \u2517\u2501\u2501\u253B\u2501\u2501\u251B \u2514\u254C\u254C\u2518 \u254E \u2517\u254D\u254D\u251B \u250B \u2581\u2582\u2583\u2584\u2585\u2586\u2587\u2588\n *\n * Source: https://www.w3.org/2001/06/utf-8-test/UTF-8-demo.html\n */\nfunction drawBoxDrawingChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: { [fontWeight: number]: string | ((xp: number, yp: number) => string) },\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n devicePixelRatio: number\n): void {\n ctx.strokeStyle = ctx.fillStyle;\n for (const [fontWeight, instructions] of Object.entries(charDefinition)) {\n ctx.beginPath();\n ctx.lineWidth = devicePixelRatio * Number.parseInt(fontWeight);\n let actualInstructions: string;\n if (typeof instructions === 'function') {\n const xp = .15;\n const yp = .15 / deviceCellHeight * deviceCellWidth;\n actualInstructions = instructions(xp, yp);\n } else {\n actualInstructions = instructions;\n }\n for (const instruction of actualInstructions.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(args, deviceCellWidth, deviceCellHeight, xOffset, yOffset, true, devicePixelRatio));\n }\n ctx.stroke();\n ctx.closePath();\n }\n}\n\nfunction drawPowerlineChar(\n ctx: CanvasRenderingContext2D,\n charDefinition: IVectorShape,\n xOffset: number,\n yOffset: number,\n deviceCellWidth: number,\n deviceCellHeight: number,\n fontSize: number,\n devicePixelRatio: number\n): void {\n // Clip the cell to make sure drawing doesn't occur beyond bounds\n const clipRegion = new Path2D();\n clipRegion.rect(xOffset, yOffset, deviceCellWidth, deviceCellHeight);\n ctx.clip(clipRegion);\n\n ctx.beginPath();\n // Scale the stroke with DPR and font size\n const cssLineWidth = fontSize / 12;\n ctx.lineWidth = devicePixelRatio * cssLineWidth;\n for (const instruction of charDefinition.d.split(' ')) {\n const type = instruction[0];\n const f = svgToCanvasInstructionMap[type];\n if (!f) {\n console.error(`Could not find drawing instructions for \"${type}\"`);\n continue;\n }\n const args: string[] = instruction.substring(1).split(',');\n if (!args[0] || !args[1]) {\n continue;\n }\n f(ctx, translateArgs(\n args,\n deviceCellWidth,\n deviceCellHeight,\n xOffset,\n yOffset,\n false,\n devicePixelRatio,\n (charDefinition.leftPadding ?? 0) * (cssLineWidth / 2),\n (charDefinition.rightPadding ?? 0) * (cssLineWidth / 2)\n ));\n }\n if (charDefinition.type === VectorType.STROKE) {\n ctx.strokeStyle = ctx.fillStyle;\n ctx.stroke();\n } else {\n ctx.fill();\n }\n ctx.closePath();\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n\nconst svgToCanvasInstructionMap: { [index: string]: any } = {\n 'C': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.bezierCurveTo(args[0], args[1], args[2], args[3], args[4], args[5]),\n 'L': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.lineTo(args[0], args[1]),\n 'M': (ctx: CanvasRenderingContext2D, args: number[]) => ctx.moveTo(args[0], args[1])\n};\n\nfunction translateArgs(args: string[], cellWidth: number, cellHeight: number, xOffset: number, yOffset: number, doClamp: boolean, devicePixelRatio: number, leftPadding: number = 0, rightPadding: number = 0): number[] {\n const result = args.map(e => parseFloat(e) || parseInt(e));\n\n if (result.length < 2) {\n throw new Error('Too few arguments for instruction');\n }\n\n for (let x = 0; x < result.length; x += 2) {\n // Translate from 0-1 to 0-cellWidth\n result[x] *= cellWidth - (leftPadding * devicePixelRatio) - (rightPadding * devicePixelRatio);\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (doClamp && result[x] !== 0) {\n result[x] = clamp(Math.round(result[x] + 0.5) - 0.5, cellWidth, 0);\n }\n // Apply the cell's offset (ie. x*cellWidth)\n result[x] += xOffset + (leftPadding * devicePixelRatio);\n }\n\n for (let y = 1; y < result.length; y += 2) {\n // Translate from 0-1 to 0-cellHeight\n result[y] *= cellHeight;\n // Ensure coordinate doesn't escape cell bounds and round to the nearest 0.5 to ensure a crisp\n // line at 100% devicePixelRatio\n if (doClamp && result[y] !== 0) {\n result[y] = clamp(Math.round(result[y] + 0.5) - 0.5, cellHeight, 0);\n }\n // Apply the cell's offset (ie. x*cellHeight)\n result[y] += yOffset;\n }\n\n return result;\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nexport class TwoKeyMap<TFirst extends string | number, TSecond extends string | number, TValue> {\n private _data: { [bg: string | number]: { [fg: string | number]: TValue | undefined } | undefined } = {};\n\n public set(first: TFirst, second: TSecond, value: TValue): void {\n if (!this._data[first]) {\n this._data[first] = {};\n }\n this._data[first as string | number]![second] = value;\n }\n\n public get(first: TFirst, second: TSecond): TValue | undefined {\n return this._data[first as string | number] ? this._data[first as string | number]![second] : undefined;\n }\n\n public clear(): void {\n this._data = {};\n }\n}\n\nexport class FourKeyMap<TFirst extends string | number, TSecond extends string | number, TThird extends string | number, TFourth extends string | number, TValue> {\n private _data: TwoKeyMap<TFirst, TSecond, TwoKeyMap<TThird, TFourth, TValue>> = new TwoKeyMap();\n\n public set(first: TFirst, second: TSecond, third: TThird, fourth: TFourth, value: TValue): void {\n if (!this._data.get(first, second)) {\n this._data.set(first, second, new TwoKeyMap());\n }\n this._data.get(first, second)!.set(third, fourth, value);\n }\n\n public get(first: TFirst, second: TSecond, third: TThird, fourth: TFourth): TValue | undefined {\n return this._data.get(first, second)?.get(third, fourth);\n }\n\n public clear(): void {\n this._data.clear();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { isNode } from 'common/Platform';\n\ninterface ITaskQueue {\n /**\n * Adds a task to the queue which will run in a future idle callback.\n * To avoid perceivable stalls on the mainthread, tasks with heavy workload\n * should split their work into smaller pieces and return `true` to get\n * called again until the work is done (on falsy return value).\n */\n enqueue(task: () => boolean | void): void;\n\n /**\n * Flushes the queue, running all remaining tasks synchronously.\n */\n flush(): void;\n\n /**\n * Clears any remaining tasks from the queue, these will not be run.\n */\n clear(): void;\n}\n\ninterface ITaskDeadline {\n timeRemaining(): number;\n}\ntype CallbackWithDeadline = (deadline: ITaskDeadline) => void;\n\nabstract class TaskQueue implements ITaskQueue {\n private _tasks: (() => boolean | void)[] = [];\n private _idleCallback?: number;\n private _i = 0;\n\n protected abstract _requestCallback(callback: CallbackWithDeadline): number;\n protected abstract _cancelCallback(identifier: number): void;\n\n public enqueue(task: () => boolean | void): void {\n this._tasks.push(task);\n this._start();\n }\n\n public flush(): void {\n while (this._i < this._tasks.length) {\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n }\n this.clear();\n }\n\n public clear(): void {\n if (this._idleCallback) {\n this._cancelCallback(this._idleCallback);\n this._idleCallback = undefined;\n }\n this._i = 0;\n this._tasks.length = 0;\n }\n\n private _start(): void {\n if (!this._idleCallback) {\n this._idleCallback = this._requestCallback(this._process.bind(this));\n }\n }\n\n private _process(deadline: ITaskDeadline): void {\n this._idleCallback = undefined;\n let taskDuration = 0;\n let longestTask = 0;\n let lastDeadlineRemaining = deadline.timeRemaining();\n let deadlineRemaining = 0;\n while (this._i < this._tasks.length) {\n taskDuration = Date.now();\n if (!this._tasks[this._i]()) {\n this._i++;\n }\n // other than performance.now, Date.now might not be stable (changes on wall clock changes),\n // this is not an issue here as a clock change during a short running task is very unlikely\n // in case it still happened and leads to negative duration, simply assume 1 msec\n taskDuration = Math.max(1, Date.now() - taskDuration);\n longestTask = Math.max(taskDuration, longestTask);\n // Guess the following task will take a similar time to the longest task in this batch, allow\n // additional room to try avoid exceeding the deadline\n deadlineRemaining = deadline.timeRemaining();\n if (longestTask * 1.5 > deadlineRemaining) {\n // Warn when the time exceeding the deadline is over 20ms, if this happens in practice the\n // task should be split into sub-tasks to ensure the UI remains responsive.\n if (lastDeadlineRemaining - taskDuration < -20) {\n console.warn(`task queue exceeded allotted deadline by ${Math.abs(Math.round(lastDeadlineRemaining - taskDuration))}ms`);\n }\n this._start();\n return;\n }\n lastDeadlineRemaining = deadlineRemaining;\n }\n this.clear();\n }\n}\n\n/**\n * A queue of that runs tasks over several tasks via setTimeout, trying to maintain above 60 frames\n * per second. The tasks will run in the order they are enqueued, but they will run some time later,\n * and care should be taken to ensure they're non-urgent and will not introduce race conditions.\n */\nexport class PriorityTaskQueue extends TaskQueue {\n protected _requestCallback(callback: CallbackWithDeadline): number {\n return setTimeout(() => callback(this._createDeadline(16)));\n }\n\n protected _cancelCallback(identifier: number): void {\n clearTimeout(identifier);\n }\n\n private _createDeadline(duration: number): ITaskDeadline {\n const end = Date.now() + duration;\n return {\n timeRemaining: () => Math.max(0, end - Date.now())\n };\n }\n}\n\nclass IdleTaskQueueInternal extends TaskQueue {\n protected _requestCallback(callback: IdleRequestCallback): number {\n return requestIdleCallback(callback);\n }\n\n protected _cancelCallback(identifier: number): void {\n cancelIdleCallback(identifier);\n }\n}\n\n/**\n * A queue of that runs tasks over several idle callbacks, trying to respect the idle callback's\n * deadline given by the environment. The tasks will run in the order they are enqueued, but they\n * will run some time later, and care should be taken to ensure they're non-urgent and will not\n * introduce race conditions.\n *\n * This reverts to a {@link PriorityTaskQueue} if the environment does not support idle callbacks.\n */\n// eslint-disable-next-line @typescript-eslint/naming-convention\nexport const IdleTaskQueue = (!isNode && 'requestIdleCallback' in window) ? IdleTaskQueueInternal : PriorityTaskQueue;\n\n/**\n * An object that tracks a single debounced task that will run on the next idle frame. When called\n * multiple times, only the last set task will run.\n */\nexport class DebouncedIdleTask {\n private _queue: ITaskQueue;\n\n constructor() {\n this._queue = new IdleTaskQueue();\n }\n\n public set(task: () => boolean | void): void {\n this._queue.clear();\n this._queue.enqueue(task);\n }\n\n public flush(): void {\n this._queue.flush();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IAttributeData, IColorRGB, IExtendedAttrs } from 'common/Types';\nimport { Attributes, FgFlags, BgFlags, UnderlineStyle, ExtFlags } from 'common/buffer/Constants';\n\nexport class AttributeData implements IAttributeData {\n public static toColorRGB(value: number): IColorRGB {\n return [\n value >>> Attributes.RED_SHIFT & 255,\n value >>> Attributes.GREEN_SHIFT & 255,\n value & 255\n ];\n }\n\n public static fromColorRGB(value: IColorRGB): number {\n return (value[0] & 255) << Attributes.RED_SHIFT | (value[1] & 255) << Attributes.GREEN_SHIFT | value[2] & 255;\n }\n\n public clone(): IAttributeData {\n const newObj = new AttributeData();\n newObj.fg = this.fg;\n newObj.bg = this.bg;\n newObj.extended = this.extended.clone();\n return newObj;\n }\n\n // data\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n\n // flags\n public isInverse(): number { return this.fg & FgFlags.INVERSE; }\n public isBold(): number { return this.fg & FgFlags.BOLD; }\n public isUnderline(): number {\n if (this.hasExtendedAttrs() && this.extended.underlineStyle !== UnderlineStyle.NONE) {\n return 1;\n }\n return this.fg & FgFlags.UNDERLINE;\n }\n public isBlink(): number { return this.fg & FgFlags.BLINK; }\n public isInvisible(): number { return this.fg & FgFlags.INVISIBLE; }\n public isItalic(): number { return this.bg & BgFlags.ITALIC; }\n public isDim(): number { return this.bg & BgFlags.DIM; }\n public isStrikethrough(): number { return this.fg & FgFlags.STRIKETHROUGH; }\n public isProtected(): number { return this.bg & BgFlags.PROTECTED; }\n public isOverline(): number { return this.bg & BgFlags.OVERLINE; }\n\n // color modes\n public getFgColorMode(): number { return this.fg & Attributes.CM_MASK; }\n public getBgColorMode(): number { return this.bg & Attributes.CM_MASK; }\n public isFgRGB(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isBgRGB(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_RGB; }\n public isFgPalette(): boolean { return (this.fg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.fg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isBgPalette(): boolean { return (this.bg & Attributes.CM_MASK) === Attributes.CM_P16 || (this.bg & Attributes.CM_MASK) === Attributes.CM_P256; }\n public isFgDefault(): boolean { return (this.fg & Attributes.CM_MASK) === 0; }\n public isBgDefault(): boolean { return (this.bg & Attributes.CM_MASK) === 0; }\n public isAttributeDefault(): boolean { return this.fg === 0 && this.bg === 0; }\n\n // colors\n public getFgColor(): number {\n switch (this.fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.fg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.fg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n public getBgColor(): number {\n switch (this.bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.bg & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.bg & Attributes.RGB_MASK;\n default: return -1; // CM_DEFAULT defaults to -1\n }\n }\n\n // extended attrs\n public hasExtendedAttrs(): number {\n return this.bg & BgFlags.HAS_EXTENDED;\n }\n public updateExtended(): void {\n if (this.extended.isEmpty()) {\n this.bg &= ~BgFlags.HAS_EXTENDED;\n } else {\n this.bg |= BgFlags.HAS_EXTENDED;\n }\n }\n public getUnderlineColor(): number {\n if ((this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor) {\n switch (this.extended.underlineColor & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256: return this.extended.underlineColor & Attributes.PCOLOR_MASK;\n case Attributes.CM_RGB: return this.extended.underlineColor & Attributes.RGB_MASK;\n default: return this.getFgColor();\n }\n }\n return this.getFgColor();\n }\n public getUnderlineColorMode(): number {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? this.extended.underlineColor & Attributes.CM_MASK\n : this.getFgColorMode();\n }\n public isUnderlineColorRGB(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_RGB\n : this.isFgRGB();\n }\n public isUnderlineColorPalette(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P16\n || (this.extended.underlineColor & Attributes.CM_MASK) === Attributes.CM_P256\n : this.isFgPalette();\n }\n public isUnderlineColorDefault(): boolean {\n return (this.bg & BgFlags.HAS_EXTENDED) && ~this.extended.underlineColor\n ? (this.extended.underlineColor & Attributes.CM_MASK) === 0\n : this.isFgDefault();\n }\n public getUnderlineStyle(): UnderlineStyle {\n return this.fg & FgFlags.UNDERLINE\n ? (this.bg & BgFlags.HAS_EXTENDED ? this.extended.underlineStyle : UnderlineStyle.SINGLE)\n : UnderlineStyle.NONE;\n }\n public getUnderlineVariantOffset(): number {\n return this.extended.underlineVariantOffset;\n }\n}\n\n\n/**\n * Extended attributes for a cell.\n * Holds information about different underline styles and color.\n */\nexport class ExtendedAttrs implements IExtendedAttrs {\n private _ext: number = 0;\n public get ext(): number {\n if (this._urlId) {\n return (\n (this._ext & ~ExtFlags.UNDERLINE_STYLE) |\n (this.underlineStyle << 26)\n );\n }\n return this._ext;\n }\n public set ext(value: number) { this._ext = value; }\n\n public get underlineStyle(): UnderlineStyle {\n // Always return the URL style if it has one\n if (this._urlId) {\n return UnderlineStyle.DASHED;\n }\n return (this._ext & ExtFlags.UNDERLINE_STYLE) >> 26;\n }\n public set underlineStyle(value: UnderlineStyle) {\n this._ext &= ~ExtFlags.UNDERLINE_STYLE;\n this._ext |= (value << 26) & ExtFlags.UNDERLINE_STYLE;\n }\n\n public get underlineColor(): number {\n return this._ext & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n public set underlineColor(value: number) {\n this._ext &= ~(Attributes.CM_MASK | Attributes.RGB_MASK);\n this._ext |= value & (Attributes.CM_MASK | Attributes.RGB_MASK);\n }\n\n private _urlId: number = 0;\n public get urlId(): number {\n return this._urlId;\n }\n public set urlId(value: number) {\n this._urlId = value;\n }\n\n public get underlineVariantOffset(): number {\n const val = (this._ext & ExtFlags.VARIANT_OFFSET) >> 29;\n if (val < 0) {\n return val ^ 0xFFFFFFF8;\n }\n return val;\n }\n public set underlineVariantOffset(value: number) {\n this._ext &= ~ExtFlags.VARIANT_OFFSET;\n this._ext |= (value << 29) & ExtFlags.VARIANT_OFFSET;\n }\n\n constructor(\n ext: number = 0,\n urlId: number = 0\n ) {\n this._ext = ext;\n this._urlId = urlId;\n }\n\n public clone(): IExtendedAttrs {\n return new ExtendedAttrs(this._ext, this._urlId);\n }\n\n /**\n * Convenient method to indicate whether the object holds no additional information,\n * that needs to be persistant in the buffer.\n */\n public isEmpty(): boolean {\n return this.underlineStyle === UnderlineStyle.NONE && this._urlId === 0;\n }\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport interface ErrorListenerCallback {\n\t(error: any): void;\n}\n\nexport interface ErrorListenerUnbind {\n\t(): void;\n}\n\n// Avoid circular dependency on EventEmitter by implementing a subset of the interface.\nexport class ErrorHandler {\n\tprivate unexpectedErrorHandler: (e: any) => void;\n\tprivate listeners: ErrorListenerCallback[];\n\n\tconstructor() {\n\n\t\tthis.listeners = [];\n\n\t\tthis.unexpectedErrorHandler = function (e: any) {\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (e.stack) {\n\t\t\t\t\tif (ErrorNoTelemetry.isErrorNoTelemetry(e)) {\n\t\t\t\t\t\tthrow new ErrorNoTelemetry(e.message + '\\n\\n' + e.stack);\n\t\t\t\t\t}\n\n\t\t\t\t\tthrow new Error(e.message + '\\n\\n' + e.stack);\n\t\t\t\t}\n\n\t\t\t\tthrow e;\n\t\t\t}, 0);\n\t\t};\n\t}\n\n\taddListener(listener: ErrorListenerCallback): ErrorListenerUnbind {\n\t\tthis.listeners.push(listener);\n\n\t\treturn () => {\n\t\t\tthis._removeListener(listener);\n\t\t};\n\t}\n\n\tprivate emit(e: any): void {\n\t\tthis.listeners.forEach((listener) => {\n\t\t\tlistener(e);\n\t\t});\n\t}\n\n\tprivate _removeListener(listener: ErrorListenerCallback): void {\n\t\tthis.listeners.splice(this.listeners.indexOf(listener), 1);\n\t}\n\n\tsetUnexpectedErrorHandler(newUnexpectedErrorHandler: (e: any) => void): void {\n\t\tthis.unexpectedErrorHandler = newUnexpectedErrorHandler;\n\t}\n\n\tgetUnexpectedErrorHandler(): (e: any) => void {\n\t\treturn this.unexpectedErrorHandler;\n\t}\n\n\tonUnexpectedError(e: any): void {\n\t\tthis.unexpectedErrorHandler(e);\n\t\tthis.emit(e);\n\t}\n\n\t// For external errors, we don't want the listeners to be called\n\tonUnexpectedExternalError(e: any): void {\n\t\tthis.unexpectedErrorHandler(e);\n\t}\n}\n\nexport const errorHandler = new ErrorHandler();\n\n/** @skipMangle */\nexport function setUnexpectedErrorHandler(newUnexpectedErrorHandler: (e: any) => void): void {\n\terrorHandler.setUnexpectedErrorHandler(newUnexpectedErrorHandler);\n}\n\n/**\n * Returns if the error is a SIGPIPE error. SIGPIPE errors should generally be\n * logged at most once, to avoid a loop.\n *\n * @see https://github.com/microsoft/vscode-remote-release/issues/6481\n */\nexport function isSigPipeError(e: unknown): e is Error {\n\tif (!e || typeof e !== 'object') {\n\t\treturn false;\n\t}\n\n\tconst cast = e as Record<string, string | undefined>;\n\treturn cast.code === 'EPIPE' && cast.syscall?.toUpperCase() === 'WRITE';\n}\n\nexport function onUnexpectedError(e: any): undefined {\n\t// ignore errors from cancelled promises\n\tif (!isCancellationError(e)) {\n\t\terrorHandler.onUnexpectedError(e);\n\t}\n\treturn undefined;\n}\n\nexport function onUnexpectedExternalError(e: any): undefined {\n\t// ignore errors from cancelled promises\n\tif (!isCancellationError(e)) {\n\t\terrorHandler.onUnexpectedExternalError(e);\n\t}\n\treturn undefined;\n}\n\nexport interface SerializedError {\n\treadonly $isError: true;\n\treadonly name: string;\n\treadonly message: string;\n\treadonly stack: string;\n\treadonly noTelemetry: boolean;\n}\n\nexport function transformErrorForSerialization(error: Error): SerializedError;\nexport function transformErrorForSerialization(error: any): any;\nexport function transformErrorForSerialization(error: any): any {\n\tif (error instanceof Error) {\n\t\tconst { name, message } = error;\n\t\tconst stack: string = (<any>error).stacktrace || (<any>error).stack;\n\t\treturn {\n\t\t\t$isError: true,\n\t\t\tname,\n\t\t\tmessage,\n\t\t\tstack,\n\t\t\tnoTelemetry: ErrorNoTelemetry.isErrorNoTelemetry(error)\n\t\t};\n\t}\n\n\t// return as is\n\treturn error;\n}\n\nexport function transformErrorFromSerialization(data: SerializedError): Error {\n\tlet error: Error;\n\tif (data.noTelemetry) {\n\t\terror = new ErrorNoTelemetry();\n\t} else {\n\t\terror = new Error();\n\t\terror.name = data.name;\n\t}\n\terror.message = data.message;\n\terror.stack = data.stack;\n\treturn error;\n}\n\n// see https://github.com/v8/v8/wiki/Stack%20Trace%20API#basic-stack-traces\nexport interface V8CallSite {\n\tgetThis(): unknown;\n\tgetTypeName(): string | null;\n\tgetFunction(): Function | undefined;\n\tgetFunctionName(): string | null;\n\tgetMethodName(): string | null;\n\tgetFileName(): string | null;\n\tgetLineNumber(): number | null;\n\tgetColumnNumber(): number | null;\n\tgetEvalOrigin(): string | undefined;\n\tisToplevel(): boolean;\n\tisEval(): boolean;\n\tisNative(): boolean;\n\tisConstructor(): boolean;\n\ttoString(): string;\n}\n\nconst canceledName = 'Canceled';\n\n/**\n * Checks if the given error is a promise in canceled state\n */\nexport function isCancellationError(error: any): boolean {\n\tif (error instanceof CancellationError) {\n\t\treturn true;\n\t}\n\treturn error instanceof Error && error.name === canceledName && error.message === canceledName;\n}\n\n// !!!IMPORTANT!!!\n// Do NOT change this class because it is also used as an API-type.\nexport class CancellationError extends Error {\n\tconstructor() {\n\t\tsuper(canceledName);\n\t\tthis.name = this.message;\n\t}\n}\n\n/**\n * @deprecated use {@link CancellationError `new CancellationError()`} instead\n */\nexport function canceled(): Error {\n\tconst error = new Error(canceledName);\n\terror.name = error.message;\n\treturn error;\n}\n\nexport function illegalArgument(name?: string): Error {\n\tif (name) {\n\t\treturn new Error(`Illegal argument: ${name}`);\n\t} else {\n\t\treturn new Error('Illegal argument');\n\t}\n}\n\nexport function illegalState(name?: string): Error {\n\tif (name) {\n\t\treturn new Error(`Illegal state: ${name}`);\n\t} else {\n\t\treturn new Error('Illegal state');\n\t}\n}\n\nexport class ReadonlyError extends TypeError {\n\tconstructor(name?: string) {\n\t\tsuper(name ? `${name} is read-only and cannot be changed` : 'Cannot change read-only property');\n\t}\n}\n\nexport function getErrorMessage(err: any): string {\n\tif (!err) {\n\t\treturn 'Error';\n\t}\n\n\tif (err.message) {\n\t\treturn err.message;\n\t}\n\n\tif (err.stack) {\n\t\treturn err.stack.split('\\n')[0];\n\t}\n\n\treturn String(err);\n}\n\nexport class NotImplementedError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper('NotImplemented');\n\t\tif (message) {\n\t\t\tthis.message = message;\n\t\t}\n\t}\n}\n\nexport class NotSupportedError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper('NotSupported');\n\t\tif (message) {\n\t\t\tthis.message = message;\n\t\t}\n\t}\n}\n\nexport class ExpectedError extends Error {\n\treadonly isExpected = true;\n}\n\n/**\n * Error that when thrown won't be logged in telemetry as an unhandled error.\n */\nexport class ErrorNoTelemetry extends Error {\n\toverride readonly name: string;\n\n\tconstructor(msg?: string) {\n\t\tsuper(msg);\n\t\tthis.name = 'CodeExpectedError';\n\t}\n\n\tpublic static fromError(err: Error): ErrorNoTelemetry {\n\t\tif (err instanceof ErrorNoTelemetry) {\n\t\t\treturn err;\n\t\t}\n\n\t\tconst result = new ErrorNoTelemetry();\n\t\tresult.message = err.message;\n\t\tresult.stack = err.stack;\n\t\treturn result;\n\t}\n\n\tpublic static isErrorNoTelemetry(err: Error): err is ErrorNoTelemetry {\n\t\treturn err.name === 'CodeExpectedError';\n\t}\n}\n\n/**\n * This error indicates a bug.\n * Do not throw this for invalid user input.\n * Only catch this error to recover gracefully from bugs.\n */\nexport class BugIndicatingError extends Error {\n\tconstructor(message?: string) {\n\t\tsuper(message || 'An unexpected bug occurred.');\n\t\tObject.setPrototypeOf(this, BugIndicatingError.prototype);\n\n\t\t// Because we know for sure only buggy code throws this,\n\t\t// we definitely want to break here and fix the bug.\n\t\t// eslint-disable-next-line no-debugger\n\t\t// debugger;\n\t}\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * Given a function, returns a function that is only calling that function once.\n */\nexport function createSingleCallFunction<T extends Function>(this: unknown, fn: T, fnDidRunCallback?: () => void): T {\n\tconst _this = this;\n\tlet didCall = false;\n\tlet result: unknown;\n\n\treturn function () {\n\t\tif (didCall) {\n\t\t\treturn result;\n\t\t}\n\n\t\tdidCall = true;\n\t\tif (fnDidRunCallback) {\n\t\t\ttry {\n\t\t\t\tresult = fn.apply(_this, arguments);\n\t\t\t} finally {\n\t\t\t\tfnDidRunCallback();\n\t\t\t}\n\t\t} else {\n\t\t\tresult = fn.apply(_this, arguments);\n\t\t}\n\n\t\treturn result;\n\t} as unknown as T;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { Comparator } from './arrays';\n\nexport function findLast<T>(array: readonly T[], predicate: (item: T) => boolean): T | undefined {\n\tconst idx = findLastIdx(array, predicate);\n\tif (idx === -1) {\n\t\treturn undefined;\n\t}\n\treturn array[idx];\n}\n\nexport function findLastIdx<T>(array: readonly T[], predicate: (item: T) => boolean, fromIndex = array.length - 1): number {\n\tfor (let i = fromIndex; i >= 0; i--) {\n\t\tconst element = array[i];\n\n\t\tif (predicate(element)) {\n\t\t\treturn i;\n\t\t}\n\t}\n\n\treturn -1;\n}\n\n/**\n * Finds the last item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`!\n *\n * @returns `undefined` if no item matches, otherwise the last item that matches the predicate.\n */\nexport function findLastMonotonous<T>(array: readonly T[], predicate: (item: T) => boolean): T | undefined {\n\tconst idx = findLastIdxMonotonous(array, predicate);\n\treturn idx === -1 ? undefined : array[idx];\n}\n\n/**\n * Finds the last item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`!\n *\n * @returns `startIdx - 1` if predicate is false for all items, otherwise the index of the last item that matches the predicate.\n */\nexport function findLastIdxMonotonous<T>(array: readonly T[], predicate: (item: T) => boolean, startIdx = 0, endIdxEx = array.length): number {\n\tlet i = startIdx;\n\tlet j = endIdxEx;\n\twhile (i < j) {\n\t\tconst k = Math.floor((i + j) / 2);\n\t\tif (predicate(array[k])) {\n\t\t\ti = k + 1;\n\t\t} else {\n\t\t\tj = k;\n\t\t}\n\t}\n\treturn i - 1;\n}\n\n/**\n * Finds the first item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[false, ..., false, true, ..., true]`!\n *\n * @returns `undefined` if no item matches, otherwise the first item that matches the predicate.\n */\nexport function findFirstMonotonous<T>(array: readonly T[], predicate: (item: T) => boolean): T | undefined {\n\tconst idx = findFirstIdxMonotonousOrArrLen(array, predicate);\n\treturn idx === array.length ? undefined : array[idx];\n}\n\n/**\n * Finds the first item where predicate is true using binary search.\n * `predicate` must be monotonous, i.e. `arr.map(predicate)` must be like `[false, ..., false, true, ..., true]`!\n *\n * @returns `endIdxEx` if predicate is false for all items, otherwise the index of the first item that matches the predicate.\n */\nexport function findFirstIdxMonotonousOrArrLen<T>(array: readonly T[], predicate: (item: T) => boolean, startIdx = 0, endIdxEx = array.length): number {\n\tlet i = startIdx;\n\tlet j = endIdxEx;\n\twhile (i < j) {\n\t\tconst k = Math.floor((i + j) / 2);\n\t\tif (predicate(array[k])) {\n\t\t\tj = k;\n\t\t} else {\n\t\t\ti = k + 1;\n\t\t}\n\t}\n\treturn i;\n}\n\nexport function findFirstIdxMonotonous<T>(array: readonly T[], predicate: (item: T) => boolean, startIdx = 0, endIdxEx = array.length): number {\n\tconst idx = findFirstIdxMonotonousOrArrLen(array, predicate, startIdx, endIdxEx);\n\treturn idx === array.length ? -1 : idx;\n}\n\n/**\n * Use this when\n * * You have a sorted array\n * * You query this array with a monotonous predicate to find the last item that has a certain property.\n * * You query this array multiple times with monotonous predicates that get weaker and weaker.\n */\nexport class MonotonousArray<T> {\n\tpublic static assertInvariants = false;\n\n\tprivate _findLastMonotonousLastIdx = 0;\n\tprivate _prevFindLastPredicate: ((item: T) => boolean) | undefined;\n\n\tconstructor(private readonly _array: readonly T[]) {\n\t}\n\n\t/**\n\t * The predicate must be monotonous, i.e. `arr.map(predicate)` must be like `[true, ..., true, false, ..., false]`!\n\t * For subsequent calls, current predicate must be weaker than (or equal to) the previous predicate, i.e. more entries must be `true`.\n\t */\n\tfindLastMonotonous(predicate: (item: T) => boolean): T | undefined {\n\t\tif (MonotonousArray.assertInvariants) {\n\t\t\tif (this._prevFindLastPredicate) {\n\t\t\t\tfor (const item of this._array) {\n\t\t\t\t\tif (this._prevFindLastPredicate(item) && !predicate(item)) {\n\t\t\t\t\t\tthrow new Error('MonotonousArray: current predicate must be weaker than (or equal to) the previous predicate.');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._prevFindLastPredicate = predicate;\n\t\t}\n\n\t\tconst idx = findLastIdxMonotonous(this._array, predicate, this._findLastMonotonousLastIdx);\n\t\tthis._findLastMonotonousLastIdx = idx + 1;\n\t\treturn idx === -1 ? undefined : this._array[idx];\n\t}\n}\n\n/**\n * Returns the first item that is equal to or greater than every other item.\n*/\nexport function findFirstMax<T>(array: readonly T[], comparator: Comparator<T>): T | undefined {\n\tif (array.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tlet max = array[0];\n\tfor (let i = 1; i < array.length; i++) {\n\t\tconst item = array[i];\n\t\tif (comparator(item, max) > 0) {\n\t\t\tmax = item;\n\t\t}\n\t}\n\treturn max;\n}\n\n/**\n * Returns the last item that is equal to or greater than every other item.\n*/\nexport function findLastMax<T>(array: readonly T[], comparator: Comparator<T>): T | undefined {\n\tif (array.length === 0) {\n\t\treturn undefined;\n\t}\n\n\tlet max = array[0];\n\tfor (let i = 1; i < array.length; i++) {\n\t\tconst item = array[i];\n\t\tif (comparator(item, max) >= 0) {\n\t\t\tmax = item;\n\t\t}\n\t}\n\treturn max;\n}\n\n/**\n * Returns the first item that is equal to or less than every other item.\n*/\nexport function findFirstMin<T>(array: readonly T[], comparator: Comparator<T>): T | undefined {\n\treturn findFirstMax(array, (a, b) => -comparator(a, b));\n}\n\nexport function findMaxIdx<T>(array: readonly T[], comparator: Comparator<T>): number {\n\tif (array.length === 0) {\n\t\treturn -1;\n\t}\n\n\tlet maxIdx = 0;\n\tfor (let i = 1; i < array.length; i++) {\n\t\tconst item = array[i];\n\t\tif (comparator(item, array[maxIdx]) > 0) {\n\t\t\tmaxIdx = i;\n\t\t}\n\t}\n\treturn maxIdx;\n}\n\n/**\n * Returns the first mapped value of the array which is not undefined.\n */\nexport function mapFindFirst<T, R>(items: Iterable<T>, mapFn: (value: T) => R | undefined): R | undefined {\n\tfor (const value of items) {\n\t\tconst mapped = mapFn(value);\n\t\tif (mapped !== undefined) {\n\t\t\treturn mapped;\n\t\t}\n\t}\n\n\treturn undefined;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { CancellationToken } from 'vs/base/common/cancellation';\nimport { CancellationError } from 'vs/base/common/errors';\nimport { ISplice } from 'vs/base/common/sequence';\nimport { findFirstIdxMonotonousOrArrLen } from './arraysFind';\n\n/**\n * Returns the last element of an array.\n * @param array The array.\n * @param n Which element from the end (default is zero).\n */\nexport function tail<T>(array: ArrayLike<T>, n: number = 0): T | undefined {\n\treturn array[array.length - (1 + n)];\n}\n\nexport function tail2<T>(arr: T[]): [T[], T] {\n\tif (arr.length === 0) {\n\t\tthrow new Error('Invalid tail call');\n\t}\n\n\treturn [arr.slice(0, arr.length - 1), arr[arr.length - 1]];\n}\n\nexport function equals<T>(one: ReadonlyArray<T> | undefined, other: ReadonlyArray<T> | undefined, itemEquals: (a: T, b: T) => boolean = (a, b) => a === b): boolean {\n\tif (one === other) {\n\t\treturn true;\n\t}\n\n\tif (!one || !other) {\n\t\treturn false;\n\t}\n\n\tif (one.length !== other.length) {\n\t\treturn false;\n\t}\n\n\tfor (let i = 0, len = one.length; i < len; i++) {\n\t\tif (!itemEquals(one[i], other[i])) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n\n/**\n * Remove the element at `index` by replacing it with the last element. This is faster than `splice`\n * but changes the order of the array\n */\nexport function removeFastWithoutKeepingOrder<T>(array: T[], index: number) {\n\tconst last = array.length - 1;\n\tif (index < last) {\n\t\tarray[index] = array[last];\n\t}\n\tarray.pop();\n}\n\n/**\n * Performs a binary search algorithm over a sorted array.\n *\n * @param array The array being searched.\n * @param key The value we search for.\n * @param comparator A function that takes two array elements and returns zero\n * if they are equal, a negative number if the first element precedes the\n * second one in the sorting order, or a positive number if the second element\n * precedes the first one.\n * @return See {@link binarySearch2}\n */\nexport function binarySearch<T>(array: ReadonlyArray<T>, key: T, comparator: (op1: T, op2: T) => number): number {\n\treturn binarySearch2(array.length, i => comparator(array[i], key));\n}\n\n/**\n * Performs a binary search algorithm over a sorted collection. Useful for cases\n * when we need to perform a binary search over something that isn't actually an\n * array, and converting data to an array would defeat the use of binary search\n * in the first place.\n *\n * @param length The collection length.\n * @param compareToKey A function that takes an index of an element in the\n * collection and returns zero if the value at this index is equal to the\n * search key, a negative number if the value precedes the search key in the\n * sorting order, or a positive number if the search key precedes the value.\n * @return A non-negative index of an element, if found. If not found, the\n * result is -(n+1) (or ~n, using bitwise notation), where n is the index\n * where the key should be inserted to maintain the sorting order.\n */\nexport function binarySearch2(length: number, compareToKey: (index: number) => number): number {\n\tlet low = 0,\n\t\thigh = length - 1;\n\n\twhile (low <= high) {\n\t\tconst mid = ((low + high) / 2) | 0;\n\t\tconst comp = compareToKey(mid);\n\t\tif (comp < 0) {\n\t\t\tlow = mid + 1;\n\t\t} else if (comp > 0) {\n\t\t\thigh = mid - 1;\n\t\t} else {\n\t\t\treturn mid;\n\t\t}\n\t}\n\treturn -(low + 1);\n}\n\ntype Compare<T> = (a: T, b: T) => number;\n\n\nexport function quickSelect<T>(nth: number, data: T[], compare: Compare<T>): T {\n\n\tnth = nth | 0;\n\n\tif (nth >= data.length) {\n\t\tthrow new TypeError('invalid index');\n\t}\n\n\tconst pivotValue = data[Math.floor(data.length * Math.random())];\n\tconst lower: T[] = [];\n\tconst higher: T[] = [];\n\tconst pivots: T[] = [];\n\n\tfor (const value of data) {\n\t\tconst val = compare(value, pivotValue);\n\t\tif (val < 0) {\n\t\t\tlower.push(value);\n\t\t} else if (val > 0) {\n\t\t\thigher.push(value);\n\t\t} else {\n\t\t\tpivots.push(value);\n\t\t}\n\t}\n\n\tif (nth < lower.length) {\n\t\treturn quickSelect(nth, lower, compare);\n\t} else if (nth < lower.length + pivots.length) {\n\t\treturn pivots[0];\n\t} else {\n\t\treturn quickSelect(nth - (lower.length + pivots.length), higher, compare);\n\t}\n}\n\nexport function groupBy<T>(data: ReadonlyArray<T>, compare: (a: T, b: T) => number): T[][] {\n\tconst result: T[][] = [];\n\tlet currentGroup: T[] | undefined = undefined;\n\tfor (const element of data.slice(0).sort(compare)) {\n\t\tif (!currentGroup || compare(currentGroup[0], element) !== 0) {\n\t\t\tcurrentGroup = [element];\n\t\t\tresult.push(currentGroup);\n\t\t} else {\n\t\t\tcurrentGroup.push(element);\n\t\t}\n\t}\n\treturn result;\n}\n\n/**\n * Splits the given items into a list of (non-empty) groups.\n * `shouldBeGrouped` is used to decide if two consecutive items should be in the same group.\n * The order of the items is preserved.\n */\nexport function* groupAdjacentBy<T>(items: Iterable<T>, shouldBeGrouped: (item1: T, item2: T) => boolean): Iterable<T[]> {\n\tlet currentGroup: T[] | undefined;\n\tlet last: T | undefined;\n\tfor (const item of items) {\n\t\tif (last !== undefined && shouldBeGrouped(last, item)) {\n\t\t\tcurrentGroup!.push(item);\n\t\t} else {\n\t\t\tif (currentGroup) {\n\t\t\t\tyield currentGroup;\n\t\t\t}\n\t\t\tcurrentGroup = [item];\n\t\t}\n\t\tlast = item;\n\t}\n\tif (currentGroup) {\n\t\tyield currentGroup;\n\t}\n}\n\nexport function forEachAdjacent<T>(arr: T[], f: (item1: T | undefined, item2: T | undefined) => void): void {\n\tfor (let i = 0; i <= arr.length; i++) {\n\t\tf(i === 0 ? undefined : arr[i - 1], i === arr.length ? undefined : arr[i]);\n\t}\n}\n\nexport function forEachWithNeighbors<T>(arr: T[], f: (before: T | undefined, element: T, after: T | undefined) => void): void {\n\tfor (let i = 0; i < arr.length; i++) {\n\t\tf(i === 0 ? undefined : arr[i - 1], arr[i], i + 1 === arr.length ? undefined : arr[i + 1]);\n\t}\n}\n\ninterface IMutableSplice<T> extends ISplice<T> {\n\treadonly toInsert: T[];\n\tdeleteCount: number;\n}\n\n/**\n * Diffs two *sorted* arrays and computes the splices which apply the diff.\n */\nexport function sortedDiff<T>(before: ReadonlyArray<T>, after: ReadonlyArray<T>, compare: (a: T, b: T) => number): ISplice<T>[] {\n\tconst result: IMutableSplice<T>[] = [];\n\n\tfunction pushSplice(start: number, deleteCount: number, toInsert: T[]): void {\n\t\tif (deleteCount === 0 && toInsert.length === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst latest = result[result.length - 1];\n\n\t\tif (latest && latest.start + latest.deleteCount === start) {\n\t\t\tlatest.deleteCount += deleteCount;\n\t\t\tlatest.toInsert.push(...toInsert);\n\t\t} else {\n\t\t\tresult.push({ start, deleteCount, toInsert });\n\t\t}\n\t}\n\n\tlet beforeIdx = 0;\n\tlet afterIdx = 0;\n\n\twhile (true) {\n\t\tif (beforeIdx === before.length) {\n\t\t\tpushSplice(beforeIdx, 0, after.slice(afterIdx));\n\t\t\tbreak;\n\t\t}\n\t\tif (afterIdx === after.length) {\n\t\t\tpushSplice(beforeIdx, before.length - beforeIdx, []);\n\t\t\tbreak;\n\t\t}\n\n\t\tconst beforeElement = before[beforeIdx];\n\t\tconst afterElement = after[afterIdx];\n\t\tconst n = compare(beforeElement, afterElement);\n\t\tif (n === 0) {\n\t\t\t// equal\n\t\t\tbeforeIdx += 1;\n\t\t\tafterIdx += 1;\n\t\t} else if (n < 0) {\n\t\t\t// beforeElement is smaller -> before element removed\n\t\t\tpushSplice(beforeIdx, 1, []);\n\t\t\tbeforeIdx += 1;\n\t\t} else if (n > 0) {\n\t\t\t// beforeElement is greater -> after element added\n\t\t\tpushSplice(beforeIdx, 0, [afterElement]);\n\t\t\tafterIdx += 1;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n/**\n * Takes two *sorted* arrays and computes their delta (removed, added elements).\n * Finishes in `Math.min(before.length, after.length)` steps.\n */\nexport function delta<T>(before: ReadonlyArray<T>, after: ReadonlyArray<T>, compare: (a: T, b: T) => number): { removed: T[]; added: T[] } {\n\tconst splices = sortedDiff(before, after, compare);\n\tconst removed: T[] = [];\n\tconst added: T[] = [];\n\n\tfor (const splice of splices) {\n\t\tremoved.push(...before.slice(splice.start, splice.start + splice.deleteCount));\n\t\tadded.push(...splice.toInsert);\n\t}\n\n\treturn { removed, added };\n}\n\n/**\n * Returns the top N elements from the array.\n *\n * Faster than sorting the entire array when the array is a lot larger than N.\n *\n * @param array The unsorted array.\n * @param compare A sort function for the elements.\n * @param n The number of elements to return.\n * @return The first n elements from array when sorted with compare.\n */\nexport function top<T>(array: ReadonlyArray<T>, compare: (a: T, b: T) => number, n: number): T[] {\n\tif (n === 0) {\n\t\treturn [];\n\t}\n\tconst result = array.slice(0, n).sort(compare);\n\ttopStep(array, compare, result, n, array.length);\n\treturn result;\n}\n\n/**\n * Asynchronous variant of `top()` allowing for splitting up work in batches between which the event loop can run.\n *\n * Returns the top N elements from the array.\n *\n * Faster than sorting the entire array when the array is a lot larger than N.\n *\n * @param array The unsorted array.\n * @param compare A sort function for the elements.\n * @param n The number of elements to return.\n * @param batch The number of elements to examine before yielding to the event loop.\n * @return The first n elements from array when sorted with compare.\n */\nexport function topAsync<T>(array: T[], compare: (a: T, b: T) => number, n: number, batch: number, token?: CancellationToken): Promise<T[]> {\n\tif (n === 0) {\n\t\treturn Promise.resolve([]);\n\t}\n\n\treturn new Promise((resolve, reject) => {\n\t\t(async () => {\n\t\t\tconst o = array.length;\n\t\t\tconst result = array.slice(0, n).sort(compare);\n\t\t\tfor (let i = n, m = Math.min(n + batch, o); i < o; i = m, m = Math.min(m + batch, o)) {\n\t\t\t\tif (i > n) {\n\t\t\t\t\tawait new Promise(resolve => setTimeout(resolve)); // any other delay function would starve I/O\n\t\t\t\t}\n\t\t\t\tif (token && token.isCancellationRequested) {\n\t\t\t\t\tthrow new CancellationError();\n\t\t\t\t}\n\t\t\t\ttopStep(array, compare, result, i, m);\n\t\t\t}\n\t\t\treturn result;\n\t\t})()\n\t\t\t.then(resolve, reject);\n\t});\n}\n\nfunction topStep<T>(array: ReadonlyArray<T>, compare: (a: T, b: T) => number, result: T[], i: number, m: number): void {\n\tfor (const n = result.length; i < m; i++) {\n\t\tconst element = array[i];\n\t\tif (compare(element, result[n - 1]) < 0) {\n\t\t\tresult.pop();\n\t\t\tconst j = findFirstIdxMonotonousOrArrLen(result, e => compare(element, e) < 0);\n\t\t\tresult.splice(j, 0, element);\n\t\t}\n\t}\n}\n\n/**\n * @returns New array with all falsy values removed. The original array IS NOT modified.\n */\nexport function coalesce<T>(array: ReadonlyArray<T | undefined | null>): T[] {\n\treturn array.filter((e): e is T => !!e);\n}\n\n/**\n * Remove all falsy values from `array`. The original array IS modified.\n */\nexport function coalesceInPlace<T>(array: Array<T | undefined | null>): asserts array is Array<T> {\n\tlet to = 0;\n\tfor (let i = 0; i < array.length; i++) {\n\t\tif (!!array[i]) {\n\t\t\tarray[to] = array[i];\n\t\t\tto += 1;\n\t\t}\n\t}\n\tarray.length = to;\n}\n\n/**\n * @deprecated Use `Array.copyWithin` instead\n */\nexport function move(array: any[], from: number, to: number): void {\n\tarray.splice(to, 0, array.splice(from, 1)[0]);\n}\n\n/**\n * @returns false if the provided object is an array and not empty.\n */\nexport function isFalsyOrEmpty(obj: any): boolean {\n\treturn !Array.isArray(obj) || obj.length === 0;\n}\n\n/**\n * @returns True if the provided object is an array and has at least one element.\n */\nexport function isNonEmptyArray<T>(obj: T[] | undefined | null): obj is T[];\nexport function isNonEmptyArray<T>(obj: readonly T[] | undefined | null): obj is readonly T[];\nexport function isNonEmptyArray<T>(obj: T[] | readonly T[] | undefined | null): obj is T[] | readonly T[] {\n\treturn Array.isArray(obj) && obj.length > 0;\n}\n\n/**\n * Removes duplicates from the given array. The optional keyFn allows to specify\n * how elements are checked for equality by returning an alternate value for each.\n */\nexport function distinct<T>(array: ReadonlyArray<T>, keyFn: (value: T) => any = value => value): T[] {\n\tconst seen = new Set<any>();\n\n\treturn array.filter(element => {\n\t\tconst key = keyFn!(element);\n\t\tif (seen.has(key)) {\n\t\t\treturn false;\n\t\t}\n\t\tseen.add(key);\n\t\treturn true;\n\t});\n}\n\nexport function uniqueFilter<T, R>(keyFn: (t: T) => R): (t: T) => boolean {\n\tconst seen = new Set<R>();\n\n\treturn element => {\n\t\tconst key = keyFn(element);\n\n\t\tif (seen.has(key)) {\n\t\t\treturn false;\n\t\t}\n\n\t\tseen.add(key);\n\t\treturn true;\n\t};\n}\n\nexport function firstOrDefault<T, NotFound = T>(array: ReadonlyArray<T>, notFoundValue: NotFound): T | NotFound;\nexport function firstOrDefault<T>(array: ReadonlyArray<T>): T | undefined;\nexport function firstOrDefault<T, NotFound = T>(array: ReadonlyArray<T>, notFoundValue?: NotFound): T | NotFound | undefined {\n\treturn array.length > 0 ? array[0] : notFoundValue;\n}\n\nexport function lastOrDefault<T, NotFound = T>(array: ReadonlyArray<T>, notFoundValue: NotFound): T | NotFound;\nexport function lastOrDefault<T>(array: ReadonlyArray<T>): T | undefined;\nexport function lastOrDefault<T, NotFound = T>(array: ReadonlyArray<T>, notFoundValue?: NotFound): T | NotFound | undefined {\n\treturn array.length > 0 ? array[array.length - 1] : notFoundValue;\n}\n\nexport function commonPrefixLength<T>(one: ReadonlyArray<T>, other: ReadonlyArray<T>, equals: (a: T, b: T) => boolean = (a, b) => a === b): number {\n\tlet result = 0;\n\n\tfor (let i = 0, len = Math.min(one.length, other.length); i < len && equals(one[i], other[i]); i++) {\n\t\tresult++;\n\t}\n\n\treturn result;\n}\n\nexport function range(to: number): number[];\nexport function range(from: number, to: number): number[];\nexport function range(arg: number, to?: number): number[] {\n\tlet from = typeof to === 'number' ? arg : 0;\n\n\tif (typeof to === 'number') {\n\t\tfrom = arg;\n\t} else {\n\t\tfrom = 0;\n\t\tto = arg;\n\t}\n\n\tconst result: number[] = [];\n\n\tif (from <= to) {\n\t\tfor (let i = from; i < to; i++) {\n\t\t\tresult.push(i);\n\t\t}\n\t} else {\n\t\tfor (let i = from; i > to; i--) {\n\t\t\tresult.push(i);\n\t\t}\n\t}\n\n\treturn result;\n}\n\nexport function index<T>(array: ReadonlyArray<T>, indexer: (t: T) => string): { [key: string]: T };\nexport function index<T, R>(array: ReadonlyArray<T>, indexer: (t: T) => string, mapper: (t: T) => R): { [key: string]: R };\nexport function index<T, R>(array: ReadonlyArray<T>, indexer: (t: T) => string, mapper?: (t: T) => R): { [key: string]: R } {\n\treturn array.reduce((r, t) => {\n\t\tr[indexer(t)] = mapper ? mapper(t) : t;\n\t\treturn r;\n\t}, Object.create(null));\n}\n\n/**\n * Inserts an element into an array. Returns a function which, when\n * called, will remove that element from the array.\n *\n * @deprecated In almost all cases, use a `Set<T>` instead.\n */\nexport function insert<T>(array: T[], element: T): () => void {\n\tarray.push(element);\n\n\treturn () => remove(array, element);\n}\n\n/**\n * Removes an element from an array if it can be found.\n *\n * @deprecated In almost all cases, use a `Set<T>` instead.\n */\nexport function remove<T>(array: T[], element: T): T | undefined {\n\tconst index = array.indexOf(element);\n\tif (index > -1) {\n\t\tarray.splice(index, 1);\n\n\t\treturn element;\n\t}\n\n\treturn undefined;\n}\n\n/**\n * Insert `insertArr` inside `target` at `insertIndex`.\n * Please don't touch unless you understand https://jsperf.com/inserting-an-array-within-an-array\n */\nexport function arrayInsert<T>(target: T[], insertIndex: number, insertArr: T[]): T[] {\n\tconst before = target.slice(0, insertIndex);\n\tconst after = target.slice(insertIndex);\n\treturn before.concat(insertArr, after);\n}\n\n/**\n * Uses Fisher-Yates shuffle to shuffle the given array\n */\nexport function shuffle<T>(array: T[], _seed?: number): void {\n\tlet rand: () => number;\n\n\tif (typeof _seed === 'number') {\n\t\tlet seed = _seed;\n\t\t// Seeded random number generator in JS. Modified from:\n\t\t// https://stackoverflow.com/questions/521295/seeding-the-random-number-generator-in-javascript\n\t\trand = () => {\n\t\t\tconst x = Math.sin(seed++) * 179426549; // throw away most significant digits and reduce any potential bias\n\t\t\treturn x - Math.floor(x);\n\t\t};\n\t} else {\n\t\trand = Math.random;\n\t}\n\n\tfor (let i = array.length - 1; i > 0; i -= 1) {\n\t\tconst j = Math.floor(rand() * (i + 1));\n\t\tconst temp = array[i];\n\t\tarray[i] = array[j];\n\t\tarray[j] = temp;\n\t}\n}\n\n/**\n * Pushes an element to the start of the array, if found.\n */\nexport function pushToStart<T>(arr: T[], value: T): void {\n\tconst index = arr.indexOf(value);\n\n\tif (index > -1) {\n\t\tarr.splice(index, 1);\n\t\tarr.unshift(value);\n\t}\n}\n\n/**\n * Pushes an element to the end of the array, if found.\n */\nexport function pushToEnd<T>(arr: T[], value: T): void {\n\tconst index = arr.indexOf(value);\n\n\tif (index > -1) {\n\t\tarr.splice(index, 1);\n\t\tarr.push(value);\n\t}\n}\n\nexport function pushMany<T>(arr: T[], items: ReadonlyArray<T>): void {\n\tfor (const item of items) {\n\t\tarr.push(item);\n\t}\n}\n\nexport function mapArrayOrNot<T, U>(items: T | T[], fn: (_: T) => U): U | U[] {\n\treturn Array.isArray(items) ?\n\t\titems.map(fn) :\n\t\tfn(items);\n}\n\nexport function asArray<T>(x: T | T[]): T[];\nexport function asArray<T>(x: T | readonly T[]): readonly T[];\nexport function asArray<T>(x: T | T[]): T[] {\n\treturn Array.isArray(x) ? x : [x];\n}\n\nexport function getRandomElement<T>(arr: T[]): T | undefined {\n\treturn arr[Math.floor(Math.random() * arr.length)];\n}\n\n/**\n * Insert the new items in the array.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start inserting elements.\n * @param newItems The items to be inserted\n */\nexport function insertInto<T>(array: T[], start: number, newItems: T[]): void {\n\tconst startIdx = getActualStartIndex(array, start);\n\tconst originalLength = array.length;\n\tconst newItemsLength = newItems.length;\n\tarray.length = originalLength + newItemsLength;\n\t// Move the items after the start index, start from the end so that we don't overwrite any value.\n\tfor (let i = originalLength - 1; i >= startIdx; i--) {\n\t\tarray[i + newItemsLength] = array[i];\n\t}\n\n\tfor (let i = 0; i < newItemsLength; i++) {\n\t\tarray[i + startIdx] = newItems[i];\n\t}\n}\n\n/**\n * Removes elements from an array and inserts new elements in their place, returning the deleted elements. Alternative to the native Array.splice method, it\n * can only support limited number of items due to the maximum call stack size limit.\n * @param array The original array.\n * @param start The zero-based location in the array from which to start removing elements.\n * @param deleteCount The number of elements to remove.\n * @returns An array containing the elements that were deleted.\n */\nexport function splice<T>(array: T[], start: number, deleteCount: number, newItems: T[]): T[] {\n\tconst index = getActualStartIndex(array, start);\n\tlet result = array.splice(index, deleteCount);\n\tif (result === undefined) {\n\t\t// see https://bugs.webkit.org/show_bug.cgi?id=261140\n\t\tresult = [];\n\t}\n\tinsertInto(array, index, newItems);\n\treturn result;\n}\n\n/**\n * Determine the actual start index (same logic as the native splice() or slice())\n * If greater than the length of the array, start will be set to the length of the array. In this case, no element will be deleted but the method will behave as an adding function, adding as many element as item[n*] provided.\n * If negative, it will begin that many elements from the end of the array. (In this case, the origin -1, meaning -n is the index of the nth last element, and is therefore equivalent to the index of array.length - n.) If array.length + start is less than 0, it will begin from index 0.\n * @param array The target array.\n * @param start The operation index.\n */\nfunction getActualStartIndex<T>(array: T[], start: number): number {\n\treturn start < 0 ? Math.max(start + array.length, 0) : Math.min(start, array.length);\n}\n\n/**\n * When comparing two values,\n * a negative number indicates that the first value is less than the second,\n * a positive number indicates that the first value is greater than the second,\n * and zero indicates that neither is the case.\n*/\nexport type CompareResult = number;\n\nexport namespace CompareResult {\n\texport function isLessThan(result: CompareResult): boolean {\n\t\treturn result < 0;\n\t}\n\n\texport function isLessThanOrEqual(result: CompareResult): boolean {\n\t\treturn result <= 0;\n\t}\n\n\texport function isGreaterThan(result: CompareResult): boolean {\n\t\treturn result > 0;\n\t}\n\n\texport function isNeitherLessOrGreaterThan(result: CompareResult): boolean {\n\t\treturn result === 0;\n\t}\n\n\texport const greaterThan = 1;\n\texport const lessThan = -1;\n\texport const neitherLessOrGreaterThan = 0;\n}\n\n/**\n * A comparator `c` defines a total order `<=` on `T` as following:\n * `c(a, b) <= 0` iff `a` <= `b`.\n * We also have `c(a, b) == 0` iff `c(b, a) == 0`.\n*/\nexport type Comparator<T> = (a: T, b: T) => CompareResult;\n\nexport function compareBy<TItem, TCompareBy>(selector: (item: TItem) => TCompareBy, comparator: Comparator<TCompareBy>): Comparator<TItem> {\n\treturn (a, b) => comparator(selector(a), selector(b));\n}\n\nexport function tieBreakComparators<TItem>(...comparators: Comparator<TItem>[]): Comparator<TItem> {\n\treturn (item1, item2) => {\n\t\tfor (const comparator of comparators) {\n\t\t\tconst result = comparator(item1, item2);\n\t\t\tif (!CompareResult.isNeitherLessOrGreaterThan(result)) {\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}\n\t\treturn CompareResult.neitherLessOrGreaterThan;\n\t};\n}\n\n/**\n * The natural order on numbers.\n*/\nexport const numberComparator: Comparator<number> = (a, b) => a - b;\n\nexport const booleanComparator: Comparator<boolean> = (a, b) => numberComparator(a ? 1 : 0, b ? 1 : 0);\n\nexport function reverseOrder<TItem>(comparator: Comparator<TItem>): Comparator<TItem> {\n\treturn (a, b) => -comparator(a, b);\n}\n\nexport class ArrayQueue<T> {\n\tprivate firstIdx = 0;\n\tprivate lastIdx = this.items.length - 1;\n\n\t/**\n\t * Constructs a queue that is backed by the given array. Runtime is O(1).\n\t*/\n\tconstructor(private readonly items: readonly T[]) { }\n\n\tget length(): number {\n\t\treturn this.lastIdx - this.firstIdx + 1;\n\t}\n\n\t/**\n\t * Consumes elements from the beginning of the queue as long as the predicate returns true.\n\t * If no elements were consumed, `null` is returned. Has a runtime of O(result.length).\n\t*/\n\ttakeWhile(predicate: (value: T) => boolean): T[] | null {\n\t\t// P(k) := k <= this.lastIdx && predicate(this.items[k])\n\t\t// Find s := min { k | k >= this.firstIdx && !P(k) } and return this.data[this.firstIdx...s)\n\n\t\tlet startIdx = this.firstIdx;\n\t\twhile (startIdx < this.items.length && predicate(this.items[startIdx])) {\n\t\t\tstartIdx++;\n\t\t}\n\t\tconst result = startIdx === this.firstIdx ? null : this.items.slice(this.firstIdx, startIdx);\n\t\tthis.firstIdx = startIdx;\n\t\treturn result;\n\t}\n\n\t/**\n\t * Consumes elements from the end of the queue as long as the predicate returns true.\n\t * If no elements were consumed, `null` is returned.\n\t * The result has the same order as the underlying array!\n\t*/\n\ttakeFromEndWhile(predicate: (value: T) => boolean): T[] | null {\n\t\t// P(k) := this.firstIdx >= k && predicate(this.items[k])\n\t\t// Find s := max { k | k <= this.lastIdx && !P(k) } and return this.data(s...this.lastIdx]\n\n\t\tlet endIdx = this.lastIdx;\n\t\twhile (endIdx >= 0 && predicate(this.items[endIdx])) {\n\t\t\tendIdx--;\n\t\t}\n\t\tconst result = endIdx === this.lastIdx ? null : this.items.slice(endIdx + 1, this.lastIdx + 1);\n\t\tthis.lastIdx = endIdx;\n\t\treturn result;\n\t}\n\n\tpeek(): T | undefined {\n\t\tif (this.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.items[this.firstIdx];\n\t}\n\n\tpeekLast(): T | undefined {\n\t\tif (this.length === 0) {\n\t\t\treturn undefined;\n\t\t}\n\t\treturn this.items[this.lastIdx];\n\t}\n\n\tdequeue(): T | undefined {\n\t\tconst result = this.items[this.firstIdx];\n\t\tthis.firstIdx++;\n\t\treturn result;\n\t}\n\n\tremoveLast(): T | undefined {\n\t\tconst result = this.items[this.lastIdx];\n\t\tthis.lastIdx--;\n\t\treturn result;\n\t}\n\n\ttakeCount(count: number): T[] {\n\t\tconst result = this.items.slice(this.firstIdx, this.firstIdx + count);\n\t\tthis.firstIdx += count;\n\t\treturn result;\n\t}\n}\n\n/**\n * This class is faster than an iterator and array for lazy computed data.\n*/\nexport class CallbackIterable<T> {\n\tpublic static readonly empty = new CallbackIterable<never>(_callback => { });\n\n\tconstructor(\n\t\t/**\n\t\t * Calls the callback for every item.\n\t\t * Stops when the callback returns false.\n\t\t*/\n\t\tpublic readonly iterate: (callback: (item: T) => boolean) => void\n\t) {\n\t}\n\n\tforEach(handler: (item: T) => void) {\n\t\tthis.iterate(item => { handler(item); return true; });\n\t}\n\n\ttoArray(): T[] {\n\t\tconst result: T[] = [];\n\t\tthis.iterate(item => { result.push(item); return true; });\n\t\treturn result;\n\t}\n\n\tfilter(predicate: (item: T) => boolean): CallbackIterable<T> {\n\t\treturn new CallbackIterable(cb => this.iterate(item => predicate(item) ? cb(item) : true));\n\t}\n\n\tmap<TResult>(mapFn: (item: T) => TResult): CallbackIterable<TResult> {\n\t\treturn new CallbackIterable<TResult>(cb => this.iterate(item => cb(mapFn(item))));\n\t}\n\n\tsome(predicate: (item: T) => boolean): boolean {\n\t\tlet result = false;\n\t\tthis.iterate(item => { result = predicate(item); return !result; });\n\t\treturn result;\n\t}\n\n\tfindFirst(predicate: (item: T) => boolean): T | undefined {\n\t\tlet result: T | undefined;\n\t\tthis.iterate(item => {\n\t\t\tif (predicate(item)) {\n\t\t\t\tresult = item;\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t\treturn result;\n\t}\n\n\tfindLast(predicate: (item: T) => boolean): T | undefined {\n\t\tlet result: T | undefined;\n\t\tthis.iterate(item => {\n\t\t\tif (predicate(item)) {\n\t\t\t\tresult = item;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t\treturn result;\n\t}\n\n\tfindLastMaxBy(comparator: Comparator<T>): T | undefined {\n\t\tlet result: T | undefined;\n\t\tlet first = true;\n\t\tthis.iterate(item => {\n\t\t\tif (first || CompareResult.isGreaterThan(comparator(item, result!))) {\n\t\t\t\tfirst = false;\n\t\t\t\tresult = item;\n\t\t\t}\n\t\t\treturn true;\n\t\t});\n\t\treturn result;\n\t}\n}\n\n/**\n * Represents a re-arrangement of items in an array.\n */\nexport class Permutation {\n\tconstructor(private readonly _indexMap: readonly number[]) { }\n\n\t/**\n\t * Returns a permutation that sorts the given array according to the given compare function.\n\t */\n\tpublic static createSortPermutation<T>(arr: readonly T[], compareFn: (a: T, b: T) => number): Permutation {\n\t\tconst sortIndices = Array.from(arr.keys()).sort((index1, index2) => compareFn(arr[index1], arr[index2]));\n\t\treturn new Permutation(sortIndices);\n\t}\n\n\t/**\n\t * Returns a new array with the elements of the given array re-arranged according to this permutation.\n\t */\n\tapply<T>(arr: readonly T[]): T[] {\n\t\treturn arr.map((_, index) => arr[this._indexMap[index]]);\n\t}\n\n\t/**\n\t * Returns a new permutation that undoes the re-arrangement of this permutation.\n\t*/\n\tinverse(): Permutation {\n\t\tconst inverseIndexMap = this._indexMap.slice();\n\t\tfor (let i = 0; i < this._indexMap.length; i++) {\n\t\t\tinverseIndexMap[this._indexMap[i]] = i;\n\t\t}\n\t\treturn new Permutation(inverseIndexMap);\n\t}\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n/**\n * An interface for a JavaScript object that\n * acts a dictionary. The keys are strings.\n */\nexport type IStringDictionary<V> = Record<string, V>;\n\n/**\n * An interface for a JavaScript object that\n * acts a dictionary. The keys are numbers.\n */\nexport type INumberDictionary<V> = Record<number, V>;\n\n/**\n * Groups the collection into a dictionary based on the provided\n * group function.\n */\nexport function groupBy<K extends string | number | symbol, V>(data: V[], groupFn: (element: V) => K): Record<K, V[]> {\n\tconst result: Record<K, V[]> = Object.create(null);\n\tfor (const element of data) {\n\t\tconst key = groupFn(element);\n\t\tlet target = result[key];\n\t\tif (!target) {\n\t\t\ttarget = result[key] = [];\n\t\t}\n\t\ttarget.push(element);\n\t}\n\treturn result;\n}\n\nexport function diffSets<T>(before: Set<T>, after: Set<T>): { removed: T[]; added: T[] } {\n\tconst removed: T[] = [];\n\tconst added: T[] = [];\n\tfor (const element of before) {\n\t\tif (!after.has(element)) {\n\t\t\tremoved.push(element);\n\t\t}\n\t}\n\tfor (const element of after) {\n\t\tif (!before.has(element)) {\n\t\t\tadded.push(element);\n\t\t}\n\t}\n\treturn { removed, added };\n}\n\nexport function diffMaps<K, V>(before: Map<K, V>, after: Map<K, V>): { removed: V[]; added: V[] } {\n\tconst removed: V[] = [];\n\tconst added: V[] = [];\n\tfor (const [index, value] of before) {\n\t\tif (!after.has(index)) {\n\t\t\tremoved.push(value);\n\t\t}\n\t}\n\tfor (const [index, value] of after) {\n\t\tif (!before.has(index)) {\n\t\t\tadded.push(value);\n\t\t}\n\t}\n\treturn { removed, added };\n}\n\n/**\n * Computes the intersection of two sets.\n *\n * @param setA - The first set.\n * @param setB - The second iterable.\n * @returns A new set containing the elements that are in both `setA` and `setB`.\n */\nexport function intersection<T>(setA: Set<T>, setB: Iterable<T>): Set<T> {\n\tconst result = new Set<T>();\n\tfor (const elem of setB) {\n\t\tif (setA.has(elem)) {\n\t\t\tresult.add(elem);\n\t\t}\n\t}\n\treturn result;\n}\n\nexport class SetWithKey<T> implements Set<T> {\n\tprivate _map = new Map<any, T>();\n\n\tconstructor(values: T[], private toKey: (t: T) => any) {\n\t\tfor (const value of values) {\n\t\t\tthis.add(value);\n\t\t}\n\t}\n\n\tget size(): number {\n\t\treturn this._map.size;\n\t}\n\n\tadd(value: T): this {\n\t\tconst key = this.toKey(value);\n\t\tthis._map.set(key, value);\n\t\treturn this;\n\t}\n\n\tdelete(value: T): boolean {\n\t\treturn this._map.delete(this.toKey(value));\n\t}\n\n\thas(value: T): boolean {\n\t\treturn this._map.has(this.toKey(value));\n\t}\n\n\t*entries(): IterableIterator<[T, T]> {\n\t\tfor (const entry of this._map.values()) {\n\t\t\tyield [entry, entry];\n\t\t}\n\t}\n\n\tkeys(): IterableIterator<T> {\n\t\treturn this.values();\n\t}\n\n\t*values(): IterableIterator<T> {\n\t\tfor (const entry of this._map.values()) {\n\t\t\tyield entry;\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis._map.clear();\n\t}\n\n\tforEach(callbackfn: (value: T, value2: T, set: Set<T>) => void, thisArg?: any): void {\n\t\tthis._map.forEach(entry => callbackfn.call(thisArg, entry, entry, this));\n\t}\n\n\t[Symbol.iterator](): IterableIterator<T> {\n\t\treturn this.values();\n\t}\n\n\t[Symbol.toStringTag]: string = 'SetWithKey';\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport function getOrSet<K, V>(map: Map<K, V>, key: K, value: V): V {\n\tlet result = map.get(key);\n\tif (result === undefined) {\n\t\tresult = value;\n\t\tmap.set(key, result);\n\t}\n\n\treturn result;\n}\n\nexport function mapToString<K, V>(map: Map<K, V>): string {\n\tconst entries: string[] = [];\n\tmap.forEach((value, key) => {\n\t\tentries.push(`${key} => ${value}`);\n\t});\n\n\treturn `Map(${map.size}) {${entries.join(', ')}}`;\n}\n\nexport function setToString<K>(set: Set<K>): string {\n\tconst entries: K[] = [];\n\tset.forEach(value => {\n\t\tentries.push(value);\n\t});\n\n\treturn `Set(${set.size}) {${entries.join(', ')}}`;\n}\n\nexport const enum Touch {\n\tNone = 0,\n\tAsOld = 1,\n\tAsNew = 2\n}\n\nexport class CounterSet<T> {\n\n\tprivate map = new Map<T, number>();\n\n\tadd(value: T): CounterSet<T> {\n\t\tthis.map.set(value, (this.map.get(value) || 0) + 1);\n\t\treturn this;\n\t}\n\n\tdelete(value: T): boolean {\n\t\tlet counter = this.map.get(value) || 0;\n\n\t\tif (counter === 0) {\n\t\t\treturn false;\n\t\t}\n\n\t\tcounter--;\n\n\t\tif (counter === 0) {\n\t\t\tthis.map.delete(value);\n\t\t} else {\n\t\t\tthis.map.set(value, counter);\n\t\t}\n\n\t\treturn true;\n\t}\n\n\thas(value: T): boolean {\n\t\treturn this.map.has(value);\n\t}\n}\n\n/**\n * A map that allows access both by keys and values.\n * **NOTE**: values need to be unique.\n */\nexport class BidirectionalMap<K, V> {\n\n\tprivate readonly _m1 = new Map<K, V>();\n\tprivate readonly _m2 = new Map<V, K>();\n\n\tconstructor(entries?: readonly (readonly [K, V])[]) {\n\t\tif (entries) {\n\t\t\tfor (const [key, value] of entries) {\n\t\t\t\tthis.set(key, value);\n\t\t\t}\n\t\t}\n\t}\n\n\tclear(): void {\n\t\tthis._m1.clear();\n\t\tthis._m2.clear();\n\t}\n\n\tset(key: K, value: V): void {\n\t\tthis._m1.set(key, value);\n\t\tthis._m2.set(value, key);\n\t}\n\n\tget(key: K): V | undefined {\n\t\treturn this._m1.get(key);\n\t}\n\n\tgetKey(value: V): K | undefined {\n\t\treturn this._m2.get(value);\n\t}\n\n\tdelete(key: K): boolean {\n\t\tconst value = this._m1.get(key);\n\t\tif (value === undefined) {\n\t\t\treturn false;\n\t\t}\n\t\tthis._m1.delete(key);\n\t\tthis._m2.delete(value);\n\t\treturn true;\n\t}\n\n\tforEach(callbackfn: (value: V, key: K, map: BidirectionalMap<K, V>) => void, thisArg?: any): void {\n\t\tthis._m1.forEach((value, key) => {\n\t\t\tcallbackfn.call(thisArg, value, key, this);\n\t\t});\n\t}\n\n\tkeys(): IterableIterator<K> {\n\t\treturn this._m1.keys();\n\t}\n\n\tvalues(): IterableIterator<V> {\n\t\treturn this._m1.values();\n\t}\n}\n\nexport class SetMap<K, V> {\n\n\tprivate map = new Map<K, Set<V>>();\n\n\tadd(key: K, value: V): void {\n\t\tlet values = this.map.get(key);\n\n\t\tif (!values) {\n\t\t\tvalues = new Set<V>();\n\t\t\tthis.map.set(key, values);\n\t\t}\n\n\t\tvalues.add(value);\n\t}\n\n\tdelete(key: K, value: V): void {\n\t\tconst values = this.map.get(key);\n\n\t\tif (!values) {\n\t\t\treturn;\n\t\t}\n\n\t\tvalues.delete(value);\n\n\t\tif (values.size === 0) {\n\t\t\tthis.map.delete(key);\n\t\t}\n\t}\n\n\tforEach(key: K, fn: (value: V) => void): void {\n\t\tconst values = this.map.get(key);\n\n\t\tif (!values) {\n\t\t\treturn;\n\t\t}\n\n\t\tvalues.forEach(fn);\n\t}\n\n\tget(key: K): ReadonlySet<V> {\n\t\tconst values = this.map.get(key);\n\t\tif (!values) {\n\t\t\treturn new Set<V>();\n\t\t}\n\t\treturn values;\n\t}\n}\n\nexport function mapsStrictEqualIgnoreOrder(a: Map<unknown, unknown>, b: Map<unknown, unknown>): boolean {\n\tif (a === b) {\n\t\treturn true;\n\t}\n\n\tif (a.size !== b.size) {\n\t\treturn false;\n\t}\n\n\tfor (const [key, value] of a) {\n\t\tif (!b.has(key) || b.get(key) !== value) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\tfor (const [key] of b) {\n\t\tif (!a.has(key)) {\n\t\t\treturn false;\n\t\t}\n\t}\n\n\treturn true;\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nexport namespace Iterable {\n\n\texport function is<T = any>(thing: any): thing is Iterable<T> {\n\t\treturn thing && typeof thing === 'object' && typeof thing[Symbol.iterator] === 'function';\n\t}\n\n\tconst _empty: Iterable<any> = Object.freeze([]);\n\texport function empty<T = any>(): Iterable<T> {\n\t\treturn _empty;\n\t}\n\n\texport function* single<T>(element: T): Iterable<T> {\n\t\tyield element;\n\t}\n\n\texport function wrap<T>(iterableOrElement: Iterable<T> | T): Iterable<T> {\n\t\tif (is(iterableOrElement)) {\n\t\t\treturn iterableOrElement;\n\t\t} else {\n\t\t\treturn single(iterableOrElement);\n\t\t}\n\t}\n\n\texport function from<T>(iterable: Iterable<T> | undefined | null): Iterable<T> {\n\t\treturn iterable || _empty;\n\t}\n\n\texport function* reverse<T>(array: Array<T>): Iterable<T> {\n\t\tfor (let i = array.length - 1; i >= 0; i--) {\n\t\t\tyield array[i];\n\t\t}\n\t}\n\n\texport function isEmpty<T>(iterable: Iterable<T> | undefined | null): boolean {\n\t\treturn !iterable || iterable[Symbol.iterator]().next().done === true;\n\t}\n\n\texport function first<T>(iterable: Iterable<T>): T | undefined {\n\t\treturn iterable[Symbol.iterator]().next().value;\n\t}\n\n\texport function some<T>(iterable: Iterable<T>, predicate: (t: T, i: number) => unknown): boolean {\n\t\tlet i = 0;\n\t\tfor (const element of iterable) {\n\t\t\tif (predicate(element, i++)) {\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n\n\texport function find<T, R extends T>(iterable: Iterable<T>, predicate: (t: T) => t is R): R | undefined;\n\texport function find<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): T | undefined;\n\texport function find<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): T | undefined {\n\t\tfor (const element of iterable) {\n\t\t\tif (predicate(element)) {\n\t\t\t\treturn element;\n\t\t\t}\n\t\t}\n\n\t\treturn undefined;\n\t}\n\n\texport function filter<T, R extends T>(iterable: Iterable<T>, predicate: (t: T) => t is R): Iterable<R>;\n\texport function filter<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): Iterable<T>;\n\texport function* filter<T>(iterable: Iterable<T>, predicate: (t: T) => boolean): Iterable<T> {\n\t\tfor (const element of iterable) {\n\t\t\tif (predicate(element)) {\n\t\t\t\tyield element;\n\t\t\t}\n\t\t}\n\t}\n\n\texport function* map<T, R>(iterable: Iterable<T>, fn: (t: T, index: number) => R): Iterable<R> {\n\t\tlet index = 0;\n\t\tfor (const element of iterable) {\n\t\t\tyield fn(element, index++);\n\t\t}\n\t}\n\n\texport function* flatMap<T, R>(iterable: Iterable<T>, fn: (t: T, index: number) => Iterable<R>): Iterable<R> {\n\t\tlet index = 0;\n\t\tfor (const element of iterable) {\n\t\t\tyield* fn(element, index++);\n\t\t}\n\t}\n\n\texport function* concat<T>(...iterables: Iterable<T>[]): Iterable<T> {\n\t\tfor (const iterable of iterables) {\n\t\t\tyield* iterable;\n\t\t}\n\t}\n\n\texport function reduce<T, R>(iterable: Iterable<T>, reducer: (previousValue: R, currentValue: T) => R, initialValue: R): R {\n\t\tlet value = initialValue;\n\t\tfor (const element of iterable) {\n\t\t\tvalue = reducer(value, element);\n\t\t}\n\t\treturn value;\n\t}\n\n\t/**\n\t * Returns an iterable slice of the array, with the same semantics as `array.slice()`.\n\t */\n\texport function* slice<T>(arr: ReadonlyArray<T>, from: number, to = arr.length): Iterable<T> {\n\t\tif (from < 0) {\n\t\t\tfrom += arr.length;\n\t\t}\n\n\t\tif (to < 0) {\n\t\t\tto += arr.length;\n\t\t} else if (to > arr.length) {\n\t\t\tto = arr.length;\n\t\t}\n\n\t\tfor (; from < to; from++) {\n\t\t\tyield arr[from];\n\t\t}\n\t}\n\n\t/**\n\t * Consumes `atMost` elements from iterable and returns the consumed elements,\n\t * and an iterable for the rest of the elements.\n\t */\n\texport function consume<T>(iterable: Iterable<T>, atMost: number = Number.POSITIVE_INFINITY): [T[], Iterable<T>] {\n\t\tconst consumed: T[] = [];\n\n\t\tif (atMost === 0) {\n\t\t\treturn [consumed, iterable];\n\t\t}\n\n\t\tconst iterator = iterable[Symbol.iterator]();\n\n\t\tfor (let i = 0; i < atMost; i++) {\n\t\t\tconst next = iterator.next();\n\n\t\t\tif (next.done) {\n\t\t\t\treturn [consumed, Iterable.empty()];\n\t\t\t}\n\n\t\t\tconsumed.push(next.value);\n\t\t}\n\n\t\treturn [consumed, { [Symbol.iterator]() { return iterator; } }];\n\t}\n\n\texport async function asyncToArray<T>(iterable: AsyncIterable<T>): Promise<T[]> {\n\t\tconst result: T[] = [];\n\t\tfor await (const item of iterable) {\n\t\t\tresult.push(item);\n\t\t}\n\t\treturn Promise.resolve(result);\n\t}\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { compareBy, numberComparator } from 'vs/base/common/arrays';\nimport { groupBy } from 'vs/base/common/collections';\nimport { SetMap } from './map';\nimport { createSingleCallFunction } from 'vs/base/common/functional';\nimport { Iterable } from 'vs/base/common/iterator';\n\n// #region Disposable Tracking\n\n/**\n * Enables logging of potentially leaked disposables.\n *\n * A disposable is considered leaked if it is not disposed or not registered as the child of\n * another disposable. This tracking is very simple an only works for classes that either\n * extend Disposable or use a DisposableStore. This means there are a lot of false positives.\n */\nconst TRACK_DISPOSABLES = false;\nlet disposableTracker: IDisposableTracker | null = null;\n\nexport interface IDisposableTracker {\n\t/**\n\t * Is called on construction of a disposable.\n\t*/\n\ttrackDisposable(disposable: IDisposable): void;\n\n\t/**\n\t * Is called when a disposable is registered as child of another disposable (e.g. {@link DisposableStore}).\n\t * If parent is `null`, the disposable is removed from its former parent.\n\t*/\n\tsetParent(child: IDisposable, parent: IDisposable | null): void;\n\n\t/**\n\t * Is called after a disposable is disposed.\n\t*/\n\tmarkAsDisposed(disposable: IDisposable): void;\n\n\t/**\n\t * Indicates that the given object is a singleton which does not need to be disposed.\n\t*/\n\tmarkAsSingleton(disposable: IDisposable): void;\n}\n\nexport interface DisposableInfo {\n\tvalue: IDisposable;\n\tsource: string | null;\n\tparent: IDisposable | null;\n\tisSingleton: boolean;\n\tidx: number;\n}\n\nexport class DisposableTracker implements IDisposableTracker {\n\tprivate static idx = 0;\n\n\tprivate readonly livingDisposables = new Map<IDisposable, DisposableInfo>();\n\n\tprivate getDisposableData(d: IDisposable): DisposableInfo {\n\t\tlet val = this.livingDisposables.get(d);\n\t\tif (!val) {\n\t\t\tval = { parent: null, source: null, isSingleton: false, value: d, idx: DisposableTracker.idx++ };\n\t\t\tthis.livingDisposables.set(d, val);\n\t\t}\n\t\treturn val;\n\t}\n\n\ttrackDisposable(d: IDisposable): void {\n\t\tconst data = this.getDisposableData(d);\n\t\tif (!data.source) {\n\t\t\tdata.source =\n\t\t\t\tnew Error().stack!;\n\t\t}\n\t}\n\n\tsetParent(child: IDisposable, parent: IDisposable | null): void {\n\t\tconst data = this.getDisposableData(child);\n\t\tdata.parent = parent;\n\t}\n\n\tmarkAsDisposed(x: IDisposable): void {\n\t\tthis.livingDisposables.delete(x);\n\t}\n\n\tmarkAsSingleton(disposable: IDisposable): void {\n\t\tthis.getDisposableData(disposable).isSingleton = true;\n\t}\n\n\tprivate getRootParent(data: DisposableInfo, cache: Map<DisposableInfo, DisposableInfo>): DisposableInfo {\n\t\tconst cacheValue = cache.get(data);\n\t\tif (cacheValue) {\n\t\t\treturn cacheValue;\n\t\t}\n\n\t\tconst result = data.parent ? this.getRootParent(this.getDisposableData(data.parent), cache) : data;\n\t\tcache.set(data, result);\n\t\treturn result;\n\t}\n\n\tgetTrackedDisposables(): IDisposable[] {\n\t\tconst rootParentCache = new Map<DisposableInfo, DisposableInfo>();\n\n\t\tconst leaking = [...this.livingDisposables.entries()]\n\t\t\t.filter(([, v]) => v.source !== null && !this.getRootParent(v, rootParentCache).isSingleton)\n\t\t\t.flatMap(([k]) => k);\n\n\t\treturn leaking;\n\t}\n\n\tcomputeLeakingDisposables(maxReported = 10, preComputedLeaks?: DisposableInfo[]): { leaks: DisposableInfo[]; details: string } | undefined {\n\t\tlet uncoveredLeakingObjs: DisposableInfo[] | undefined;\n\t\tif (preComputedLeaks) {\n\t\t\tuncoveredLeakingObjs = preComputedLeaks;\n\t\t} else {\n\t\t\tconst rootParentCache = new Map<DisposableInfo, DisposableInfo>();\n\n\t\t\tconst leakingObjects = [...this.livingDisposables.values()]\n\t\t\t\t.filter((info) => info.source !== null && !this.getRootParent(info, rootParentCache).isSingleton);\n\n\t\t\tif (leakingObjects.length === 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst leakingObjsSet = new Set(leakingObjects.map(o => o.value));\n\n\t\t\t// Remove all objects that are a child of other leaking objects. Assumes there are no cycles.\n\t\t\tuncoveredLeakingObjs = leakingObjects.filter(l => {\n\t\t\t\treturn !(l.parent && leakingObjsSet.has(l.parent));\n\t\t\t});\n\n\t\t\tif (uncoveredLeakingObjs.length === 0) {\n\t\t\t\tthrow new Error('There are cyclic diposable chains!');\n\t\t\t}\n\t\t}\n\n\t\tif (!uncoveredLeakingObjs) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tfunction getStackTracePath(leaking: DisposableInfo): string[] {\n\t\t\tfunction removePrefix(array: string[], linesToRemove: (string | RegExp)[]) {\n\t\t\t\twhile (array.length > 0 && linesToRemove.some(regexp => typeof regexp === 'string' ? regexp === array[0] : array[0].match(regexp))) {\n\t\t\t\t\tarray.shift();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst lines = leaking.source!.split('\\n').map(p => p.trim().replace('at ', '')).filter(l => l !== '');\n\t\t\tremovePrefix(lines, ['Error', /^trackDisposable \\(.*\\)$/, /^DisposableTracker.trackDisposable \\(.*\\)$/]);\n\t\t\treturn lines.reverse();\n\t\t}\n\n\t\tconst stackTraceStarts = new SetMap<string, DisposableInfo>();\n\t\tfor (const leaking of uncoveredLeakingObjs) {\n\t\t\tconst stackTracePath = getStackTracePath(leaking);\n\t\t\tfor (let i = 0; i <= stackTracePath.length; i++) {\n\t\t\t\tstackTraceStarts.add(stackTracePath.slice(0, i).join('\\n'), leaking);\n\t\t\t}\n\t\t}\n\n\t\t// Put earlier leaks first\n\t\tuncoveredLeakingObjs.sort(compareBy(l => l.idx, numberComparator));\n\n\t\tlet message = '';\n\n\t\tlet i = 0;\n\t\tfor (const leaking of uncoveredLeakingObjs.slice(0, maxReported)) {\n\t\t\ti++;\n\t\t\tconst stackTracePath = getStackTracePath(leaking);\n\t\t\tconst stackTraceFormattedLines = [];\n\n\t\t\tfor (let i = 0; i < stackTracePath.length; i++) {\n\t\t\t\tlet line = stackTracePath[i];\n\t\t\t\tconst starts = stackTraceStarts.get(stackTracePath.slice(0, i + 1).join('\\n'));\n\t\t\t\tline = `(shared with ${starts.size}/${uncoveredLeakingObjs.length} leaks) at ${line}`;\n\n\t\t\t\tconst prevStarts = stackTraceStarts.get(stackTracePath.slice(0, i).join('\\n'));\n\t\t\t\tconst continuations = groupBy([...prevStarts].map(d => getStackTracePath(d)[i]), v => v);\n\t\t\t\tdelete continuations[stackTracePath[i]];\n\t\t\t\tfor (const [cont, set] of Object.entries(continuations)) {\n\t\t\t\t\tstackTraceFormattedLines.unshift(` - stacktraces of ${set.length} other leaks continue with ${cont}`);\n\t\t\t\t}\n\n\t\t\t\tstackTraceFormattedLines.unshift(line);\n\t\t\t}\n\n\t\t\tmessage += `\\n\\n\\n==================== Leaking disposable ${i}/${uncoveredLeakingObjs.length}: ${leaking.value.constructor.name} ====================\\n${stackTraceFormattedLines.join('\\n')}\\n============================================================\\n\\n`;\n\t\t}\n\n\t\tif (uncoveredLeakingObjs.length > maxReported) {\n\t\t\tmessage += `\\n\\n\\n... and ${uncoveredLeakingObjs.length - maxReported} more leaking disposables\\n\\n`;\n\t\t}\n\n\t\treturn { leaks: uncoveredLeakingObjs, details: message };\n\t}\n}\n\nexport function setDisposableTracker(tracker: IDisposableTracker | null): void {\n\tdisposableTracker = tracker;\n}\n\nif (TRACK_DISPOSABLES) {\n\tconst __is_disposable_tracked__ = '__is_disposable_tracked__';\n\tsetDisposableTracker(new class implements IDisposableTracker {\n\t\ttrackDisposable(x: IDisposable): void {\n\t\t\tconst stack = new Error('Potentially leaked disposable').stack!;\n\t\t\tsetTimeout(() => {\n\t\t\t\tif (!(x as any)[__is_disposable_tracked__]) {\n\t\t\t\t\tconsole.log(stack);\n\t\t\t\t}\n\t\t\t}, 3000);\n\t\t}\n\n\t\tsetParent(child: IDisposable, parent: IDisposable | null): void {\n\t\t\tif (child && child !== Disposable.None) {\n\t\t\t\ttry {\n\t\t\t\t\t(child as any)[__is_disposable_tracked__] = true;\n\t\t\t\t} catch {\n\t\t\t\t\t// noop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tmarkAsDisposed(disposable: IDisposable): void {\n\t\t\tif (disposable && disposable !== Disposable.None) {\n\t\t\t\ttry {\n\t\t\t\t\t(disposable as any)[__is_disposable_tracked__] = true;\n\t\t\t\t} catch {\n\t\t\t\t\t// noop\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tmarkAsSingleton(disposable: IDisposable): void { }\n\t});\n}\n\nexport function trackDisposable<T extends IDisposable>(x: T): T {\n\tdisposableTracker?.trackDisposable(x);\n\treturn x;\n}\n\nexport function markAsDisposed(disposable: IDisposable): void {\n\tdisposableTracker?.markAsDisposed(disposable);\n}\n\nfunction setParentOfDisposable(child: IDisposable, parent: IDisposable | null): void {\n\tdisposableTracker?.setParent(child, parent);\n}\n\nfunction setParentOfDisposables(children: IDisposable[], parent: IDisposable | null): void {\n\tif (!disposableTracker) {\n\t\treturn;\n\t}\n\tfor (const child of children) {\n\t\tdisposableTracker.setParent(child, parent);\n\t}\n}\n\n/**\n * Indicates that the given object is a singleton which does not need to be disposed.\n*/\nexport function markAsSingleton<T extends IDisposable>(singleton: T): T {\n\tdisposableTracker?.markAsSingleton(singleton);\n\treturn singleton;\n}\n\n// #endregion\n\n/**\n * An object that performs a cleanup operation when `.dispose()` is called.\n *\n * Some examples of how disposables are used:\n *\n * - An event listener that removes itself when `.dispose()` is called.\n * - A resource such as a file system watcher that cleans up the resource when `.dispose()` is called.\n * - The return value from registering a provider. When `.dispose()` is called, the provider is unregistered.\n */\nexport interface IDisposable {\n\tdispose(): void;\n}\n\n/**\n * Check if `thing` is {@link IDisposable disposable}.\n */\nexport function isDisposable<E extends any>(thing: E): thing is E & IDisposable {\n\treturn typeof thing === 'object' && thing !== null && typeof (<IDisposable><any>thing).dispose === 'function' && (<IDisposable><any>thing).dispose.length === 0;\n}\n\n/**\n * Disposes of the value(s) passed in.\n */\nexport function dispose<T extends IDisposable>(disposable: T): T;\nexport function dispose<T extends IDisposable>(disposable: T | undefined): T | undefined;\nexport function dispose<T extends IDisposable, A extends Iterable<T> = Iterable<T>>(disposables: A): A;\nexport function dispose<T extends IDisposable>(disposables: Array<T>): Array<T>;\nexport function dispose<T extends IDisposable>(disposables: ReadonlyArray<T>): ReadonlyArray<T>;\nexport function dispose<T extends IDisposable>(arg: T | Iterable<T> | undefined): any {\n\tif (Iterable.is(arg)) {\n\t\tconst errors: any[] = [];\n\n\t\tfor (const d of arg) {\n\t\t\tif (d) {\n\t\t\t\ttry {\n\t\t\t\t\td.dispose();\n\t\t\t\t} catch (e) {\n\t\t\t\t\terrors.push(e);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (errors.length === 1) {\n\t\t\tthrow errors[0];\n\t\t} else if (errors.length > 1) {\n\t\t\tthrow new AggregateError(errors, 'Encountered errors while disposing of store');\n\t\t}\n\n\t\treturn Array.isArray(arg) ? [] : arg;\n\t} else if (arg) {\n\t\targ.dispose();\n\t\treturn arg;\n\t}\n}\n\nexport function disposeIfDisposable<T extends IDisposable | object>(disposables: Array<T>): Array<T> {\n\tfor (const d of disposables) {\n\t\tif (isDisposable(d)) {\n\t\t\td.dispose();\n\t\t}\n\t}\n\treturn [];\n}\n\n/**\n * Combine multiple disposable values into a single {@link IDisposable}.\n */\nexport function combinedDisposable(...disposables: IDisposable[]): IDisposable {\n\tconst parent = toDisposable(() => dispose(disposables));\n\tsetParentOfDisposables(disposables, parent);\n\treturn parent;\n}\n\n/**\n * Turn a function that implements dispose into an {@link IDisposable}.\n *\n * @param fn Clean up function, guaranteed to be called only **once**.\n */\nexport function toDisposable(fn: () => void): IDisposable {\n\tconst self = trackDisposable({\n\t\tdispose: createSingleCallFunction(() => {\n\t\t\tmarkAsDisposed(self);\n\t\t\tfn();\n\t\t})\n\t});\n\treturn self;\n}\n\n/**\n * Manages a collection of disposable values.\n *\n * This is the preferred way to manage multiple disposables. A `DisposableStore` is safer to work with than an\n * `IDisposable[]` as it considers edge cases, such as registering the same value multiple times or adding an item to a\n * store that has already been disposed of.\n */\nexport class DisposableStore implements IDisposable {\n\n\tstatic DISABLE_DISPOSED_WARNING = false;\n\n\tprivate readonly _toDispose = new Set<IDisposable>();\n\tprivate _isDisposed = false;\n\n\tconstructor() {\n\t\ttrackDisposable(this);\n\t}\n\n\t/**\n\t * Dispose of all registered disposables and mark this object as disposed.\n\t *\n\t * Any future disposables added to this object will be disposed of on `add`.\n\t */\n\tpublic dispose(): void {\n\t\tif (this._isDisposed) {\n\t\t\treturn;\n\t\t}\n\n\t\tmarkAsDisposed(this);\n\t\tthis._isDisposed = true;\n\t\tthis.clear();\n\t}\n\n\t/**\n\t * @return `true` if this object has been disposed of.\n\t */\n\tpublic get isDisposed(): boolean {\n\t\treturn this._isDisposed;\n\t}\n\n\t/**\n\t * Dispose of all registered disposables but do not mark this object as disposed.\n\t */\n\tpublic clear(): void {\n\t\tif (this._toDispose.size === 0) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tdispose(this._toDispose);\n\t\t} finally {\n\t\t\tthis._toDispose.clear();\n\t\t}\n\t}\n\n\t/**\n\t * Add a new {@link IDisposable disposable} to the collection.\n\t */\n\tpublic add<T extends IDisposable>(o: T): T {\n\t\tif (!o) {\n\t\t\treturn o;\n\t\t}\n\t\tif ((o as unknown as DisposableStore) === this) {\n\t\t\tthrow new Error('Cannot register a disposable on itself!');\n\t\t}\n\n\t\tsetParentOfDisposable(o, this);\n\t\tif (this._isDisposed) {\n\t\t\tif (!DisposableStore.DISABLE_DISPOSED_WARNING) {\n\t\t\t\tconsole.warn(new Error('Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!').stack);\n\t\t\t}\n\t\t} else {\n\t\t\tthis._toDispose.add(o);\n\t\t}\n\n\t\treturn o;\n\t}\n\n\t/**\n\t * Deletes a disposable from store and disposes of it. This will not throw or warn and proceed to dispose the\n\t * disposable even when the disposable is not part in the store.\n\t */\n\tpublic delete<T extends IDisposable>(o: T): void {\n\t\tif (!o) {\n\t\t\treturn;\n\t\t}\n\t\tif ((o as unknown as DisposableStore) === this) {\n\t\t\tthrow new Error('Cannot dispose a disposable on itself!');\n\t\t}\n\t\tthis._toDispose.delete(o);\n\t\to.dispose();\n\t}\n\n\t/**\n\t * Deletes the value from the store, but does not dispose it.\n\t */\n\tpublic deleteAndLeak<T extends IDisposable>(o: T): void {\n\t\tif (!o) {\n\t\t\treturn;\n\t\t}\n\t\tif (this._toDispose.has(o)) {\n\t\t\tthis._toDispose.delete(o);\n\t\t\tsetParentOfDisposable(o, null);\n\t\t}\n\t}\n}\n\n/**\n * Abstract base class for a {@link IDisposable disposable} object.\n *\n * Subclasses can {@linkcode _register} disposables that will be automatically cleaned up when this object is disposed of.\n */\nexport abstract class Disposable implements IDisposable {\n\n\t/**\n\t * A disposable that does nothing when it is disposed of.\n\t *\n\t * TODO: This should not be a static property.\n\t */\n\tstatic readonly None = Object.freeze<IDisposable>({ dispose() { } });\n\n\tprotected readonly _store = new DisposableStore();\n\n\tconstructor() {\n\t\ttrackDisposable(this);\n\t\tsetParentOfDisposable(this._store, this);\n\t}\n\n\tpublic dispose(): void {\n\t\tmarkAsDisposed(this);\n\n\t\tthis._store.dispose();\n\t}\n\n\t/**\n\t * Adds `o` to the collection of disposables managed by this object.\n\t */\n\tprotected _register<T extends IDisposable>(o: T): T {\n\t\tif ((o as unknown as Disposable) === this) {\n\t\t\tthrow new Error('Cannot register a disposable on itself!');\n\t\t}\n\t\treturn this._store.add(o);\n\t}\n}\n\n/**\n * Manages the lifecycle of a disposable value that may be changed.\n *\n * This ensures that when the disposable value is changed, the previously held disposable is disposed of. You can\n * also register a `MutableDisposable` on a `Disposable` to ensure it is automatically cleaned up.\n */\nexport class MutableDisposable<T extends IDisposable> implements IDisposable {\n\tprivate _value?: T;\n\tprivate _isDisposed = false;\n\n\tconstructor() {\n\t\ttrackDisposable(this);\n\t}\n\n\tget value(): T | undefined {\n\t\treturn this._isDisposed ? undefined : this._value;\n\t}\n\n\tset value(value: T | undefined) {\n\t\tif (this._isDisposed || value === this._value) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._value?.dispose();\n\t\tif (value) {\n\t\t\tsetParentOfDisposable(value, this);\n\t\t}\n\t\tthis._value = value;\n\t}\n\n\t/**\n\t * Resets the stored value and disposed of the previously stored value.\n\t */\n\tclear(): void {\n\t\tthis.value = undefined;\n\t}\n\n\tdispose(): void {\n\t\tthis._isDisposed = true;\n\t\tmarkAsDisposed(this);\n\t\tthis._value?.dispose();\n\t\tthis._value = undefined;\n\t}\n\n\t/**\n\t * Clears the value, but does not dispose it.\n\t * The old value is returned.\n\t*/\n\tclearAndLeak(): T | undefined {\n\t\tconst oldValue = this._value;\n\t\tthis._value = undefined;\n\t\tif (oldValue) {\n\t\t\tsetParentOfDisposable(oldValue, null);\n\t\t}\n\t\treturn oldValue;\n\t}\n}\n\n/**\n * Manages the lifecycle of a disposable value that may be changed like {@link MutableDisposable}, but the value must\n * exist and cannot be undefined.\n */\nexport class MandatoryMutableDisposable<T extends IDisposable> implements IDisposable {\n\tprivate readonly _disposable = new MutableDisposable<T>();\n\tprivate _isDisposed = false;\n\n\tconstructor(initialValue: T) {\n\t\tthis._disposable.value = initialValue;\n\t}\n\n\tget value(): T {\n\t\treturn this._disposable.value!;\n\t}\n\n\tset value(value: T) {\n\t\tif (this._isDisposed || value === this._disposable.value) {\n\t\t\treturn;\n\t\t}\n\t\tthis._disposable.value = value;\n\t}\n\n\tdispose() {\n\t\tthis._isDisposed = true;\n\t\tthis._disposable.dispose();\n\t}\n}\n\nexport class RefCountedDisposable {\n\n\tprivate _counter: number = 1;\n\n\tconstructor(\n\t\tprivate readonly _disposable: IDisposable,\n\t) { }\n\n\tacquire() {\n\t\tthis._counter++;\n\t\treturn this;\n\t}\n\n\trelease() {\n\t\tif (--this._counter === 0) {\n\t\t\tthis._disposable.dispose();\n\t\t}\n\t\treturn this;\n\t}\n}\n\n/**\n * A safe disposable can be `unset` so that a leaked reference (listener)\n * can be cut-off.\n */\nexport class SafeDisposable implements IDisposable {\n\n\tdispose: () => void = () => { };\n\tunset: () => void = () => { };\n\tisset: () => boolean = () => false;\n\n\tconstructor() {\n\t\ttrackDisposable(this);\n\t}\n\n\tset(fn: Function) {\n\t\tlet callback: Function | undefined = fn;\n\t\tthis.unset = () => callback = undefined;\n\t\tthis.isset = () => callback !== undefined;\n\t\tthis.dispose = () => {\n\t\t\tif (callback) {\n\t\t\t\tcallback();\n\t\t\t\tcallback = undefined;\n\t\t\t\tmarkAsDisposed(this);\n\t\t\t}\n\t\t};\n\t\treturn this;\n\t}\n}\n\nexport interface IReference<T> extends IDisposable {\n\treadonly object: T;\n}\n\nexport abstract class ReferenceCollection<T> {\n\n\tprivate readonly references: Map<string, { readonly object: T; counter: number }> = new Map();\n\n\tacquire(key: string, ...args: any[]): IReference<T> {\n\t\tlet reference = this.references.get(key);\n\n\t\tif (!reference) {\n\t\t\treference = { counter: 0, object: this.createReferencedObject(key, ...args) };\n\t\t\tthis.references.set(key, reference);\n\t\t}\n\n\t\tconst { object } = reference;\n\t\tconst dispose = createSingleCallFunction(() => {\n\t\t\tif (--reference.counter === 0) {\n\t\t\t\tthis.destroyReferencedObject(key, reference.object);\n\t\t\t\tthis.references.delete(key);\n\t\t\t}\n\t\t});\n\n\t\treference.counter++;\n\n\t\treturn { object, dispose };\n\t}\n\n\tprotected abstract createReferencedObject(key: string, ...args: any[]): T;\n\tprotected abstract destroyReferencedObject(key: string, object: T): void;\n}\n\n/**\n * Unwraps a reference collection of promised values. Makes sure\n * references are disposed whenever promises get rejected.\n */\nexport class AsyncReferenceCollection<T> {\n\n\tconstructor(private referenceCollection: ReferenceCollection<Promise<T>>) { }\n\n\tasync acquire(key: string, ...args: any[]): Promise<IReference<T>> {\n\t\tconst ref = this.referenceCollection.acquire(key, ...args);\n\n\t\ttry {\n\t\t\tconst object = await ref.object;\n\n\t\t\treturn {\n\t\t\t\tobject,\n\t\t\t\tdispose: () => ref.dispose()\n\t\t\t};\n\t\t} catch (error) {\n\t\t\tref.dispose();\n\t\t\tthrow error;\n\t\t}\n\t}\n}\n\nexport class ImmortalReference<T> implements IReference<T> {\n\tconstructor(public object: T) { }\n\tdispose(): void { /* noop */ }\n}\n\nexport function disposeOnReturn(fn: (store: DisposableStore) => void): void {\n\tconst store = new DisposableStore();\n\ttry {\n\t\tfn(store);\n\t} finally {\n\t\tstore.dispose();\n\t}\n}\n\n/**\n * A map the manages the lifecycle of the values that it stores.\n */\nexport class DisposableMap<K, V extends IDisposable = IDisposable> implements IDisposable {\n\n\tprivate readonly _store = new Map<K, V>();\n\tprivate _isDisposed = false;\n\n\tconstructor() {\n\t\ttrackDisposable(this);\n\t}\n\n\t/**\n\t * Disposes of all stored values and mark this object as disposed.\n\t *\n\t * Trying to use this object after it has been disposed of is an error.\n\t */\n\tdispose(): void {\n\t\tmarkAsDisposed(this);\n\t\tthis._isDisposed = true;\n\t\tthis.clearAndDisposeAll();\n\t}\n\n\t/**\n\t * Disposes of all stored values and clear the map, but DO NOT mark this object as disposed.\n\t */\n\tclearAndDisposeAll(): void {\n\t\tif (!this._store.size) {\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tdispose(this._store.values());\n\t\t} finally {\n\t\t\tthis._store.clear();\n\t\t}\n\t}\n\n\thas(key: K): boolean {\n\t\treturn this._store.has(key);\n\t}\n\n\tget size(): number {\n\t\treturn this._store.size;\n\t}\n\n\tget(key: K): V | undefined {\n\t\treturn this._store.get(key);\n\t}\n\n\tset(key: K, value: V, skipDisposeOnOverwrite = false): void {\n\t\tif (this._isDisposed) {\n\t\t\tconsole.warn(new Error('Trying to add a disposable to a DisposableMap that has already been disposed of. The added object will be leaked!').stack);\n\t\t}\n\n\t\tif (!skipDisposeOnOverwrite) {\n\t\t\tthis._store.get(key)?.dispose();\n\t\t}\n\n\t\tthis._store.set(key, value);\n\t}\n\n\t/**\n\t * Delete the value stored for `key` from this map and also dispose of it.\n\t */\n\tdeleteAndDispose(key: K): void {\n\t\tthis._store.get(key)?.dispose();\n\t\tthis._store.delete(key);\n\t}\n\n\t/**\n\t * Delete the value stored for `key` from this map but return it. The caller is\n\t * responsible for disposing of the value.\n\t */\n\tdeleteAndLeak(key: K): V | undefined {\n\t\tconst value = this._store.get(key);\n\t\tthis._store.delete(key);\n\t\treturn value;\n\t}\n\n\tkeys(): IterableIterator<K> {\n\t\treturn this._store.keys();\n\t}\n\n\tvalues(): IterableIterator<V> {\n\t\treturn this._store.values();\n\t}\n\n\t[Symbol.iterator](): IterableIterator<[K, V]> {\n\t\treturn this._store[Symbol.iterator]();\n\t}\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nclass Node<E> {\n\n\tstatic readonly Undefined = new Node<any>(undefined);\n\n\telement: E;\n\tnext: Node<E>;\n\tprev: Node<E>;\n\n\tconstructor(element: E) {\n\t\tthis.element = element;\n\t\tthis.next = Node.Undefined;\n\t\tthis.prev = Node.Undefined;\n\t}\n}\n\nexport class LinkedList<E> {\n\n\tprivate _first: Node<E> = Node.Undefined;\n\tprivate _last: Node<E> = Node.Undefined;\n\tprivate _size: number = 0;\n\n\tget size(): number {\n\t\treturn this._size;\n\t}\n\n\tisEmpty(): boolean {\n\t\treturn this._first === Node.Undefined;\n\t}\n\n\tclear(): void {\n\t\tlet node = this._first;\n\t\twhile (node !== Node.Undefined) {\n\t\t\tconst next = node.next;\n\t\t\tnode.prev = Node.Undefined;\n\t\t\tnode.next = Node.Undefined;\n\t\t\tnode = next;\n\t\t}\n\n\t\tthis._first = Node.Undefined;\n\t\tthis._last = Node.Undefined;\n\t\tthis._size = 0;\n\t}\n\n\tunshift(element: E): () => void {\n\t\treturn this._insert(element, false);\n\t}\n\n\tpush(element: E): () => void {\n\t\treturn this._insert(element, true);\n\t}\n\n\tprivate _insert(element: E, atTheEnd: boolean): () => void {\n\t\tconst newNode = new Node(element);\n\t\tif (this._first === Node.Undefined) {\n\t\t\tthis._first = newNode;\n\t\t\tthis._last = newNode;\n\n\t\t} else if (atTheEnd) {\n\t\t\t// push\n\t\t\tconst oldLast = this._last;\n\t\t\tthis._last = newNode;\n\t\t\tnewNode.prev = oldLast;\n\t\t\toldLast.next = newNode;\n\n\t\t} else {\n\t\t\t// unshift\n\t\t\tconst oldFirst = this._first;\n\t\t\tthis._first = newNode;\n\t\t\tnewNode.next = oldFirst;\n\t\t\toldFirst.prev = newNode;\n\t\t}\n\t\tthis._size += 1;\n\n\t\tlet didRemove = false;\n\t\treturn () => {\n\t\t\tif (!didRemove) {\n\t\t\t\tdidRemove = true;\n\t\t\t\tthis._remove(newNode);\n\t\t\t}\n\t\t};\n\t}\n\n\tshift(): E | undefined {\n\t\tif (this._first === Node.Undefined) {\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tconst res = this._first.element;\n\t\t\tthis._remove(this._first);\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tpop(): E | undefined {\n\t\tif (this._last === Node.Undefined) {\n\t\t\treturn undefined;\n\t\t} else {\n\t\t\tconst res = this._last.element;\n\t\t\tthis._remove(this._last);\n\t\t\treturn res;\n\t\t}\n\t}\n\n\tprivate _remove(node: Node<E>): void {\n\t\tif (node.prev !== Node.Undefined && node.next !== Node.Undefined) {\n\t\t\t// middle\n\t\t\tconst anchor = node.prev;\n\t\t\tanchor.next = node.next;\n\t\t\tnode.next.prev = anchor;\n\n\t\t} else if (node.prev === Node.Undefined && node.next === Node.Undefined) {\n\t\t\t// only node\n\t\t\tthis._first = Node.Undefined;\n\t\t\tthis._last = Node.Undefined;\n\n\t\t} else if (node.next === Node.Undefined) {\n\t\t\t// last\n\t\t\tthis._last = this._last.prev!;\n\t\t\tthis._last.next = Node.Undefined;\n\n\t\t} else if (node.prev === Node.Undefined) {\n\t\t\t// first\n\t\t\tthis._first = this._first.next!;\n\t\t\tthis._first.prev = Node.Undefined;\n\t\t}\n\n\t\t// done\n\t\tthis._size -= 1;\n\t}\n\n\t*[Symbol.iterator](): Iterator<E> {\n\t\tlet node = this._first;\n\t\twhile (node !== Node.Undefined) {\n\t\t\tyield node.element;\n\t\t\tnode = node.next;\n\t\t}\n\t}\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\n// fake definition so that the valid layers check won't trip on this\ndeclare const globalThis: { performance?: { now(): number } };\n\nconst hasPerformanceNow = (globalThis.performance && typeof globalThis.performance.now === 'function');\n\nexport class StopWatch {\n\n\tprivate _startTime: number;\n\tprivate _stopTime: number;\n\n\tprivate readonly _now: () => number;\n\n\tpublic static create(highResolution?: boolean): StopWatch {\n\t\treturn new StopWatch(highResolution);\n\t}\n\n\tconstructor(highResolution?: boolean) {\n\t\tthis._now = hasPerformanceNow && highResolution === false ? Date.now : globalThis.performance!.now.bind(globalThis.performance);\n\t\tthis._startTime = this._now();\n\t\tthis._stopTime = -1;\n\t}\n\n\tpublic stop(): void {\n\t\tthis._stopTime = this._now();\n\t}\n\n\tpublic reset(): void {\n\t\tthis._startTime = this._now();\n\t\tthis._stopTime = -1;\n\t}\n\n\tpublic elapsed(): number {\n\t\tif (this._stopTime !== -1) {\n\t\t\treturn this._stopTime - this._startTime;\n\t\t}\n\t\treturn this._now() - this._startTime;\n\t}\n}\n", "/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { CancellationToken } from 'vs/base/common/cancellation';\nimport { onUnexpectedError } from 'vs/base/common/errors';\nimport { createSingleCallFunction } from 'vs/base/common/functional';\nimport { combinedDisposable, Disposable, DisposableMap, DisposableStore, IDisposable, toDisposable } from 'vs/base/common/lifecycle';\nimport { LinkedList } from 'vs/base/common/linkedList';\nimport { IObservable, IObserver } from 'vs/base/common/observable';\nimport { StopWatch } from 'vs/base/common/stopwatch';\nimport { MicrotaskDelay } from 'vs/base/common/symbols';\n\n\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever a listener is GC'ed without having been disposed. This is a LEAK.\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableListenerGCedWarning = false\n\t// || Boolean(\"TRUE\") // causes a linter warning so that it cannot be pushed\n\t;\n\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever an emitter with listeners is disposed. That is a sign of code smell.\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableDisposeWithListenerWarning = false\n\t// || Boolean(\"TRUE\") // causes a linter warning so that it cannot be pushed\n\t;\n\n\n// -----------------------------------------------------------------------------------------------------------------------\n// Uncomment the next line to print warnings whenever a snapshotted event is used repeatedly without cleanup.\n// See https://github.com/microsoft/vscode/issues/142851\n// -----------------------------------------------------------------------------------------------------------------------\nconst _enableSnapshotPotentialLeakWarning = false\n\t// || Boolean(\"TRUE\") // causes a linter warning so that it cannot be pushed\n\t;\n\n/**\n * An event with zero or one parameters that can be subscribed to. The event is a function itself.\n */\nexport interface Event<T> {\n\t(listener: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore): IDisposable;\n}\n\nexport namespace Event {\n\texport const None: Event<any> = () => Disposable.None;\n\n\tfunction _addLeakageTraceLogic(options: EmitterOptions) {\n\t\tif (_enableSnapshotPotentialLeakWarning) {\n\t\t\tconst { onDidAddListener: origListenerDidAdd } = options;\n\t\t\tconst stack = Stacktrace.create();\n\t\t\tlet count = 0;\n\t\t\toptions.onDidAddListener = () => {\n\t\t\t\tif (++count === 2) {\n\t\t\t\t\tconsole.warn('snapshotted emitter LIKELY used public and SHOULD HAVE BEEN created with DisposableStore. snapshotted here');\n\t\t\t\t\tstack.print();\n\t\t\t\t}\n\t\t\t\torigListenerDidAdd?.();\n\t\t\t};\n\t\t}\n\t}\n\n\t/**\n\t * Given an event, returns another event which debounces calls and defers the listeners to a later task via a shared\n\t * `setTimeout`. The event is converted into a signal (`Event<void>`) to avoid additional object creation as a\n\t * result of merging events and to try prevent race conditions that could arise when using related deferred and\n\t * non-deferred events.\n\t *\n\t * This is useful for deferring non-critical work (eg. general UI updates) to ensure it does not block critical work\n\t * (eg. latency of keypress to text rendered).\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The event source for the new event.\n\t * @param disposable A disposable store to add the new EventEmitter to.\n\t */\n\texport function defer(event: Event<unknown>, disposable?: DisposableStore): Event<void> {\n\t\treturn debounce<unknown, void>(event, () => void 0, 0, undefined, true, undefined, disposable);\n\t}\n\n\t/**\n\t * Given an event, returns another event which only fires once.\n\t *\n\t * @param event The event source for the new event.\n\t */\n\texport function once<T>(event: Event<T>): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => {\n\t\t\t// we need this, in case the event fires during the listener call\n\t\t\tlet didFire = false;\n\t\t\tlet result: IDisposable | undefined = undefined;\n\t\t\tresult = event(e => {\n\t\t\t\tif (didFire) {\n\t\t\t\t\treturn;\n\t\t\t\t} else if (result) {\n\t\t\t\t\tresult.dispose();\n\t\t\t\t} else {\n\t\t\t\t\tdidFire = true;\n\t\t\t\t}\n\n\t\t\t\treturn listener.call(thisArgs, e);\n\t\t\t}, null, disposables);\n\n\t\t\tif (didFire) {\n\t\t\t\tresult.dispose();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\t}\n\n\t/**\n\t * Maps an event of one type into an event of another type using a mapping function, similar to how\n\t * `Array.prototype.map` works.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The event source for the new event.\n\t * @param map The mapping function.\n\t * @param disposable A disposable store to add the new EventEmitter to.\n\t */\n\texport function map<I, O>(event: Event<I>, map: (i: I) => O, disposable?: DisposableStore): Event<O> {\n\t\treturn snapshot((listener, thisArgs = null, disposables?) => event(i => listener.call(thisArgs, map(i)), null, disposables), disposable);\n\t}\n\n\t/**\n\t * Wraps an event in another event that performs some function on the event object before firing.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The event source for the new event.\n\t * @param each The function to perform on the event object.\n\t * @param disposable A disposable store to add the new EventEmitter to.\n\t */\n\texport function forEach<I>(event: Event<I>, each: (i: I) => void, disposable?: DisposableStore): Event<I> {\n\t\treturn snapshot((listener, thisArgs = null, disposables?) => event(i => { each(i); listener.call(thisArgs, i); }, null, disposables), disposable);\n\t}\n\n\t/**\n\t * Wraps an event in another event that fires only when some condition is met.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The event source for the new event.\n\t * @param filter The filter function that defines the condition. The event will fire for the object if this function\n\t * returns true.\n\t * @param disposable A disposable store to add the new EventEmitter to.\n\t */\n\texport function filter<T, U>(event: Event<T | U>, filter: (e: T | U) => e is T, disposable?: DisposableStore): Event<T>;\n\texport function filter<T>(event: Event<T>, filter: (e: T) => boolean, disposable?: DisposableStore): Event<T>;\n\texport function filter<T, R>(event: Event<T | R>, filter: (e: T | R) => e is R, disposable?: DisposableStore): Event<R>;\n\texport function filter<T>(event: Event<T>, filter: (e: T) => boolean, disposable?: DisposableStore): Event<T> {\n\t\treturn snapshot((listener, thisArgs = null, disposables?) => event(e => filter(e) && listener.call(thisArgs, e), null, disposables), disposable);\n\t}\n\n\t/**\n\t * Given an event, returns the same event but typed as `Event<void>`.\n\t */\n\texport function signal<T>(event: Event<T>): Event<void> {\n\t\treturn event as Event<any> as Event<void>;\n\t}\n\n\t/**\n\t * Given a collection of events, returns a single event which emits whenever any of the provided events emit.\n\t */\n\texport function any<T>(...events: Event<T>[]): Event<T>;\n\texport function any(...events: Event<any>[]): Event<void>;\n\texport function any<T>(...events: Event<T>[]): Event<T> {\n\t\treturn (listener, thisArgs = null, disposables?) => {\n\t\t\tconst disposable = combinedDisposable(...events.map(event => event(e => listener.call(thisArgs, e))));\n\t\t\treturn addAndReturnDisposable(disposable, disposables);\n\t\t};\n\t}\n\n\t/**\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t */\n\texport function reduce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, initial?: O, disposable?: DisposableStore): Event<O> {\n\t\tlet output: O | undefined = initial;\n\n\t\treturn map<I, O>(event, e => {\n\t\t\toutput = merge(output, e);\n\t\t\treturn output;\n\t\t}, disposable);\n\t}\n\n\tfunction snapshot<T>(event: Event<T>, disposable: DisposableStore | undefined): Event<T> {\n\t\tlet listener: IDisposable | undefined;\n\n\t\tconst options: EmitterOptions | undefined = {\n\t\t\tonWillAddFirstListener() {\n\t\t\t\tlistener = event(emitter.fire, emitter);\n\t\t\t},\n\t\t\tonDidRemoveLastListener() {\n\t\t\t\tlistener?.dispose();\n\t\t\t}\n\t\t};\n\n\t\tif (!disposable) {\n\t\t\t_addLeakageTraceLogic(options);\n\t\t}\n\n\t\tconst emitter = new Emitter<T>(options);\n\n\t\tdisposable?.add(emitter);\n\n\t\treturn emitter.event;\n\t}\n\n\t/**\n\t * Adds the IDisposable to the store if it's set, and returns it. Useful to\n\t * Event function implementation.\n\t */\n\tfunction addAndReturnDisposable<T extends IDisposable>(d: T, store: DisposableStore | IDisposable[] | undefined): T {\n\t\tif (store instanceof Array) {\n\t\t\tstore.push(d);\n\t\t} else if (store) {\n\t\t\tstore.add(d);\n\t\t}\n\t\treturn d;\n\t}\n\n\t/**\n\t * Given an event, creates a new emitter that event that will debounce events based on {@link delay} and give an\n\t * array event object of all events that fired.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The original event to debounce.\n\t * @param merge A function that reduces all events into a single event.\n\t * @param delay The number of milliseconds to debounce.\n\t * @param leading Whether to fire a leading event without debouncing.\n\t * @param flushOnListenerRemove Whether to fire all debounced events when a listener is removed. If this is not\n\t * specified, some events could go missing. Use this if it's important that all events are processed, even if the\n\t * listener gets disposed before the debounced event fires.\n\t * @param leakWarningThreshold See {@link EmitterOptions.leakWarningThreshold}.\n\t * @param disposable A disposable store to register the debounce emitter to.\n\t */\n\texport function debounce<T>(event: Event<T>, merge: (last: T | undefined, event: T) => T, delay?: number | typeof MicrotaskDelay, leading?: boolean, flushOnListenerRemove?: boolean, leakWarningThreshold?: number, disposable?: DisposableStore): Event<T>;\n\texport function debounce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, delay?: number | typeof MicrotaskDelay, leading?: boolean, flushOnListenerRemove?: boolean, leakWarningThreshold?: number, disposable?: DisposableStore): Event<O>;\n\texport function debounce<I, O>(event: Event<I>, merge: (last: O | undefined, event: I) => O, delay: number | typeof MicrotaskDelay = 100, leading = false, flushOnListenerRemove = false, leakWarningThreshold?: number, disposable?: DisposableStore): Event<O> {\n\t\tlet subscription: IDisposable;\n\t\tlet output: O | undefined = undefined;\n\t\tlet handle: any = undefined;\n\t\tlet numDebouncedCalls = 0;\n\t\tlet doFire: (() => void) | undefined;\n\n\t\tconst options: EmitterOptions | undefined = {\n\t\t\tleakWarningThreshold,\n\t\t\tonWillAddFirstListener() {\n\t\t\t\tsubscription = event(cur => {\n\t\t\t\t\tnumDebouncedCalls++;\n\t\t\t\t\toutput = merge(output, cur);\n\n\t\t\t\t\tif (leading && !handle) {\n\t\t\t\t\t\temitter.fire(output);\n\t\t\t\t\t\toutput = undefined;\n\t\t\t\t\t}\n\n\t\t\t\t\tdoFire = () => {\n\t\t\t\t\t\tconst _output = output;\n\t\t\t\t\t\toutput = undefined;\n\t\t\t\t\t\thandle = undefined;\n\t\t\t\t\t\tif (!leading || numDebouncedCalls > 1) {\n\t\t\t\t\t\t\temitter.fire(_output!);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tnumDebouncedCalls = 0;\n\t\t\t\t\t};\n\n\t\t\t\t\tif (typeof delay === 'number') {\n\t\t\t\t\t\tclearTimeout(handle);\n\t\t\t\t\t\thandle = setTimeout(doFire, delay);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tif (handle === undefined) {\n\t\t\t\t\t\t\thandle = 0;\n\t\t\t\t\t\t\tqueueMicrotask(doFire);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t},\n\t\t\tonWillRemoveListener() {\n\t\t\t\tif (flushOnListenerRemove && numDebouncedCalls > 0) {\n\t\t\t\t\tdoFire?.();\n\t\t\t\t}\n\t\t\t},\n\t\t\tonDidRemoveLastListener() {\n\t\t\t\tdoFire = undefined;\n\t\t\t\tsubscription.dispose();\n\t\t\t}\n\t\t};\n\n\t\tif (!disposable) {\n\t\t\t_addLeakageTraceLogic(options);\n\t\t}\n\n\t\tconst emitter = new Emitter<O>(options);\n\n\t\tdisposable?.add(emitter);\n\n\t\treturn emitter.event;\n\t}\n\n\t/**\n\t * Debounces an event, firing after some delay (default=0) with an array of all event original objects.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t */\n\texport function accumulate<T>(event: Event<T>, delay: number = 0, disposable?: DisposableStore): Event<T[]> {\n\t\treturn Event.debounce<T, T[]>(event, (last, e) => {\n\t\t\tif (!last) {\n\t\t\t\treturn [e];\n\t\t\t}\n\t\t\tlast.push(e);\n\t\t\treturn last;\n\t\t}, delay, undefined, true, undefined, disposable);\n\t}\n\n\t/**\n\t * Filters an event such that some condition is _not_ met more than once in a row, effectively ensuring duplicate\n\t * event objects from different sources do not fire the same event object.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The event source for the new event.\n\t * @param equals The equality condition.\n\t * @param disposable A disposable store to add the new EventEmitter to.\n\t *\n\t * @example\n\t * ```\n\t * // Fire only one time when a single window is opened or focused\n\t * Event.latch(Event.any(onDidOpenWindow, onDidFocusWindow))\n\t * ```\n\t */\n\texport function latch<T>(event: Event<T>, equals: (a: T, b: T) => boolean = (a, b) => a === b, disposable?: DisposableStore): Event<T> {\n\t\tlet firstCall = true;\n\t\tlet cache: T;\n\n\t\treturn filter(event, value => {\n\t\t\tconst shouldEmit = firstCall || !equals(value, cache);\n\t\t\tfirstCall = false;\n\t\t\tcache = value;\n\t\t\treturn shouldEmit;\n\t\t}, disposable);\n\t}\n\n\t/**\n\t * Splits an event whose parameter is a union type into 2 separate events for each type in the union.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @example\n\t * ```\n\t * const event = new EventEmitter<number | undefined>().event;\n\t * const [numberEvent, undefinedEvent] = Event.split(event, isUndefined);\n\t * ```\n\t *\n\t * @param event The event source for the new event.\n\t * @param isT A function that determines what event is of the first type.\n\t * @param disposable A disposable store to add the new EventEmitter to.\n\t */\n\texport function split<T, U>(event: Event<T | U>, isT: (e: T | U) => e is T, disposable?: DisposableStore): [Event<T>, Event<U>] {\n\t\treturn [\n\t\t\tEvent.filter(event, isT, disposable),\n\t\t\tEvent.filter(event, e => !isT(e), disposable) as Event<U>,\n\t\t];\n\t}\n\n\t/**\n\t * Buffers an event until it has a listener attached.\n\t *\n\t * *NOTE* that this function returns an `Event` and it MUST be called with a `DisposableStore` whenever the returned\n\t * event is accessible to \"third parties\", e.g the event is a public property. Otherwise a leaked listener on the\n\t * returned event causes this utility to leak a listener on the original event.\n\t *\n\t * @param event The event source for the new event.\n\t * @param flushAfterTimeout Determines whether to flush the buffer after a timeout immediately or after a\n\t * `setTimeout` when the first event listener is added.\n\t * @param _buffer Internal: A source event array used for tests.\n\t *\n\t * @example\n\t * ```\n\t * // Start accumulating events, when the first listener is attached, flush\n\t * // the event after a timeout such that multiple listeners attached before\n\t * // the timeout would receive the event\n\t * this.onInstallExtension = Event.buffer(service.onInstallExtension, true);\n\t * ```\n\t */\n\texport function buffer<T>(event: Event<T>, flushAfterTimeout = false, _buffer: T[] = [], disposable?: DisposableStore): Event<T> {\n\t\tlet buffer: T[] | null = _buffer.slice();\n\n\t\tlet listener: IDisposable | null = event(e => {\n\t\t\tif (buffer) {\n\t\t\t\tbuffer.push(e);\n\t\t\t} else {\n\t\t\t\temitter.fire(e);\n\t\t\t}\n\t\t});\n\n\t\tif (disposable) {\n\t\t\tdisposable.add(listener);\n\t\t}\n\n\t\tconst flush = () => {\n\t\t\tbuffer?.forEach(e => emitter.fire(e));\n\t\t\tbuffer = null;\n\t\t};\n\n\t\tconst emitter = new Emitter<T>({\n\t\t\tonWillAddFirstListener() {\n\t\t\t\tif (!listener) {\n\t\t\t\t\tlistener = event(e => emitter.fire(e));\n\t\t\t\t\tif (disposable) {\n\t\t\t\t\t\tdisposable.add(listener);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonDidAddFirstListener() {\n\t\t\t\tif (buffer) {\n\t\t\t\t\tif (flushAfterTimeout) {\n\t\t\t\t\t\tsetTimeout(flush);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tflush();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\n\t\t\tonDidRemoveLastListener() {\n\t\t\t\tif (listener) {\n\t\t\t\t\tlistener.dispose();\n\t\t\t\t}\n\t\t\t\tlistener = null;\n\t\t\t}\n\t\t});\n\n\t\tif (disposable) {\n\t\t\tdisposable.add(emitter);\n\t\t}\n\n\t\treturn emitter.event;\n\t}\n\t/**\n\t * Wraps the event in an {@link IChainableEvent}, allowing a more functional programming style.\n\t *\n\t * @example\n\t * ```\n\t * // Normal\n\t * const onEnterPressNormal = Event.filter(\n\t * Event.map(onKeyPress.event, e => new StandardKeyboardEvent(e)),\n\t * e.keyCode === KeyCode.Enter\n\t * ).event;\n\t *\n\t * // Using chain\n\t * const onEnterPressChain = Event.chain(onKeyPress.event, $ => $\n\t * .map(e => new StandardKeyboardEvent(e))\n\t * .filter(e => e.keyCode === KeyCode.Enter)\n\t * );\n\t * ```\n\t */\n\texport function chain<T, R>(event: Event<T>, sythensize: ($: IChainableSythensis<T>) => IChainableSythensis<R>): Event<R> {\n\t\tconst fn: Event<R> = (listener, thisArgs, disposables) => {\n\t\t\tconst cs = sythensize(new ChainableSynthesis()) as ChainableSynthesis;\n\t\t\treturn event(function (value) {\n\t\t\t\tconst result = cs.evaluate(value);\n\t\t\t\tif (result !== HaltChainable) {\n\t\t\t\t\tlistener.call(thisArgs, result);\n\t\t\t\t}\n\t\t\t}, undefined, disposables);\n\t\t};\n\n\t\treturn fn;\n\t}\n\n\tconst HaltChainable = Symbol('HaltChainable');\n\n\tclass ChainableSynthesis implements IChainableSythensis<any> {\n\t\tprivate readonly steps: ((input: any) => any)[] = [];\n\n\t\tmap<O>(fn: (i: any) => O): this {\n\t\t\tthis.steps.push(fn);\n\t\t\treturn this;\n\t\t}\n\n\t\tforEach(fn: (i: any) => void): this {\n\t\t\tthis.steps.push(v => {\n\t\t\t\tfn(v);\n\t\t\t\treturn v;\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tfilter(fn: (e: any) => boolean): this {\n\t\t\tthis.steps.push(v => fn(v) ? v : HaltChainable);\n\t\t\treturn this;\n\t\t}\n\n\t\treduce<R>(merge: (last: R | undefined, event: any) => R, initial?: R | undefined): this {\n\t\t\tlet last = initial;\n\t\t\tthis.steps.push(v => {\n\t\t\t\tlast = merge(last, v);\n\t\t\t\treturn last;\n\t\t\t});\n\t\t\treturn this;\n\t\t}\n\n\t\tlatch(equals: (a: any, b: any) => boolean = (a, b) => a === b): ChainableSynthesis {\n\t\t\tlet firstCall = true;\n\t\t\tlet cache: any;\n\t\t\tthis.steps.push(value => {\n\t\t\t\tconst shouldEmit = firstCall || !equals(value, cache);\n\t\t\t\tfirstCall = false;\n\t\t\t\tcache = value;\n\t\t\t\treturn shouldEmit ? value : HaltChainable;\n\t\t\t});\n\n\t\t\treturn this;\n\t\t}\n\n\t\tpublic evaluate(value: any) {\n\t\t\tfor (const step of this.steps) {\n\t\t\t\tvalue = step(value);\n\t\t\t\tif (value === HaltChainable) {\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn value;\n\t\t}\n\t}\n\n\texport interface IChainableSythensis<T> {\n\t\tmap<O>(fn: (i: T) => O): IChainableSythensis<O>;\n\t\tforEach(fn: (i: T) => void): IChainableSythensis<T>;\n\t\tfilter<R extends T>(fn: (e: T) => e is R): IChainableSythensis<R>;\n\t\tfilter(fn: (e: T) => boolean): IChainableSythensis<T>;\n\t\treduce<R>(merge: (last: R, event: T) => R, initial: R): IChainableSythensis<R>;\n\t\treduce<R>(merge: (last: R | undefined, event: T) => R): IChainableSythensis<R>;\n\t\tlatch(equals?: (a: T, b: T) => boolean): IChainableSythensis<T>;\n\t}\n\n\texport interface NodeEventEmitter {\n\t\ton(event: string | symbol, listener: Function): unknown;\n\t\tremoveListener(event: string | symbol, listener: Function): unknown;\n\t}\n\n\t/**\n\t * Creates an {@link Event} from a node event emitter.\n\t */\n\texport function fromNodeEventEmitter<T>(emitter: NodeEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event<T> {\n\t\tconst fn = (...args: any[]) => result.fire(map(...args));\n\t\tconst onFirstListenerAdd = () => emitter.on(eventName, fn);\n\t\tconst onLastListenerRemove = () => emitter.removeListener(eventName, fn);\n\t\tconst result = new Emitter<T>({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove });\n\n\t\treturn result.event;\n\t}\n\n\texport interface DOMEventEmitter {\n\t\taddEventListener(event: string | symbol, listener: Function): void;\n\t\tremoveEventListener(event: string | symbol, listener: Function): void;\n\t}\n\n\t/**\n\t * Creates an {@link Event} from a DOM event emitter.\n\t */\n\texport function fromDOMEventEmitter<T>(emitter: DOMEventEmitter, eventName: string, map: (...args: any[]) => T = id => id): Event<T> {\n\t\tconst fn = (...args: any[]) => result.fire(map(...args));\n\t\tconst onFirstListenerAdd = () => emitter.addEventListener(eventName, fn);\n\t\tconst onLastListenerRemove = () => emitter.removeEventListener(eventName, fn);\n\t\tconst result = new Emitter<T>({ onWillAddFirstListener: onFirstListenerAdd, onDidRemoveLastListener: onLastListenerRemove });\n\n\t\treturn result.event;\n\t}\n\n\t/**\n\t * Creates a promise out of an event, using the {@link Event.once} helper.\n\t */\n\texport function toPromise<T>(event: Event<T>): Promise<T> {\n\t\treturn new Promise(resolve => once(event)(resolve));\n\t}\n\n\t/**\n\t * Creates an event out of a promise that fires once when the promise is\n\t * resolved with the result of the promise or `undefined`.\n\t */\n\texport function fromPromise<T>(promise: Promise<T>): Event<T | undefined> {\n\t\tconst result = new Emitter<T | undefined>();\n\n\t\tpromise.then(res => {\n\t\t\tresult.fire(res);\n\t\t}, () => {\n\t\t\tresult.fire(undefined);\n\t\t}).finally(() => {\n\t\t\tresult.dispose();\n\t\t});\n\n\t\treturn result.event;\n\t}\n\n\t/**\n\t * A convenience function for forwarding an event to another emitter which\n\t * improves readability.allows Event.forward(event, emitter) instead of `event(e => emitter.fire(e))`.\n\t * @param from The event to forward.\n\t * @param to The emitter to forward the event to.\n\t * @example\n\t * Event.forward(event, emitter);\n\t * // equivalent to\n\t * event(e => emitter.fire(e));\n\t * // equivalent to\n\t * event(emitter.fire, emitter);\n\t */\n\texport function forward<T>(from: Event<T>, to: Emitter<T>): IDisposable {\n\t\treturn from(e => to.fire(e));\n\t}\n\n\t/**\n\t * Adds a listener to an event and calls the listener immediately with undefined as the event object.\n\t *\n\t * @example\n\t * ```\n\t * // Initialize the UI and update it when dataChangeEvent fires\n\t * runAndSubscribe(dataChangeEvent, () => this._updateUI());\n\t * ```\n\t */\n\texport function runAndSubscribe<T>(event: Event<T>, handler: (e: T) => any, initial: T): IDisposable;\n\texport function runAndSubscribe<T>(event: Event<T>, handler: (e: T | undefined) => any): IDisposable;\n\texport function runAndSubscribe<T>(event: Event<T>, handler: (e: T | undefined) => any, initial?: T): IDisposable {\n\t\thandler(initial);\n\t\treturn event(e => handler(e));\n\t}\n\n\tclass EmitterObserver<T> implements IObserver {\n\n\t\treadonly emitter: Emitter<T>;\n\n\t\tprivate _counter = 0;\n\t\tprivate _hasChanged = false;\n\n\t\tconstructor(readonly _observable: IObservable<T, any>, store: DisposableStore | undefined) {\n\t\t\tconst options: EmitterOptions = {\n\t\t\t\tonWillAddFirstListener: () => {\n\t\t\t\t\t_observable.addObserver(this);\n\t\t\t\t},\n\t\t\t\tonDidRemoveLastListener: () => {\n\t\t\t\t\t_observable.removeObserver(this);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (!store) {\n\t\t\t\t_addLeakageTraceLogic(options);\n\t\t\t}\n\t\t\tthis.emitter = new Emitter<T>(options);\n\t\t\tif (store) {\n\t\t\t\tstore.add(this.emitter);\n\t\t\t}\n\t\t}\n\n\t\tbeginUpdate<T>(_observable: IObservable<T, void>): void {\n\t\t\t// assert(_observable === this.obs);\n\t\t\tthis._counter++;\n\t\t}\n\n\t\thandlePossibleChange<T>(_observable: IObservable<T, unknown>): void {\n\t\t\t// assert(_observable === this.obs);\n\t\t}\n\n\t\thandleChange<T, TChange>(_observable: IObservable<T, TChange>, _change: TChange): void {\n\t\t\t// assert(_observable === this.obs);\n\t\t\tthis._hasChanged = true;\n\t\t}\n\n\t\tendUpdate<T>(_observable: IObservable<T, void>): void {\n\t\t\t// assert(_observable === this.obs);\n\t\t\tthis._counter--;\n\t\t\tif (this._counter === 0) {\n\t\t\t\tthis._observable.reportChanges();\n\t\t\t\tif (this._hasChanged) {\n\t\t\t\t\tthis._hasChanged = false;\n\t\t\t\t\tthis.emitter.fire(this._observable.get());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t/**\n\t * Creates an event emitter that is fired when the observable changes.\n\t * Each listeners subscribes to the emitter.\n\t */\n\texport function fromObservable<T>(obs: IObservable<T, any>, store?: DisposableStore): Event<T> {\n\t\tconst observer = new EmitterObserver(obs, store);\n\t\treturn observer.emitter.event;\n\t}\n\n\t/**\n\t * Each listener is attached to the observable directly.\n\t */\n\texport function fromObservableLight(observable: IObservable<any>): Event<void> {\n\t\treturn (listener, thisArgs, disposables) => {\n\t\t\tlet count = 0;\n\t\t\tlet didChange = false;\n\t\t\tconst observer: IObserver = {\n\t\t\t\tbeginUpdate() {\n\t\t\t\t\tcount++;\n\t\t\t\t},\n\t\t\t\tendUpdate() {\n\t\t\t\t\tcount--;\n\t\t\t\t\tif (count === 0) {\n\t\t\t\t\t\tobservable.reportChanges();\n\t\t\t\t\t\tif (didChange) {\n\t\t\t\t\t\t\tdidChange = false;\n\t\t\t\t\t\t\tlistener.call(thisArgs);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\thandlePossibleChange() {\n\t\t\t\t\t// noop\n\t\t\t\t},\n\t\t\t\thandleChange() {\n\t\t\t\t\tdidChange = true;\n\t\t\t\t}\n\t\t\t};\n\t\t\tobservable.addObserver(observer);\n\t\t\tobservable.reportChanges();\n\t\t\tconst disposable = {\n\t\t\t\tdispose() {\n\t\t\t\t\tobservable.removeObserver(observer);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\tif (disposables instanceof DisposableStore) {\n\t\t\t\tdisposables.add(disposable);\n\t\t\t} else if (Array.isArray(disposables)) {\n\t\t\t\tdisposables.push(disposable);\n\t\t\t}\n\n\t\t\treturn disposable;\n\t\t};\n\t}\n}\n\nexport interface EmitterOptions {\n\t/**\n\t * Optional function that's called *before* the very first listener is added\n\t */\n\tonWillAddFirstListener?: Function;\n\t/**\n\t * Optional function that's called *after* the very first listener is added\n\t */\n\tonDidAddFirstListener?: Function;\n\t/**\n\t * Optional function that's called after a listener is added\n\t */\n\tonDidAddListener?: Function;\n\t/**\n\t * Optional function that's called *after* remove the very last listener\n\t */\n\tonDidRemoveLastListener?: Function;\n\t/**\n\t * Optional function that's called *before* a listener is removed\n\t */\n\tonWillRemoveListener?: Function;\n\t/**\n\t * Optional function that's called when a listener throws an error. Defaults to\n\t * {@link onUnexpectedError}\n\t */\n\tonListenerError?: (e: any) => void;\n\t/**\n\t * Number of listeners that are allowed before assuming a leak. Default to\n\t * a globally configured value\n\t *\n\t * @see setGlobalLeakWarningThreshold\n\t */\n\tleakWarningThreshold?: number;\n\t/**\n\t * Pass in a delivery queue, which is useful for ensuring\n\t * in order event delivery across multiple emitters.\n\t */\n\tdeliveryQueue?: EventDeliveryQueue;\n\n\t/** ONLY enable this during development */\n\t_profName?: string;\n}\n\n\nexport class EventProfiling {\n\n\tstatic readonly all = new Set<EventProfiling>();\n\n\tprivate static _idPool = 0;\n\n\treadonly name: string;\n\tpublic listenerCount: number = 0;\n\tpublic invocationCount = 0;\n\tpublic elapsedOverall = 0;\n\tpublic durations: number[] = [];\n\n\tprivate _stopWatch?: StopWatch;\n\n\tconstructor(name: string) {\n\t\tthis.name = `${name}_${EventProfiling._idPool++}`;\n\t\tEventProfiling.all.add(this);\n\t}\n\n\tstart(listenerCount: number): void {\n\t\tthis._stopWatch = new StopWatch();\n\t\tthis.listenerCount = listenerCount;\n\t}\n\n\tstop(): void {\n\t\tif (this._stopWatch) {\n\t\t\tconst elapsed = this._stopWatch.elapsed();\n\t\t\tthis.durations.push(elapsed);\n\t\t\tthis.elapsedOverall += elapsed;\n\t\t\tthis.invocationCount += 1;\n\t\t\tthis._stopWatch = undefined;\n\t\t}\n\t}\n}\n\nlet _globalLeakWarningThreshold = -1;\nexport function setGlobalLeakWarningThreshold(n: number): IDisposable {\n\tconst oldValue = _globalLeakWarningThreshold;\n\t_globalLeakWarningThreshold = n;\n\treturn {\n\t\tdispose() {\n\t\t\t_globalLeakWarningThreshold = oldValue;\n\t\t}\n\t};\n}\n\nclass LeakageMonitor {\n\n\tprivate static _idPool = 1;\n\n\tprivate _stacks: Map<string, number> | undefined;\n\tprivate _warnCountdown: number = 0;\n\n\tconstructor(\n\t\tprivate readonly _errorHandler: (err: Error) => void,\n\t\treadonly threshold: number,\n\t\treadonly name: string = (LeakageMonitor._idPool++).toString(16).padStart(3, '0')\n\t) { }\n\n\tdispose(): void {\n\t\tthis._stacks?.clear();\n\t}\n\n\tcheck(stack: Stacktrace, listenerCount: number): undefined | (() => void) {\n\n\t\tconst threshold = this.threshold;\n\t\tif (threshold <= 0 || listenerCount < threshold) {\n\t\t\treturn undefined;\n\t\t}\n\n\t\tif (!this._stacks) {\n\t\t\tthis._stacks = new Map();\n\t\t}\n\t\tconst count = (this._stacks.get(stack.value) || 0);\n\t\tthis._stacks.set(stack.value, count + 1);\n\t\tthis._warnCountdown -= 1;\n\n\t\tif (this._warnCountdown <= 0) {\n\t\t\t// only warn on first exceed and then every time the limit\n\t\t\t// is exceeded by 50% again\n\t\t\tthis._warnCountdown = threshold * 0.5;\n\n\t\t\tconst [topStack, topCount] = this.getMostFrequentStack()!;\n\t\t\tconst message = `[${this.name}] potential listener LEAK detected, having ${listenerCount} listeners already. MOST frequent listener (${topCount}):`;\n\t\t\tconsole.warn(message);\n\t\t\tconsole.warn(topStack!);\n\n\t\t\tconst error = new ListenerLeakError(message, topStack);\n\t\t\tthis._errorHandler(error);\n\t\t}\n\n\t\treturn () => {\n\t\t\tconst count = (this._stacks!.get(stack.value) || 0);\n\t\t\tthis._stacks!.set(stack.value, count - 1);\n\t\t};\n\t}\n\n\tgetMostFrequentStack(): [string, number] | undefined {\n\t\tif (!this._stacks) {\n\t\t\treturn undefined;\n\t\t}\n\t\tlet topStack: [string, number] | undefined;\n\t\tlet topCount: number = 0;\n\t\tfor (const [stack, count] of this._stacks) {\n\t\t\tif (!topStack || topCount < count) {\n\t\t\t\ttopStack = [stack, count];\n\t\t\t\ttopCount = count;\n\t\t\t}\n\t\t}\n\t\treturn topStack;\n\t}\n}\n\nclass Stacktrace {\n\n\tstatic create() {\n\t\tconst err = new Error();\n\t\treturn new Stacktrace(err.stack ?? '');\n\t}\n\n\tprivate constructor(readonly value: string) { }\n\n\tprint() {\n\t\tconsole.warn(this.value.split('\\n').slice(2).join('\\n'));\n\t}\n}\n\n// error that is logged when going over the configured listener threshold\nexport class ListenerLeakError extends Error {\n\tconstructor(message: string, stack: string) {\n\t\tsuper(message);\n\t\tthis.name = 'ListenerLeakError';\n\t\tthis.stack = stack;\n\t}\n}\n\n// SEVERE error that is logged when having gone way over the configured listener\n// threshold so that the emitter refuses to accept more listeners\nexport class ListenerRefusalError extends Error {\n\tconstructor(message: string, stack: string) {\n\t\tsuper(message);\n\t\tthis.name = 'ListenerRefusalError';\n\t\tthis.stack = stack;\n\t}\n}\n\nlet id = 0;\nclass UniqueContainer<T> {\n\tstack?: Stacktrace;\n\tpublic id = id++;\n\tconstructor(public readonly value: T) { }\n}\nconst compactionThreshold = 2;\n\ntype ListenerContainer<T> = UniqueContainer<(data: T) => void>;\ntype ListenerOrListeners<T> = (ListenerContainer<T> | undefined)[] | ListenerContainer<T>;\n\nconst forEachListener = <T>(listeners: ListenerOrListeners<T>, fn: (c: ListenerContainer<T>) => void) => {\n\tif (listeners instanceof UniqueContainer) {\n\t\tfn(listeners);\n\t} else {\n\t\tfor (let i = 0; i < listeners.length; i++) {\n\t\t\tconst l = listeners[i];\n\t\t\tif (l) {\n\t\t\t\tfn(l);\n\t\t\t}\n\t\t}\n\t}\n};\n\n\nlet _listenerFinalizers: FinalizationRegistry<string> | undefined;\n\nif (_enableListenerGCedWarning) {\n\tconst leaks: string[] = [];\n\n\tsetInterval(() => {\n\t\tif (leaks.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tconsole.warn('[LEAKING LISTENERS] GC\\'ed these listeners that were NOT yet disposed:');\n\t\tconsole.warn(leaks.join('\\n'));\n\t\tleaks.length = 0;\n\t}, 3000);\n\n\t_listenerFinalizers = new FinalizationRegistry(heldValue => {\n\t\tif (typeof heldValue === 'string') {\n\t\t\tleaks.push(heldValue);\n\t\t}\n\t});\n}\n\n/**\n * The Emitter can be used to expose an Event to the public\n * to fire it from the insides.\n * Sample:\n\tclass Document {\n\n\t\tprivate readonly _onDidChange = new Emitter<(value:string)=>any>();\n\n\t\tpublic onDidChange = this._onDidChange.event;\n\n\t\t// getter-style\n\t\t// get onDidChange(): Event<(value:string)=>any> {\n\t\t// \treturn this._onDidChange.event;\n\t\t// }\n\n\t\tprivate _doIt() {\n\t\t\t//...\n\t\t\tthis._onDidChange.fire(value);\n\t\t}\n\t}\n */\nexport class Emitter<T> {\n\n\tprivate readonly _options?: EmitterOptions;\n\tprivate readonly _leakageMon?: LeakageMonitor;\n\tprivate readonly _perfMon?: EventProfiling;\n\tprivate _disposed?: true;\n\tprivate _event?: Event<T>;\n\n\t/**\n\t * A listener, or list of listeners. A single listener is the most common\n\t * for event emitters (#185789), so we optimize that special case to avoid\n\t * wrapping it in an array (just like Node.js itself.)\n\t *\n\t * A list of listeners never 'downgrades' back to a plain function if\n\t * listeners are removed, for two reasons:\n\t *\n\t * 1. That's complicated (especially with the deliveryQueue)\n\t * 2. A listener with >1 listener is likely to have >1 listener again at\n\t * some point, and swapping between arrays and functions may[citation needed]\n\t * introduce unnecessary work and garbage.\n\t *\n\t * The array listeners can be 'sparse', to avoid reallocating the array\n\t * whenever any listener is added or removed. If more than `1 / compactionThreshold`\n\t * of the array is empty, only then is it resized.\n\t */\n\tprotected _listeners?: ListenerOrListeners<T>;\n\n\t/**\n\t * Always to be defined if _listeners is an array. It's no longer a true\n\t * queue, but holds the dispatching 'state'. If `fire()` is called on an\n\t * emitter, any work left in the _deliveryQueue is finished first.\n\t */\n\tprivate _deliveryQueue?: EventDeliveryQueuePrivate;\n\tprotected _size = 0;\n\n\tconstructor(options?: EmitterOptions) {\n\t\tthis._options = options;\n\t\tthis._leakageMon = (_globalLeakWarningThreshold > 0 || this._options?.leakWarningThreshold)\n\t\t\t? new LeakageMonitor(options?.onListenerError ?? onUnexpectedError, this._options?.leakWarningThreshold ?? _globalLeakWarningThreshold) :\n\t\t\tundefined;\n\t\tthis._perfMon = this._options?._profName ? new EventProfiling(this._options._profName) : undefined;\n\t\tthis._deliveryQueue = this._options?.deliveryQueue as EventDeliveryQueuePrivate | undefined;\n\t}\n\n\tdispose() {\n\t\tif (!this._disposed) {\n\t\t\tthis._disposed = true;\n\n\t\t\t// It is bad to have listeners at the time of disposing an emitter, it is worst to have listeners keep the emitter\n\t\t\t// alive via the reference that's embedded in their disposables. Therefore we loop over all remaining listeners and\n\t\t\t// unset their subscriptions/disposables. Looping and blaming remaining listeners is done on next tick because the\n\t\t\t// the following programming pattern is very popular:\n\t\t\t//\n\t\t\t// const someModel = this._disposables.add(new ModelObject()); // (1) create and register model\n\t\t\t// this._disposables.add(someModel.onDidChange(() => { ... }); // (2) subscribe and register model-event listener\n\t\t\t// ...later...\n\t\t\t// this._disposables.dispose(); disposes (1) then (2): don't warn after (1) but after the \"overall dispose\" is done\n\n\t\t\tif (this._deliveryQueue?.current === this) {\n\t\t\t\tthis._deliveryQueue.reset();\n\t\t\t}\n\t\t\tif (this._listeners) {\n\t\t\t\tif (_enableDisposeWithListenerWarning) {\n\t\t\t\t\tconst listeners = this._listeners;\n\t\t\t\t\tqueueMicrotask(() => {\n\t\t\t\t\t\tforEachListener(listeners, l => l.stack?.print());\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tthis._listeners = undefined;\n\t\t\t\tthis._size = 0;\n\t\t\t}\n\t\t\tthis._options?.onDidRemoveLastListener?.();\n\t\t\tthis._leakageMon?.dispose();\n\t\t}\n\t}\n\n\t/**\n\t * For the public to allow to subscribe\n\t * to events from this Emitter\n\t */\n\tget event(): Event<T> {\n\t\tthis._event ??= (callback: (e: T) => any, thisArgs?: any, disposables?: IDisposable[] | DisposableStore) => {\n\t\t\tif (this._leakageMon && this._size > this._leakageMon.threshold ** 2) {\n\t\t\t\tconst message = `[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`;\n\t\t\t\tconsole.warn(message);\n\n\t\t\t\tconst tuple = this._leakageMon.getMostFrequentStack() ?? ['UNKNOWN stack', -1];\n\t\t\t\tconst error = new ListenerRefusalError(`${message}. HINT: Stack shows most frequent listener (${tuple[1]}-times)`, tuple[0]);\n\t\t\t\tconst errorHandler = this._options?.onListenerError || onUnexpectedError;\n\t\t\t\terrorHandler(error);\n\n\t\t\t\treturn Disposable.None;\n\t\t\t}\n\n\t\t\tif (this._disposed) {\n\t\t\t\t// todo: should we warn if a listener is added to a disposed emitter? This happens often\n\t\t\t\treturn Disposable.None;\n\t\t\t}\n\n\t\t\tif (thisArgs) {\n\t\t\t\tcallback = callback.bind(thisArgs);\n\t\t\t}\n\n\t\t\tconst contained = new UniqueContainer(callback);\n\n\t\t\tlet removeMonitor: Function | undefined;\n\t\t\tlet stack: Stacktrace | undefined;\n\t\t\tif (this._leakageMon && this._size >= Math.ceil(this._leakageMon.threshold * 0.2)) {\n\t\t\t\t// check and record this emitter for potential leakage\n\t\t\t\tcontained.stack = Stacktrace.create();\n\t\t\t\tremoveMonitor = this._leakageMon.check(contained.stack, this._size + 1);\n\t\t\t}\n\n\t\t\tif (_enableDisposeWithListenerWarning) {\n\t\t\t\tcontained.stack = stack ?? Stacktrace.create();\n\t\t\t}\n\n\t\t\tif (!this._listeners) {\n\t\t\t\tthis._options?.onWillAddFirstListener?.(this);\n\t\t\t\tthis._listeners = contained;\n\t\t\t\tthis._options?.onDidAddFirstListener?.(this);\n\t\t\t} else if (this._listeners instanceof UniqueContainer) {\n\t\t\t\tthis._deliveryQueue ??= new EventDeliveryQueuePrivate();\n\t\t\t\tthis._listeners = [this._listeners, contained];\n\t\t\t} else {\n\t\t\t\tthis._listeners.push(contained);\n\t\t\t}\n\n\t\t\tthis._size++;\n\n\n\t\t\tconst result = toDisposable(() => {\n\t\t\t\t_listenerFinalizers?.unregister(result);\n\t\t\t\tremoveMonitor?.();\n\t\t\t\tthis._removeListener(contained);\n\t\t\t});\n\t\t\tif (disposables instanceof DisposableStore) {\n\t\t\t\tdisposables.add(result);\n\t\t\t} else if (Array.isArray(disposables)) {\n\t\t\t\tdisposables.push(result);\n\t\t\t}\n\n\t\t\tif (_listenerFinalizers) {\n\t\t\t\tconst stack = new Error().stack!.split('\\n').slice(2, 3).join('\\n').trim();\n\t\t\t\tconst match = /(file:|vscode-file:\\/\\/vscode-app)?(\\/[^:]*:\\d+:\\d+)/.exec(stack);\n\t\t\t\t_listenerFinalizers.register(result, match?.[2] ?? stack, result);\n\t\t\t}\n\n\t\t\treturn result;\n\t\t};\n\n\t\treturn this._event;\n\t}\n\n\tprivate _removeListener(listener: ListenerContainer<T>) {\n\t\tthis._options?.onWillRemoveListener?.(this);\n\n\t\tif (!this._listeners) {\n\t\t\treturn; // expected if a listener gets disposed\n\t\t}\n\n\t\tif (this._size === 1) {\n\t\t\tthis._listeners = undefined;\n\t\t\tthis._options?.onDidRemoveLastListener?.(this);\n\t\t\tthis._size = 0;\n\t\t\treturn;\n\t\t}\n\n\t\t// size > 1 which requires that listeners be a list:\n\t\tconst listeners = this._listeners as (ListenerContainer<T> | undefined)[];\n\n\t\tconst index = listeners.indexOf(listener);\n\t\tif (index === -1) {\n\t\t\tconsole.log('disposed?', this._disposed);\n\t\t\tconsole.log('size?', this._size);\n\t\t\tconsole.log('arr?', JSON.stringify(this._listeners));\n\t\t\tthrow new Error('Attempted to dispose unknown listener');\n\t\t}\n\n\t\tthis._size--;\n\t\tlisteners[index] = undefined;\n\n\t\tconst adjustDeliveryQueue = this._deliveryQueue!.current === this;\n\t\tif (this._size * compactionThreshold <= listeners.length) {\n\t\t\tlet n = 0;\n\t\t\tfor (let i = 0; i < listeners.length; i++) {\n\t\t\t\tif (listeners[i]) {\n\t\t\t\t\tlisteners[n++] = listeners[i];\n\t\t\t\t} else if (adjustDeliveryQueue) {\n\t\t\t\t\tthis._deliveryQueue!.end--;\n\t\t\t\t\tif (n < this._deliveryQueue!.i) {\n\t\t\t\t\t\tthis._deliveryQueue!.i--;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tlisteners.length = n;\n\t\t}\n\t}\n\n\tprivate _deliver(listener: undefined | UniqueContainer<(value: T) => void>, value: T) {\n\t\tif (!listener) {\n\t\t\treturn;\n\t\t}\n\n\t\tconst errorHandler = this._options?.onListenerError || onUnexpectedError;\n\t\tif (!errorHandler) {\n\t\t\tlistener.value(value);\n\t\t\treturn;\n\t\t}\n\n\t\ttry {\n\t\t\tlistener.value(value);\n\t\t} catch (e) {\n\t\t\terrorHandler(e);\n\t\t}\n\t}\n\n\t/** Delivers items in the queue. Assumes the queue is ready to go. */\n\tprivate _deliverQueue(dq: EventDeliveryQueuePrivate) {\n\t\tconst listeners = dq.current!._listeners! as (ListenerContainer<T> | undefined)[];\n\t\twhile (dq.i < dq.end) {\n\t\t\t// important: dq.i is incremented before calling deliver() because it might reenter deliverQueue()\n\t\t\tthis._deliver(listeners[dq.i++], dq.value as T);\n\t\t}\n\t\tdq.reset();\n\t}\n\n\t/**\n\t * To be kept private to fire an event to\n\t * subscribers\n\t */\n\tfire(event: T): void {\n\t\tif (this._deliveryQueue?.current) {\n\t\t\tthis._deliverQueue(this._deliveryQueue);\n\t\t\tthis._perfMon?.stop(); // last fire() will have starting perfmon, stop it before starting the next dispatch\n\t\t}\n\n\t\tthis._perfMon?.start(this._size);\n\n\t\tif (!this._listeners) {\n\t\t\t// no-op\n\t\t} else if (this._listeners instanceof UniqueContainer) {\n\t\t\tthis._deliver(this._listeners, event);\n\t\t} else {\n\t\t\tconst dq = this._deliveryQueue!;\n\t\t\tdq.enqueue(this, event, this._listeners.length);\n\t\t\tthis._deliverQueue(dq);\n\t\t}\n\n\t\tthis._perfMon?.stop();\n\t}\n\n\thasListeners(): boolean {\n\t\treturn this._size > 0;\n\t}\n}\n\nexport interface EventDeliveryQueue {\n\t_isEventDeliveryQueue: true;\n}\n\nexport const createEventDeliveryQueue = (): EventDeliveryQueue => new EventDeliveryQueuePrivate();\n\nclass EventDeliveryQueuePrivate implements EventDeliveryQueue {\n\tdeclare _isEventDeliveryQueue: true;\n\n\t/**\n\t * Index in current's listener list.\n\t */\n\tpublic i = -1;\n\n\t/**\n\t * The last index in the listener's list to deliver.\n\t */\n\tpublic end = 0;\n\n\t/**\n\t * Emitter currently being dispatched on. Emitter._listeners is always an array.\n\t */\n\tpublic current?: Emitter<any>;\n\t/**\n\t * Currently emitting value. Defined whenever `current` is.\n\t */\n\tpublic value?: unknown;\n\n\tpublic enqueue<T>(emitter: Emitter<T>, value: T, end: number) {\n\t\tthis.i = 0;\n\t\tthis.end = end;\n\t\tthis.current = emitter;\n\t\tthis.value = value;\n\t}\n\n\tpublic reset() {\n\t\tthis.i = this.end; // force any current emission loop to stop, mainly for during dispose\n\t\tthis.current = undefined;\n\t\tthis.value = undefined;\n\t}\n}\n\nexport interface IWaitUntil {\n\ttoken: CancellationToken;\n\twaitUntil(thenable: Promise<unknown>): void;\n}\n\nexport type IWaitUntilData<T> = Omit<Omit<T, 'waitUntil'>, 'token'>;\n\nexport class AsyncEmitter<T extends IWaitUntil> extends Emitter<T> {\n\n\tprivate _asyncDeliveryQueue?: LinkedList<[(ev: T) => void, IWaitUntilData<T>]>;\n\n\tasync fireAsync(data: IWaitUntilData<T>, token: CancellationToken, promiseJoin?: (p: Promise<unknown>, listener: Function) => Promise<unknown>): Promise<void> {\n\t\tif (!this._listeners) {\n\t\t\treturn;\n\t\t}\n\n\t\tif (!this._asyncDeliveryQueue) {\n\t\t\tthis._asyncDeliveryQueue = new LinkedList();\n\t\t}\n\n\t\tforEachListener(this._listeners, listener => this._asyncDeliveryQueue!.push([listener.value, data]));\n\n\t\twhile (this._asyncDeliveryQueue.size > 0 && !token.isCancellationRequested) {\n\n\t\t\tconst [listener, data] = this._asyncDeliveryQueue.shift()!;\n\t\t\tconst thenables: Promise<unknown>[] = [];\n\n\t\t\tconst event = <T>{\n\t\t\t\t...data,\n\t\t\t\ttoken,\n\t\t\t\twaitUntil: (p: Promise<unknown>): void => {\n\t\t\t\t\tif (Object.isFrozen(thenables)) {\n\t\t\t\t\t\tthrow new Error('waitUntil can NOT be called asynchronous');\n\t\t\t\t\t}\n\t\t\t\t\tif (promiseJoin) {\n\t\t\t\t\t\tp = promiseJoin(p, listener);\n\t\t\t\t\t}\n\t\t\t\t\tthenables.push(p);\n\t\t\t\t}\n\t\t\t};\n\n\t\t\ttry {\n\t\t\t\tlistener(event);\n\t\t\t} catch (e) {\n\t\t\t\tonUnexpectedError(e);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// freeze thenables-collection to enforce sync-calls to\n\t\t\t// wait until and then wait for all thenables to resolve\n\t\t\tObject.freeze(thenables);\n\n\t\t\tawait Promise.allSettled(thenables).then(values => {\n\t\t\t\tfor (const value of values) {\n\t\t\t\t\tif (value.status === 'rejected') {\n\t\t\t\t\t\tonUnexpectedError(value.reason);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n}\n\n\nexport class PauseableEmitter<T> extends Emitter<T> {\n\n\tprivate _isPaused = 0;\n\tprotected _eventQueue = new LinkedList<T>();\n\tprivate _mergeFn?: (input: T[]) => T;\n\n\tpublic get isPaused(): boolean {\n\t\treturn this._isPaused !== 0;\n\t}\n\n\tconstructor(options?: EmitterOptions & { merge?: (input: T[]) => T }) {\n\t\tsuper(options);\n\t\tthis._mergeFn = options?.merge;\n\t}\n\n\tpause(): void {\n\t\tthis._isPaused++;\n\t}\n\n\tresume(): void {\n\t\tif (this._isPaused !== 0 && --this._isPaused === 0) {\n\t\t\tif (this._mergeFn) {\n\t\t\t\t// use the merge function to create a single composite\n\t\t\t\t// event. make a copy in case firing pauses this emitter\n\t\t\t\tif (this._eventQueue.size > 0) {\n\t\t\t\t\tconst events = Array.from(this._eventQueue);\n\t\t\t\t\tthis._eventQueue.clear();\n\t\t\t\t\tsuper.fire(this._mergeFn(events));\n\t\t\t\t}\n\n\t\t\t} else {\n\t\t\t\t// no merging, fire each event individually and test\n\t\t\t\t// that this emitter isn't paused halfway through\n\t\t\t\twhile (!this._isPaused && this._eventQueue.size !== 0) {\n\t\t\t\t\tsuper.fire(this._eventQueue.shift()!);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\toverride fire(event: T): void {\n\t\tif (this._size) {\n\t\t\tif (this._isPaused !== 0) {\n\t\t\t\tthis._eventQueue.push(event);\n\t\t\t} else {\n\t\t\t\tsuper.fire(event);\n\t\t\t}\n\t\t}\n\t}\n}\n\nexport class DebounceEmitter<T> extends PauseableEmitter<T> {\n\n\tprivate readonly _delay: number;\n\tprivate _handle: any | undefined;\n\n\tconstructor(options: EmitterOptions & { merge: (input: T[]) => T; delay?: number }) {\n\t\tsuper(options);\n\t\tthis._delay = options.delay ?? 100;\n\t}\n\n\toverride fire(event: T): void {\n\t\tif (!this._handle) {\n\t\t\tthis.pause();\n\t\t\tthis._handle = setTimeout(() => {\n\t\t\t\tthis._handle = undefined;\n\t\t\t\tthis.resume();\n\t\t\t}, this._delay);\n\t\t}\n\t\tsuper.fire(event);\n\t}\n}\n\n/**\n * An emitter which queue all events and then process them at the\n * end of the event loop.\n */\nexport class MicrotaskEmitter<T> extends Emitter<T> {\n\tprivate _queuedEvents: T[] = [];\n\tprivate _mergeFn?: (input: T[]) => T;\n\n\tconstructor(options?: EmitterOptions & { merge?: (input: T[]) => T }) {\n\t\tsuper(options);\n\t\tthis._mergeFn = options?.merge;\n\t}\n\toverride fire(event: T): void {\n\n\t\tif (!this.hasListeners()) {\n\t\t\treturn;\n\t\t}\n\n\t\tthis._queuedEvents.push(event);\n\t\tif (this._queuedEvents.length === 1) {\n\t\t\tqueueMicrotask(() => {\n\t\t\t\tif (this._mergeFn) {\n\t\t\t\t\tsuper.fire(this._mergeFn(this._queuedEvents));\n\t\t\t\t} else {\n\t\t\t\t\tthis._queuedEvents.forEach(e => super.fire(e));\n\t\t\t\t}\n\t\t\t\tthis._queuedEvents = [];\n\t\t\t});\n\t\t}\n\t}\n}\n\n/**\n * An event emitter that multiplexes many events into a single event.\n *\n * @example Listen to the `onData` event of all `Thing`s, dynamically adding and removing `Thing`s\n * to the multiplexer as needed.\n *\n * ```typescript\n * const anythingDataMultiplexer = new EventMultiplexer<{ data: string }>();\n *\n * const thingListeners = DisposableMap<Thing, IDisposable>();\n *\n * thingService.onDidAddThing(thing => {\n * thingListeners.set(thing, anythingDataMultiplexer.add(thing.onData);\n * });\n * thingService.onDidRemoveThing(thing => {\n * thingListeners.deleteAndDispose(thing);\n * });\n *\n * anythingDataMultiplexer.event(e => {\n * console.log('Something fired data ' + e.data)\n * });\n * ```\n */\nexport class EventMultiplexer<T> implements IDisposable {\n\n\tprivate readonly emitter: Emitter<T>;\n\tprivate hasListeners = false;\n\tprivate events: { event: Event<T>; listener: IDisposable | null }[] = [];\n\n\tconstructor() {\n\t\tthis.emitter = new Emitter<T>({\n\t\t\tonWillAddFirstListener: () => this.onFirstListenerAdd(),\n\t\t\tonDidRemoveLastListener: () => this.onLastListenerRemove()\n\t\t});\n\t}\n\n\tget event(): Event<T> {\n\t\treturn this.emitter.event;\n\t}\n\n\tadd(event: Event<T>): IDisposable {\n\t\tconst e = { event: event, listener: null };\n\t\tthis.events.push(e);\n\n\t\tif (this.hasListeners) {\n\t\t\tthis.hook(e);\n\t\t}\n\n\t\tconst dispose = () => {\n\t\t\tif (this.hasListeners) {\n\t\t\t\tthis.unhook(e);\n\t\t\t}\n\n\t\t\tconst idx = this.events.indexOf(e);\n\t\t\tthis.events.splice(idx, 1);\n\t\t};\n\n\t\treturn toDisposable(createSingleCallFunction(dispose));\n\t}\n\n\tprivate onFirstListenerAdd(): void {\n\t\tthis.hasListeners = true;\n\t\tthis.events.forEach(e => this.hook(e));\n\t}\n\n\tprivate onLastListenerRemove(): void {\n\t\tthis.hasListeners = false;\n\t\tthis.events.forEach(e => this.unhook(e));\n\t}\n\n\tprivate hook(e: { event: Event<T>; listener: IDisposable | null }): void {\n\t\te.listener = e.event(r => this.emitter.fire(r));\n\t}\n\n\tprivate unhook(e: { event: Event<T>; listener: IDisposable | null }): void {\n\t\te.listener?.dispose();\n\t\te.listener = null;\n\t}\n\n\tdispose(): void {\n\t\tthis.emitter.dispose();\n\n\t\tfor (const e of this.events) {\n\t\t\te.listener?.dispose();\n\t\t}\n\t\tthis.events = [];\n\t}\n}\n\nexport interface IDynamicListEventMultiplexer<TEventType> extends IDisposable {\n\treadonly event: Event<TEventType>;\n}\nexport class DynamicListEventMultiplexer<TItem, TEventType> implements IDynamicListEventMultiplexer<TEventType> {\n\tprivate readonly _store = new DisposableStore();\n\n\treadonly event: Event<TEventType>;\n\n\tconstructor(\n\t\titems: TItem[],\n\t\tonAddItem: Event<TItem>,\n\t\tonRemoveItem: Event<TItem>,\n\t\tgetEvent: (item: TItem) => Event<TEventType>\n\t) {\n\t\tconst multiplexer = this._store.add(new EventMultiplexer<TEventType>());\n\t\tconst itemListeners = this._store.add(new DisposableMap<TItem, IDisposable>());\n\n\t\tfunction addItem(instance: TItem) {\n\t\t\titemListeners.set(instance, multiplexer.add(getEvent(instance)));\n\t\t}\n\n\t\t// Existing items\n\t\tfor (const instance of items) {\n\t\t\taddItem(instance);\n\t\t}\n\n\t\t// Added items\n\t\tthis._store.add(onAddItem(instance => {\n\t\t\taddItem(instance);\n\t\t}));\n\n\t\t// Removed items\n\t\tthis._store.add(onRemoveItem(instance => {\n\t\t\titemListeners.deleteAndDispose(instance);\n\t\t}));\n\n\t\tthis.event = multiplexer.event;\n\t}\n\n\tdispose() {\n\t\tthis._store.dispose();\n\t}\n}\n\n/**\n * The EventBufferer is useful in situations in which you want\n * to delay firing your events during some code.\n * You can wrap that code and be sure that the event will not\n * be fired during that wrap.\n *\n * ```\n * const emitter: Emitter;\n * const delayer = new EventDelayer();\n * const delayedEvent = delayer.wrapEvent(emitter.event);\n *\n * delayedEvent(console.log);\n *\n * delayer.bufferEvents(() => {\n * emitter.fire(); // event will not be fired yet\n * });\n *\n * // event will only be fired at this point\n * ```\n */\nexport class EventBufferer {\n\n\tprivate data: { buffers: Function[] }[] = [];\n\n\twrapEvent<T>(event: Event<T>): Event<T>;\n\twrapEvent<T>(event: Event<T>, reduce: (last: T | undefined, event: T) => T): Event<T>;\n\twrapEvent<T, O>(event: Event<T>, reduce: (last: O | undefined, event: T) => O, initial: O): Event<O>;\n\twrapEvent<T, O>(event: Event<T>, reduce?: (last: T | O | undefined, event: T) => T | O, initial?: O): Event<O | T> {\n\t\treturn (listener, thisArgs?, disposables?) => {\n\t\t\treturn event(i => {\n\t\t\t\tconst data = this.data[this.data.length - 1];\n\n\t\t\t\t// Non-reduce scenario\n\t\t\t\tif (!reduce) {\n\t\t\t\t\t// Buffering case\n\t\t\t\t\tif (data) {\n\t\t\t\t\t\tdata.buffers.push(() => listener.call(thisArgs, i));\n\t\t\t\t\t} else {\n\t\t\t\t\t\t// Not buffering case\n\t\t\t\t\t\tlistener.call(thisArgs, i);\n\t\t\t\t\t}\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Reduce scenario\n\t\t\t\tconst reduceData = data as typeof data & {\n\t\t\t\t\t/**\n\t\t\t\t\t * The accumulated items that will be reduced.\n\t\t\t\t\t */\n\t\t\t\t\titems?: T[];\n\t\t\t\t\t/**\n\t\t\t\t\t * The reduced result cached to be shared with other listeners.\n\t\t\t\t\t */\n\t\t\t\t\treducedResult?: T | O;\n\t\t\t\t};\n\n\t\t\t\t// Not buffering case\n\t\t\t\tif (!reduceData) {\n\t\t\t\t\t// TODO: Is there a way to cache this reduce call for all listeners?\n\t\t\t\t\tlistener.call(thisArgs, reduce(initial, i));\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Buffering case\n\t\t\t\treduceData.items ??= [];\n\t\t\t\treduceData.items.push(i);\n\t\t\t\tif (reduceData.buffers.length === 0) {\n\t\t\t\t\t// Include a single buffered function that will reduce all events when we're done buffering events\n\t\t\t\t\tdata.buffers.push(() => {\n\t\t\t\t\t\t// cache the reduced result so that the value can be shared across all listeners\n\t\t\t\t\t\treduceData.reducedResult ??= initial\n\t\t\t\t\t\t\t? reduceData.items!.reduce(reduce as (last: O | undefined, event: T) => O, initial)\n\t\t\t\t\t\t\t: reduceData.items!.reduce(reduce as (last: T | undefined, event: T) => T);\n\t\t\t\t\t\tlistener.call(thisArgs, reduceData.reducedResult);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, undefined, disposables);\n\t\t};\n\t}\n\n\tbufferEvents<R = void>(fn: () => R): R {\n\t\tconst data = { buffers: new Array<Function>() };\n\t\tthis.data.push(data);\n\t\tconst r = fn();\n\t\tthis.data.pop();\n\t\tdata.buffers.forEach(flush => flush());\n\t\treturn r;\n\t}\n}\n\n/**\n * A Relay is an event forwarder which functions as a replugabble event pipe.\n * Once created, you can connect an input event to it and it will simply forward\n * events from that input event through its own `event` property. The `input`\n * can be changed at any point in time.\n */\nexport class Relay<T> implements IDisposable {\n\n\tprivate listening = false;\n\tprivate inputEvent: Event<T> = Event.None;\n\tprivate inputEventListener: IDisposable = Disposable.None;\n\n\tprivate readonly emitter = new Emitter<T>({\n\t\tonDidAddFirstListener: () => {\n\t\t\tthis.listening = true;\n\t\t\tthis.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter);\n\t\t},\n\t\tonDidRemoveLastListener: () => {\n\t\t\tthis.listening = false;\n\t\t\tthis.inputEventListener.dispose();\n\t\t}\n\t});\n\n\treadonly event: Event<T> = this.emitter.event;\n\n\tset input(event: Event<T>) {\n\t\tthis.inputEvent = event;\n\n\t\tif (this.listening) {\n\t\t\tthis.inputEventListener.dispose();\n\t\t\tthis.inputEventListener = event(this.emitter.fire, this.emitter);\n\t\t}\n\t}\n\n\tdispose() {\n\t\tthis.inputEventListener.dispose();\n\t\tthis.emitter.dispose();\n\t}\n}\n\nexport interface IValueWithChangeEvent<T> {\n\treadonly onDidChange: Event<void>;\n\tget value(): T;\n}\n\nexport class ValueWithChangeEvent<T> implements IValueWithChangeEvent<T> {\n\tpublic static const<T>(value: T): IValueWithChangeEvent<T> {\n\t\treturn new ConstValueWithChangeEvent(value);\n\t}\n\n\tprivate readonly _onDidChange = new Emitter<void>();\n\treadonly onDidChange: Event<void> = this._onDidChange.event;\n\n\tconstructor(private _value: T) { }\n\n\tget value(): T {\n\t\treturn this._value;\n\t}\n\n\tset value(value: T) {\n\t\tif (value !== this._value) {\n\t\t\tthis._value = value;\n\t\t\tthis._onDidChange.fire(undefined);\n\t\t}\n\t}\n}\n\nclass ConstValueWithChangeEvent<T> implements IValueWithChangeEvent<T> {\n\tpublic readonly onDidChange: Event<void> = Event.None;\n\n\tconstructor(readonly value: T) { }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IColorContrastCache } from 'browser/Types';\nimport { DIM_OPACITY, TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { tryDrawCustomChar } from 'browser/renderer/shared/CustomGlyphs';\nimport { computeNextVariantOffset, treatGlyphAsBackgroundColor, isPowerlineGlyph, isRestrictedPowerlineGlyph, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IBoundingBox, ICharAtlasConfig, IRasterizedGlyph, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_COLOR, channels, color, rgba } from 'common/Color';\nimport { FourKeyMap } from 'common/MultiKeyMap';\nimport { IdleTaskQueue } from 'common/TaskQueue';\nimport { IColor } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { Attributes, DEFAULT_COLOR, DEFAULT_EXT, UnderlineStyle } from 'common/buffer/Constants';\nimport { IUnicodeService } from 'common/services/Services';\nimport { Emitter } from 'vs/base/common/event';\n\n/**\n * A shared object which is used to draw nothing for a particular cell.\n */\nconst NULL_RASTERIZED_GLYPH: IRasterizedGlyph = {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n offset: { x: 0, y: 0 },\n size: { x: 0, y: 0 },\n sizeClipSpace: { x: 0, y: 0 }\n};\n\nconst TMP_CANVAS_GLYPH_PADDING = 2;\n\nconst enum Constants {\n /**\n * The amount of pixel padding to allow in each row. Setting this to zero would make the atlas\n * page pack as tightly as possible, but more pages would end up being created as a result.\n */\n ROW_PIXEL_THRESHOLD = 2,\n /**\n * The maximum texture size regardless of what the actual hardware maximum turns out to be. This\n * is enforced to ensure uploading the texture still finishes in a reasonable amount of time. A\n * 4096 squared image takes up 16MB of GPU memory.\n */\n FORCED_MAX_TEXTURE_SIZE = 4096\n}\n\ninterface ICharAtlasActiveRow {\n x: number;\n y: number;\n height: number;\n}\n\n// Work variables to avoid garbage collection\nlet $glyph = undefined;\n\nexport class TextureAtlas implements ITextureAtlas {\n private _didWarmUp: boolean = false;\n\n private _cacheMap: FourKeyMap<number, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n private _cacheMapCombined: FourKeyMap<string, number, number, number, IRasterizedGlyph> = new FourKeyMap();\n\n // The texture that the atlas is drawn to\n private _pages: AtlasPage[] = [];\n public get pages(): { canvas: HTMLCanvasElement, version: number }[] { return this._pages; }\n\n // The set of atlas pages that can be written to\n private _activePages: AtlasPage[] = [];\n\n private _tmpCanvas: HTMLCanvasElement;\n // A temporary context that glyphs are drawn to before being transfered to the atlas.\n private _tmpCtx: CanvasRenderingContext2D;\n\n private _workBoundingBox: IBoundingBox = { top: 0, left: 0, bottom: 0, right: 0 };\n private _workAttributeData: AttributeData = new AttributeData();\n\n private _textureSize: number = 512;\n\n public static maxAtlasPages: number | undefined;\n public static maxTextureSize: number | undefined;\n\n private readonly _onAddTextureAtlasCanvas = new Emitter<HTMLCanvasElement>();\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = new Emitter<HTMLCanvasElement>();\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n\n constructor(\n private readonly _document: Document,\n private readonly _config: ICharAtlasConfig,\n private readonly _unicodeService: IUnicodeService\n ) {\n this._createNewPage();\n this._tmpCanvas = createCanvas(\n _document,\n this._config.deviceCellWidth * 4 + TMP_CANVAS_GLYPH_PADDING * 2,\n this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 2\n );\n this._tmpCtx = throwIfFalsy(this._tmpCanvas.getContext('2d', {\n alpha: this._config.allowTransparency,\n willReadFrequently: true\n }));\n }\n\n public dispose(): void {\n for (const page of this.pages) {\n page.canvas.remove();\n }\n this._onAddTextureAtlasCanvas.dispose();\n }\n\n public warmUp(): void {\n if (!this._didWarmUp) {\n this._doWarmUp();\n this._didWarmUp = true;\n }\n }\n\n private _doWarmUp(): void {\n // Pre-fill with ASCII 33-126, this is not urgent and done in idle callbacks\n const queue = new IdleTaskQueue();\n for (let i = 33; i < 126; i++) {\n queue.enqueue(() => {\n if (!this._cacheMap.get(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT)) {\n const rasterizedGlyph = this._drawToCache(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT);\n this._cacheMap.set(i, DEFAULT_COLOR, DEFAULT_COLOR, DEFAULT_EXT, rasterizedGlyph);\n }\n });\n }\n }\n\n private _requestClearModel = false;\n public beginFrame(): boolean {\n return this._requestClearModel;\n }\n\n public clearTexture(): void {\n if (this._pages[0].currentRow.x === 0 && this._pages[0].currentRow.y === 0) {\n return;\n }\n for (const page of this._pages) {\n page.clear();\n }\n this._cacheMap.clear();\n this._cacheMapCombined.clear();\n this._didWarmUp = false;\n }\n\n private _createNewPage(): AtlasPage {\n // Try merge the set of the 4 most used pages of the largest size. This is is deferred to a\n // microtask to ensure it does not interrupt textures that will be rendered in the current\n // animation frame which would result in blank rendered areas. This is actually not that\n // expensive relative to drawing the glyphs, so there is no need to wait for an idle callback.\n if (TextureAtlas.maxAtlasPages && this._pages.length >= Math.max(4, TextureAtlas.maxAtlasPages)) {\n // Find the set of the largest 4 images, below the maximum size, with the highest\n // percentages used\n const pagesBySize = this._pages.filter(e => {\n return e.canvas.width * 2 <= (TextureAtlas.maxTextureSize || Constants.FORCED_MAX_TEXTURE_SIZE);\n }).sort((a, b) => {\n if (b.canvas.width !== a.canvas.width) {\n return b.canvas.width - a.canvas.width;\n }\n return b.percentageUsed - a.percentageUsed;\n });\n let sameSizeI = -1;\n let size = 0;\n for (let i = 0; i < pagesBySize.length; i++) {\n if (pagesBySize[i].canvas.width !== size) {\n sameSizeI = i;\n size = pagesBySize[i].canvas.width;\n } else if (i - sameSizeI === 3) {\n break;\n }\n }\n\n // Gather details of the merge\n const mergingPages = pagesBySize.slice(sameSizeI, sameSizeI + 4);\n const sortedMergingPagesIndexes = mergingPages.map(e => e.glyphs[0].texturePage).sort((a, b) => a > b ? 1 : -1);\n const mergedPageIndex = this.pages.length - mergingPages.length;\n\n // Merge into the new page\n const mergedPage = this._mergePages(mergingPages, mergedPageIndex);\n mergedPage.version++;\n\n // Delete the pages, shifting glyph texture pages as needed\n for (let i = sortedMergingPagesIndexes.length - 1; i >= 0; i--) {\n this._deletePage(sortedMergingPagesIndexes[i]);\n }\n\n // Add the new merged page to the end\n this.pages.push(mergedPage);\n\n // Request the model to be cleared to refresh all texture pages.\n this._requestClearModel = true;\n this._onAddTextureAtlasCanvas.fire(mergedPage.canvas);\n }\n\n // All new atlas pages are created small as they are highly dynamic\n const newPage = new AtlasPage(this._document, this._textureSize);\n this._pages.push(newPage);\n this._activePages.push(newPage);\n this._onAddTextureAtlasCanvas.fire(newPage.canvas);\n return newPage;\n }\n\n private _mergePages(mergingPages: AtlasPage[], mergedPageIndex: number): AtlasPage {\n const mergedSize = mergingPages[0].canvas.width * 2;\n const mergedPage = new AtlasPage(this._document, mergedSize, mergingPages);\n for (const [i, p] of mergingPages.entries()) {\n const xOffset = i * p.canvas.width % mergedSize;\n const yOffset = Math.floor(i / 2) * p.canvas.height;\n mergedPage.ctx.drawImage(p.canvas, xOffset, yOffset);\n for (const g of p.glyphs) {\n g.texturePage = mergedPageIndex;\n g.sizeClipSpace.x = g.size.x / mergedSize;\n g.sizeClipSpace.y = g.size.y / mergedSize;\n g.texturePosition.x += xOffset;\n g.texturePosition.y += yOffset;\n g.texturePositionClipSpace.x = g.texturePosition.x / mergedSize;\n g.texturePositionClipSpace.y = g.texturePosition.y / mergedSize;\n }\n\n this._onRemoveTextureAtlasCanvas.fire(p.canvas);\n\n // Remove the merging page from active pages if it was there\n const index = this._activePages.indexOf(p);\n if (index !== -1) {\n this._activePages.splice(index, 1);\n }\n }\n return mergedPage;\n }\n\n private _deletePage(pageIndex: number): void {\n this._pages.splice(pageIndex, 1);\n for (let j = pageIndex; j < this._pages.length; j++) {\n const adjustingPage = this._pages[j];\n for (const g of adjustingPage.glyphs) {\n g.texturePage--;\n }\n adjustingPage.version++;\n }\n }\n\n public getRasterizedGlyphCombinedChar(chars: string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMapCombined, chars, bg, fg, ext, restrictToCellHeight);\n }\n\n public getRasterizedGlyph(code: number, bg: number, fg: number, ext: number, restrictToCellHeight: boolean): IRasterizedGlyph {\n return this._getFromCacheMap(this._cacheMap, code, bg, fg, ext, restrictToCellHeight);\n }\n\n /**\n * Gets the glyphs texture coords, drawing the texture if it's not already\n */\n private _getFromCacheMap(\n cacheMap: FourKeyMap<string | number, number, number, number, IRasterizedGlyph>,\n key: string | number,\n bg: number,\n fg: number,\n ext: number,\n restrictToCellHeight: boolean = false\n ): IRasterizedGlyph {\n $glyph = cacheMap.get(key, bg, fg, ext);\n if (!$glyph) {\n $glyph = this._drawToCache(key, bg, fg, ext, restrictToCellHeight);\n cacheMap.set(key, bg, fg, ext, $glyph);\n }\n return $glyph;\n }\n\n private _getColorFromAnsiIndex(idx: number): IColor {\n if (idx >= this._config.colors.ansi.length) {\n throw new Error('No color found for idx ' + idx);\n }\n return this._config.colors.ansi[idx];\n }\n\n private _getBackgroundColor(bgColorMode: number, bgColor: number, inverse: boolean, dim: boolean): IColor {\n if (this._config.allowTransparency) {\n // The background color might have some transparency, so we need to render it as fully\n // transparent in the atlas. Otherwise we'd end up drawing the transparent background twice\n // around the anti-aliased edges of the glyph, and it would look too dark.\n return NULL_COLOR;\n }\n\n let result: IColor;\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n result = this._getColorFromAnsiIndex(bgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(bgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = color.opaque(this._config.colors.foreground);\n } else {\n result = this._config.colors.background;\n }\n break;\n }\n\n return result;\n }\n\n private _getForegroundColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, dim: boolean, bold: boolean, excludeFromContrastRatioDemands: boolean): IColor {\n const minimumContrastColor = this._getMinimumContrastColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, bold, dim, excludeFromContrastRatioDemands);\n if (minimumContrastColor) {\n return minimumContrastColor;\n }\n\n let result: IColor;\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n result = this._getColorFromAnsiIndex(fgColor);\n break;\n case Attributes.CM_RGB:\n const arr = AttributeData.toColorRGB(fgColor);\n result = channels.toColor(arr[0], arr[1], arr[2]);\n break;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n result = this._config.colors.background;\n } else {\n result = this._config.colors.foreground;\n }\n }\n\n // Always use an opaque color regardless of allowTransparency\n if (this._config.allowTransparency) {\n result = color.opaque(result);\n }\n\n // Apply dim to the color, opacity is fine to use for the foreground color\n if (dim) {\n result = color.multiplyOpacity(result, DIM_OPACITY);\n }\n\n return result;\n }\n\n private _resolveBackgroundRgba(bgColorMode: number, bgColor: number, inverse: boolean): number {\n switch (bgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n return this._getColorFromAnsiIndex(bgColor).rgba;\n case Attributes.CM_RGB:\n return bgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.foreground.rgba;\n }\n return this._config.colors.background.rgba;\n }\n }\n\n private _resolveForegroundRgba(fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean): number {\n switch (fgColorMode) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n if (this._config.drawBoldTextInBrightColors && bold && fgColor < 8) {\n fgColor += 8;\n }\n return this._getColorFromAnsiIndex(fgColor).rgba;\n case Attributes.CM_RGB:\n return fgColor << 8;\n case Attributes.CM_DEFAULT:\n default:\n if (inverse) {\n return this._config.colors.background.rgba;\n }\n return this._config.colors.foreground.rgba;\n }\n }\n\n private _getMinimumContrastColor(bg: number, bgColorMode: number, bgColor: number, fg: number, fgColorMode: number, fgColor: number, inverse: boolean, bold: boolean, dim: boolean, excludeFromContrastRatioDemands: boolean): IColor | undefined {\n if (this._config.minimumContrastRatio === 1 || excludeFromContrastRatioDemands) {\n return undefined;\n }\n\n // Try get from cache first\n const cache = this._getContrastCache(dim);\n const adjustedColor = cache.getColor(bg, fg);\n if (adjustedColor !== undefined) {\n return adjustedColor || undefined;\n }\n\n const bgRgba = this._resolveBackgroundRgba(bgColorMode, bgColor, inverse);\n const fgRgba = this._resolveForegroundRgba(fgColorMode, fgColor, inverse, bold);\n // Dim cells only require half the contrast, otherwise they wouldn't be distinguishable from\n // non-dim cells\n const result = rgba.ensureContrastRatio(bgRgba, fgRgba, this._config.minimumContrastRatio / (dim ? 2 : 1));\n\n if (!result) {\n cache.setColor(bg, fg, null);\n return undefined;\n }\n\n const color = channels.toColor(\n (result >> 24) & 0xFF,\n (result >> 16) & 0xFF,\n (result >> 8) & 0xFF\n );\n cache.setColor(bg, fg, color);\n\n return color;\n }\n\n private _getContrastCache(dim: boolean): IColorContrastCache {\n if (dim) {\n return this._config.colors.halfContrastCache;\n }\n return this._config.colors.contrastCache;\n }\n\n private _drawToCache(codeOrChars: number | string, bg: number, fg: number, ext: number, restrictToCellHeight: boolean = false): IRasterizedGlyph {\n const chars = typeof codeOrChars === 'number' ? String.fromCharCode(codeOrChars) : codeOrChars;\n\n // Uncomment for debugging\n // console.log(`draw to cache \"${chars}\"`, bg, fg, ext);\n\n // Allow 1 cell width per character, with a minimum of 2 (CJK), plus some padding. This is used\n // to draw the glyph to the canvas as well as to restrict the bounding box search to ensure\n // giant ligatures (eg. =====>) don't impact overall performance.\n const allowedWidth = Math.min(this._config.deviceCellWidth * Math.max(chars.length, 2) + TMP_CANVAS_GLYPH_PADDING * 2, this._textureSize);\n if (this._tmpCanvas.width < allowedWidth) {\n this._tmpCanvas.width = allowedWidth;\n }\n // Include line height when drawing glyphs\n const allowedHeight = Math.min(this._config.deviceCellHeight + TMP_CANVAS_GLYPH_PADDING * 4, this._textureSize);\n if (this._tmpCanvas.height < allowedHeight) {\n this._tmpCanvas.height = allowedHeight;\n }\n this._tmpCtx.save();\n\n this._workAttributeData.fg = fg;\n this._workAttributeData.bg = bg;\n this._workAttributeData.extended.ext = ext;\n\n const invisible = !!this._workAttributeData.isInvisible();\n if (invisible) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const bold = !!this._workAttributeData.isBold();\n const inverse = !!this._workAttributeData.isInverse();\n const dim = !!this._workAttributeData.isDim();\n const italic = !!this._workAttributeData.isItalic();\n const underline = !!this._workAttributeData.isUnderline();\n const strikethrough = !!this._workAttributeData.isStrikethrough();\n const overline = !!this._workAttributeData.isOverline();\n let fgColor = this._workAttributeData.getFgColor();\n let fgColorMode = this._workAttributeData.getFgColorMode();\n let bgColor = this._workAttributeData.getBgColor();\n let bgColorMode = this._workAttributeData.getBgColorMode();\n if (inverse) {\n const temp = fgColor;\n fgColor = bgColor;\n bgColor = temp;\n const temp2 = fgColorMode;\n fgColorMode = bgColorMode;\n bgColorMode = temp2;\n }\n\n // draw the background\n const backgroundColor = this._getBackgroundColor(bgColorMode, bgColor, inverse, dim);\n // Use a 'copy' composite operation to clear any existing glyph out of _tmpCtxWithAlpha,\n // regardless of transparency in backgroundColor\n this._tmpCtx.globalCompositeOperation = 'copy';\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.globalCompositeOperation = 'source-over';\n\n // draw the foreground/glyph\n const fontWeight = bold ? this._config.fontWeightBold : this._config.fontWeight;\n const fontStyle = italic ? 'italic' : '';\n this._tmpCtx.font =\n `${fontStyle} ${fontWeight} ${this._config.fontSize * this._config.devicePixelRatio}px ${this._config.fontFamily}`;\n this._tmpCtx.textBaseline = TEXT_BASELINE;\n\n const powerlineGlyph = chars.length === 1 && isPowerlineGlyph(chars.charCodeAt(0));\n const restrictedPowerlineGlyph = chars.length === 1 && isRestrictedPowerlineGlyph(chars.charCodeAt(0));\n const foregroundColor = this._getForegroundColor(bg, bgColorMode, bgColor, fg, fgColorMode, fgColor, inverse, dim, bold, treatGlyphAsBackgroundColor(chars.charCodeAt(0)));\n this._tmpCtx.fillStyle = foregroundColor.css;\n\n // For powerline glyphs left/top padding is excluded (https://github.com/microsoft/vscode/issues/120129)\n const padding = restrictedPowerlineGlyph ? 0 : TMP_CANVAS_GLYPH_PADDING * 2;\n\n // Draw custom characters if applicable\n let customGlyph = false;\n if (this._config.customGlyphs !== false) {\n customGlyph = tryDrawCustomChar(this._tmpCtx, chars, padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight, this._config.fontSize, this._config.devicePixelRatio);\n }\n\n // Whether to clear pixels based on a threshold difference between the glyph color and the\n // background color. This should be disabled when the glyph contains multiple colors such as\n // underline colors to prevent important colors could get cleared.\n let enableClearThresholdCheck = !powerlineGlyph;\n\n let chWidth: number;\n if (typeof codeOrChars === 'number') {\n chWidth = this._unicodeService.wcwidth(codeOrChars);\n } else {\n chWidth = this._unicodeService.getStringCellWidth(codeOrChars);\n }\n\n // Draw underline\n if (underline) {\n this._tmpCtx.save();\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n // When the line width is odd, draw at a 0.5 position\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n\n // Underline color\n if (this._workAttributeData.isUnderlineColorDefault()) {\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n } else if (this._workAttributeData.isUnderlineColorRGB()) {\n enableClearThresholdCheck = false;\n this._tmpCtx.strokeStyle = `rgb(${AttributeData.toColorRGB(this._workAttributeData.getUnderlineColor()).join(',')})`;\n } else {\n enableClearThresholdCheck = false;\n let fg = this._workAttributeData.getUnderlineColor();\n if (this._config.drawBoldTextInBrightColors && this._workAttributeData.isBold() && fg < 8) {\n fg += 8;\n }\n this._tmpCtx.strokeStyle = this._getColorFromAnsiIndex(fg).css;\n }\n\n // Underline style/stroke\n this._tmpCtx.beginPath();\n const xLeft = padding;\n const yTop = Math.ceil(padding + this._config.deviceCharHeight) - yOffset - (restrictToCellHeight ? lineWidth * 2 : 0);\n const yMid = yTop + lineWidth;\n const yBot = yTop + lineWidth * 2;\n let nextOffset = this._workAttributeData.getUnderlineVariantOffset();\n\n for (let i = 0; i < chWidth; i++) {\n this._tmpCtx.save();\n const xChLeft = xLeft + i * this._config.deviceCellWidth;\n const xChRight = xLeft + (i + 1) * this._config.deviceCellWidth;\n const xChMid = xChLeft + this._config.deviceCellWidth / 2;\n switch (this._workAttributeData.extended.underlineStyle) {\n case UnderlineStyle.DOUBLE:\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n this._tmpCtx.moveTo(xChLeft, yBot);\n this._tmpCtx.lineTo(xChRight, yBot);\n break;\n case UnderlineStyle.CURLY:\n // Choose the bezier top and bottom based on the device pixel ratio, the curly line is\n // made taller when the line width is as otherwise it's not very clear otherwise.\n const yCurlyBot = lineWidth <= 1 ? yBot : Math.ceil(padding + this._config.deviceCharHeight - lineWidth / 2) - yOffset;\n const yCurlyTop = lineWidth <= 1 ? yTop : Math.ceil(padding + this._config.deviceCharHeight + lineWidth / 2) - yOffset;\n // Clip the left and right edges of the underline such that it can be drawn just outside\n // the edge of the cell to ensure a continuous stroke when there are multiple underlined\n // glyphs adjacent to one another.\n const clipRegion = new Path2D();\n clipRegion.rect(xChLeft, yTop, this._config.deviceCellWidth, yBot - yTop);\n this._tmpCtx.clip(clipRegion);\n // Start 1/2 cell before and end 1/2 cells after to ensure a smooth curve with other\n // cells\n this._tmpCtx.moveTo(xChLeft - this._config.deviceCellWidth / 2, yMid);\n this._tmpCtx.bezierCurveTo(\n xChLeft - this._config.deviceCellWidth / 2, yCurlyTop,\n xChLeft, yCurlyTop,\n xChLeft, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChLeft, yCurlyBot,\n xChMid, yCurlyBot,\n xChMid, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChMid, yCurlyTop,\n xChRight, yCurlyTop,\n xChRight, yMid\n );\n this._tmpCtx.bezierCurveTo(\n xChRight, yCurlyBot,\n xChRight + this._config.deviceCellWidth / 2, yCurlyBot,\n xChRight + this._config.deviceCellWidth / 2, yMid\n );\n break;\n case UnderlineStyle.DOTTED:\n const offsetWidth = nextOffset === 0 ? 0 :\n (nextOffset >= lineWidth ? lineWidth * 2 - nextOffset : lineWidth - nextOffset);\n // a line and a gap.\n const isLineStart = nextOffset >= lineWidth ? false : true;\n if (isLineStart === false || offsetWidth === 0) {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft + offsetWidth, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n } else {\n this._tmpCtx.setLineDash([Math.round(lineWidth), Math.round(lineWidth)]);\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChLeft + offsetWidth, yTop);\n this._tmpCtx.moveTo(xChLeft + offsetWidth + lineWidth, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n }\n nextOffset = computeNextVariantOffset(xChRight - xChLeft, lineWidth, nextOffset);\n break;\n case UnderlineStyle.DASHED:\n const lineRatio = 0.6;\n const gapRatio = 0.3;\n // End line ratio is approximately equal to 0.1\n const xChWidth = xChRight - xChLeft;\n const line = Math.floor(lineRatio * xChWidth);\n const gap = Math.floor(gapRatio * xChWidth);\n const end = xChWidth - line - gap;\n this._tmpCtx.setLineDash([line, gap, end]);\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n break;\n case UnderlineStyle.SINGLE:\n default:\n this._tmpCtx.moveTo(xChLeft, yTop);\n this._tmpCtx.lineTo(xChRight, yTop);\n break;\n }\n this._tmpCtx.stroke();\n this._tmpCtx.restore();\n }\n this._tmpCtx.restore();\n\n // Draw stroke in the background color for non custom characters in order to give an outline\n // between the text and the underline. Only do this when font size is >= 12 as the underline\n // looks odd when the font size is too small\n if (!customGlyph && this._config.fontSize >= 12) {\n // This only works when transparency is disabled because it's not clear how to clear stroked\n // text\n if (!this._config.allowTransparency && chars !== ' ') {\n // Measure the text, only draw the stroke if there is a descent beyond an alphabetic text\n // baseline\n this._tmpCtx.save();\n this._tmpCtx.textBaseline = 'alphabetic';\n const metrics = this._tmpCtx.measureText(chars);\n this._tmpCtx.restore();\n if ('actualBoundingBoxDescent' in metrics && metrics.actualBoundingBoxDescent > 0) {\n // This translates to 1/2 the line width in either direction\n this._tmpCtx.save();\n // Clip the region to only draw in valid pixels near the underline to avoid a slight\n // outline around the whole glyph, as well as additional pixels in the glyph at the top\n // which would increase GPU memory demands\n const clipRegion = new Path2D();\n clipRegion.rect(xLeft, yTop - Math.ceil(lineWidth / 2), this._config.deviceCellWidth * chWidth, yBot - yTop + Math.ceil(lineWidth / 2));\n this._tmpCtx.clip(clipRegion);\n this._tmpCtx.lineWidth = this._config.devicePixelRatio * 3;\n this._tmpCtx.strokeStyle = backgroundColor.css;\n this._tmpCtx.strokeText(chars, padding, padding + this._config.deviceCharHeight);\n this._tmpCtx.restore();\n }\n }\n }\n }\n\n // Overline\n if (overline) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 15));\n const yOffset = lineWidth % 2 === 1 ? 0.5 : 0;\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + yOffset);\n this._tmpCtx.stroke();\n }\n\n // Draw the character\n if (!customGlyph) {\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight);\n }\n\n // If this character is underscore and beyond the cell bounds, shift it up until it is visible\n // even on the bottom row, try for a maximum of 5 pixels.\n if (chars === '_' && !this._config.allowTransparency) {\n let isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (isBeyondCellBounds) {\n for (let offset = 1; offset <= 5; offset++) {\n this._tmpCtx.save();\n this._tmpCtx.fillStyle = backgroundColor.css;\n this._tmpCtx.fillRect(0, 0, this._tmpCanvas.width, this._tmpCanvas.height);\n this._tmpCtx.restore();\n this._tmpCtx.fillText(chars, padding, padding + this._config.deviceCharHeight - offset);\n isBeyondCellBounds = clearColor(this._tmpCtx.getImageData(padding, padding, this._config.deviceCellWidth, this._config.deviceCellHeight), backgroundColor, foregroundColor, enableClearThresholdCheck);\n if (!isBeyondCellBounds) {\n break;\n }\n }\n }\n }\n\n // Draw strokethrough\n if (strikethrough) {\n const lineWidth = Math.max(1, Math.floor(this._config.fontSize * this._config.devicePixelRatio / 10));\n const yOffset = this._tmpCtx.lineWidth % 2 === 1 ? 0.5 : 0; // When the width is odd, draw at 0.5 position\n this._tmpCtx.lineWidth = lineWidth;\n this._tmpCtx.strokeStyle = this._tmpCtx.fillStyle;\n this._tmpCtx.beginPath();\n this._tmpCtx.moveTo(padding, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.lineTo(padding + this._config.deviceCharWidth * chWidth, padding + Math.floor(this._config.deviceCharHeight / 2) - yOffset);\n this._tmpCtx.stroke();\n }\n\n this._tmpCtx.restore();\n\n // clear the background from the character to avoid issues with drawing over the previous\n // character if it extends past it's bounds\n const imageData = this._tmpCtx.getImageData(\n 0, 0, this._tmpCanvas.width, this._tmpCanvas.height\n );\n\n // Clear out the background color and determine if the glyph is empty.\n let isEmpty: boolean;\n if (!this._config.allowTransparency) {\n isEmpty = clearColor(imageData, backgroundColor, foregroundColor, enableClearThresholdCheck);\n } else {\n isEmpty = checkCompletelyTransparent(imageData);\n }\n\n // Handle empty glyphs\n if (isEmpty) {\n return NULL_RASTERIZED_GLYPH;\n }\n\n const rasterizedGlyph = this._findGlyphBoundingBox(imageData, this._workBoundingBox, allowedWidth, restrictedPowerlineGlyph, customGlyph, padding);\n\n // Find the best atlas row to use\n let activePage: AtlasPage;\n let activeRow: ICharAtlasActiveRow;\n while (true) {\n // If there are no active pages (the last smallest 4 were merged), create a new one\n if (this._activePages.length === 0) {\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n break;\n }\n\n // Get the best current row from all active pages\n activePage = this._activePages[this._activePages.length - 1];\n activeRow = activePage.currentRow;\n for (const p of this._activePages) {\n if (rasterizedGlyph.size.y <= p.currentRow.height) {\n activePage = p;\n activeRow = p.currentRow;\n }\n }\n\n // TODO: This algorithm could be simplified:\n // - Search for the page with ROW_PIXEL_THRESHOLD in mind\n // - Keep track of current/fixed rows in a Map\n\n // Replace the best current row with a fixed row if there is one at least as good as the\n // current row. Search in reverse to prioritize filling in older pages.\n for (let i = this._activePages.length - 1; i >= 0; i--) {\n for (const row of this._activePages[i].fixedRows) {\n if (row.height <= activeRow.height && rasterizedGlyph.size.y <= row.height) {\n activePage = this._activePages[i];\n activeRow = row;\n }\n }\n }\n\n // Create a new page if too much vertical space would be wasted or there is not enough room\n // left in the page. The previous active row will become fixed in the process as it now has a\n // fixed height\n if (activeRow.y + rasterizedGlyph.size.y >= activePage.canvas.height || activeRow.height > rasterizedGlyph.size.y + Constants.ROW_PIXEL_THRESHOLD) {\n // Create the new fixed height row, creating a new page if there isn't enough room on the\n // current page\n let wasPageAndRowFound = false;\n if (activePage.currentRow.y + activePage.currentRow.height + rasterizedGlyph.size.y >= activePage.canvas.height) {\n // Find the first page with room to create the new row on\n let candidatePage: AtlasPage | undefined;\n for (const p of this._activePages) {\n if (p.currentRow.y + p.currentRow.height + rasterizedGlyph.size.y < p.canvas.height) {\n candidatePage = p;\n break;\n }\n }\n if (candidatePage) {\n activePage = candidatePage;\n } else {\n // Before creating a new atlas page that would trigger a page merge, check if the\n // current active row is sufficient when ignoring the ROW_PIXEL_THRESHOLD. This will\n // improve texture utilization by using the available space before the page is merged\n // and becomes static.\n if (\n TextureAtlas.maxAtlasPages &&\n this._pages.length >= TextureAtlas.maxAtlasPages &&\n activeRow.y + rasterizedGlyph.size.y <= activePage.canvas.height &&\n activeRow.height >= rasterizedGlyph.size.y &&\n activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width\n ) {\n // activePage and activeRow is already valid\n wasPageAndRowFound = true;\n } else {\n // Create a new page if there is no room\n const newPage = this._createNewPage();\n activePage = newPage;\n activeRow = newPage.currentRow;\n activeRow.height = rasterizedGlyph.size.y;\n wasPageAndRowFound = true;\n }\n }\n }\n if (!wasPageAndRowFound) {\n // Fix the current row as the new row is being added below\n if (activePage.currentRow.height > 0) {\n activePage.fixedRows.push(activePage.currentRow);\n }\n activeRow = {\n x: 0,\n y: activePage.currentRow.y + activePage.currentRow.height,\n height: rasterizedGlyph.size.y\n };\n activePage.fixedRows.push(activeRow);\n\n // Create the new current row below the new fixed height row\n activePage.currentRow = {\n x: 0,\n y: activeRow.y + activeRow.height,\n height: 0\n };\n }\n // TODO: Remove pages from _activePages when all rows are filled\n }\n\n // Exit the loop if there is enough room in the row\n if (activeRow.x + rasterizedGlyph.size.x <= activePage.canvas.width) {\n break;\n }\n\n // If there is not enough room in the current row, finish it and try again\n if (activeRow === activePage.currentRow) {\n activeRow.x = 0;\n activeRow.y += activeRow.height;\n activeRow.height = 0;\n } else {\n activePage.fixedRows.splice(activePage.fixedRows.indexOf(activeRow), 1);\n }\n }\n\n // Record texture position\n rasterizedGlyph.texturePage = this._pages.indexOf(activePage);\n rasterizedGlyph.texturePosition.x = activeRow.x;\n rasterizedGlyph.texturePosition.y = activeRow.y;\n rasterizedGlyph.texturePositionClipSpace.x = activeRow.x / activePage.canvas.width;\n rasterizedGlyph.texturePositionClipSpace.y = activeRow.y / activePage.canvas.height;\n\n // Fix the clipspace position as pages may be of differing size\n rasterizedGlyph.sizeClipSpace.x /= activePage.canvas.width;\n rasterizedGlyph.sizeClipSpace.y /= activePage.canvas.height;\n\n // Update atlas current row, for fixed rows the glyph height will never be larger than the row\n // height\n activeRow.height = Math.max(activeRow.height, rasterizedGlyph.size.y);\n activeRow.x += rasterizedGlyph.size.x;\n\n // putImageData doesn't do any blending, so it will overwrite any existing cache entry for us\n activePage.ctx.putImageData(\n imageData,\n rasterizedGlyph.texturePosition.x - this._workBoundingBox.left,\n rasterizedGlyph.texturePosition.y - this._workBoundingBox.top,\n this._workBoundingBox.left,\n this._workBoundingBox.top,\n rasterizedGlyph.size.x,\n rasterizedGlyph.size.y\n );\n activePage.addGlyph(rasterizedGlyph);\n activePage.version++;\n\n return rasterizedGlyph;\n }\n\n /**\n * Given an ImageData object, find the bounding box of the non-transparent\n * portion of the texture and return an IRasterizedGlyph with these\n * dimensions.\n * @param imageData The image data to read.\n * @param boundingBox An IBoundingBox to put the clipped bounding box values.\n */\n private _findGlyphBoundingBox(imageData: ImageData, boundingBox: IBoundingBox, allowedWidth: number, restrictedGlyph: boolean, customGlyph: boolean, padding: number): IRasterizedGlyph {\n boundingBox.top = 0;\n const height = restrictedGlyph ? this._config.deviceCellHeight : this._tmpCanvas.height;\n const width = restrictedGlyph ? this._config.deviceCellWidth : allowedWidth;\n let found = false;\n for (let y = 0; y < height; y++) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.top = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.left = 0;\n found = false;\n for (let x = 0; x < padding + width; x++) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.left = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.right = width;\n found = false;\n for (let x = padding + width - 1; x >= padding; x--) {\n for (let y = 0; y < height; y++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.right = x;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n boundingBox.bottom = height;\n found = false;\n for (let y = height - 1; y >= 0; y--) {\n for (let x = 0; x < width; x++) {\n const alphaOffset = y * this._tmpCanvas.width * 4 + x * 4 + 3;\n if (imageData.data[alphaOffset] !== 0) {\n boundingBox.bottom = y;\n found = true;\n break;\n }\n }\n if (found) {\n break;\n }\n }\n return {\n texturePage: 0,\n texturePosition: { x: 0, y: 0 },\n texturePositionClipSpace: { x: 0, y: 0 },\n size: {\n x: boundingBox.right - boundingBox.left + 1,\n y: boundingBox.bottom - boundingBox.top + 1\n },\n sizeClipSpace: {\n x: (boundingBox.right - boundingBox.left + 1),\n y: (boundingBox.bottom - boundingBox.top + 1)\n },\n offset: {\n x: -boundingBox.left + padding + ((restrictedGlyph || customGlyph) ? Math.floor((this._config.deviceCellWidth - this._config.deviceCharWidth) / 2) : 0),\n y: -boundingBox.top + padding + ((restrictedGlyph || customGlyph) ? this._config.lineHeight === 1 ? 0 : Math.round((this._config.deviceCellHeight - this._config.deviceCharHeight) / 2) : 0)\n }\n };\n }\n}\n\nclass AtlasPage {\n public readonly canvas: HTMLCanvasElement;\n public readonly ctx: CanvasRenderingContext2D;\n\n private _usedPixels: number = 0;\n public get percentageUsed(): number { return this._usedPixels / (this.canvas.width * this.canvas.height); }\n\n private readonly _glyphs: IRasterizedGlyph[] = [];\n public get glyphs(): ReadonlyArray<IRasterizedGlyph> { return this._glyphs; }\n public addGlyph(glyph: IRasterizedGlyph): void {\n this._glyphs.push(glyph);\n this._usedPixels += glyph.size.x * glyph.size.y;\n }\n\n /**\n * Used to check whether the canvas of the atlas page has changed.\n */\n public version = 0;\n\n // Texture atlas current positioning data. The texture packing strategy used is to fill from\n // left-to-right and top-to-bottom. When the glyph being written is less than half of the current\n // row's height, the following happens:\n //\n // - The current row becomes the fixed height row A\n // - A new fixed height row B the exact size of the glyph is created below the current row\n // - A new dynamic height current row is created below B\n //\n // This strategy does a good job preventing space being wasted for very short glyphs such as\n // underscores, hyphens etc. or those with underlines rendered.\n public currentRow: ICharAtlasActiveRow = {\n x: 0,\n y: 0,\n height: 0\n };\n public readonly fixedRows: ICharAtlasActiveRow[] = [];\n\n constructor(\n document: Document,\n size: number,\n sourcePages?: AtlasPage[]\n ) {\n if (sourcePages) {\n for (const p of sourcePages) {\n this._glyphs.push(...p.glyphs);\n this._usedPixels += p._usedPixels;\n }\n }\n this.canvas = createCanvas(document, size, size);\n // The canvas needs alpha because we use clearColor to convert the background color to alpha.\n // It might also contain some characters with transparent backgrounds if allowTransparency is\n // set.\n this.ctx = throwIfFalsy(this.canvas.getContext('2d', { alpha: true }));\n }\n\n public clear(): void {\n this.ctx.clearRect(0, 0, this.canvas.width, this.canvas.height);\n this.currentRow.x = 0;\n this.currentRow.y = 0;\n this.currentRow.height = 0;\n this.fixedRows.length = 0;\n this.version++;\n }\n}\n\n/**\n * Makes a particular rgb color and colors that are nearly the same in an ImageData completely\n * transparent.\n * @returns True if the result is \"empty\", meaning all pixels are fully transparent.\n */\nfunction clearColor(imageData: ImageData, bg: IColor, fg: IColor, enableThresholdCheck: boolean): boolean {\n // Get color channels\n const r = bg.rgba >>> 24;\n const g = bg.rgba >>> 16 & 0xFF;\n const b = bg.rgba >>> 8 & 0xFF;\n const fgR = fg.rgba >>> 24;\n const fgG = fg.rgba >>> 16 & 0xFF;\n const fgB = fg.rgba >>> 8 & 0xFF;\n\n // Calculate a threshold that when below a color will be treated as transpart when the sum of\n // channel value differs. This helps improve rendering when glyphs overlap with others. This\n // threshold is calculated relative to the difference between the background and foreground to\n // ensure important details of the glyph are always shown, even when the contrast ratio is low.\n // The number 12 is largely arbitrary to ensure the pixels that escape the cell in the test case\n // were covered (fg=#8ae234, bg=#c4a000).\n const threshold = Math.floor((Math.abs(r - fgR) + Math.abs(g - fgG) + Math.abs(b - fgB)) / 12);\n\n // Set alpha channel of relevent pixels to 0\n let isEmpty = true;\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n // Check exact match\n if (imageData.data[offset] === r &&\n imageData.data[offset + 1] === g &&\n imageData.data[offset + 2] === b) {\n imageData.data[offset + 3] = 0;\n } else {\n // Check the threshold based difference\n if (enableThresholdCheck &&\n (Math.abs(imageData.data[offset] - r) +\n Math.abs(imageData.data[offset + 1] - g) +\n Math.abs(imageData.data[offset + 2] - b)) < threshold) {\n imageData.data[offset + 3] = 0;\n } else {\n isEmpty = false;\n }\n }\n }\n\n return isEmpty;\n}\n\nfunction checkCompletelyTransparent(imageData: ImageData): boolean {\n for (let offset = 0; offset < imageData.data.length; offset += 4) {\n if (imageData.data[offset + 3] > 0) {\n return false;\n }\n }\n return true;\n}\n\nfunction createCanvas(document: Document, width: number, height: number): HTMLCanvasElement {\n const canvas = document.createElement('canvas');\n canvas.width = width;\n canvas.height = height;\n return canvas;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICharAtlasConfig } from './Types';\nimport { Attributes } from 'common/buffer/Constants';\nimport { ITerminalOptions } from '@xterm/xterm';\nimport { IColorSet, ReadonlyColorSet } from 'browser/Types';\nimport { NULL_COLOR } from 'common/Color';\n\nexport function generateConfig(deviceCellWidth: number, deviceCellHeight: number, deviceCharWidth: number, deviceCharHeight: number, options: Required<ITerminalOptions>, colors: ReadonlyColorSet, devicePixelRatio: number): ICharAtlasConfig {\n // null out some fields that don't matter\n const clonedColors: IColorSet = {\n foreground: colors.foreground,\n background: colors.background,\n cursor: NULL_COLOR,\n cursorAccent: NULL_COLOR,\n selectionForeground: NULL_COLOR,\n selectionBackgroundTransparent: NULL_COLOR,\n selectionBackgroundOpaque: NULL_COLOR,\n selectionInactiveBackgroundTransparent: NULL_COLOR,\n selectionInactiveBackgroundOpaque: NULL_COLOR,\n overviewRulerBorder: NULL_COLOR,\n scrollbarSliderBackground: NULL_COLOR,\n scrollbarSliderHoverBackground: NULL_COLOR,\n scrollbarSliderActiveBackground: NULL_COLOR,\n // For the static char atlas, we only use the first 16 colors, but we need all 256 for the\n // dynamic character atlas.\n ansi: colors.ansi.slice(),\n contrastCache: colors.contrastCache,\n halfContrastCache: colors.halfContrastCache\n };\n return {\n customGlyphs: options.customGlyphs,\n devicePixelRatio,\n letterSpacing: options.letterSpacing,\n lineHeight: options.lineHeight,\n deviceCellWidth: deviceCellWidth,\n deviceCellHeight: deviceCellHeight,\n deviceCharWidth: deviceCharWidth,\n deviceCharHeight: deviceCharHeight,\n fontFamily: options.fontFamily,\n fontSize: options.fontSize,\n fontWeight: options.fontWeight,\n fontWeightBold: options.fontWeightBold,\n allowTransparency: options.allowTransparency,\n drawBoldTextInBrightColors: options.drawBoldTextInBrightColors,\n minimumContrastRatio: options.minimumContrastRatio,\n colors: clonedColors\n };\n}\n\nexport function configEquals(a: ICharAtlasConfig, b: ICharAtlasConfig): boolean {\n for (let i = 0; i < a.colors.ansi.length; i++) {\n if (a.colors.ansi[i].rgba !== b.colors.ansi[i].rgba) {\n return false;\n }\n }\n return a.devicePixelRatio === b.devicePixelRatio &&\n a.customGlyphs === b.customGlyphs &&\n a.lineHeight === b.lineHeight &&\n a.letterSpacing === b.letterSpacing &&\n a.fontFamily === b.fontFamily &&\n a.fontSize === b.fontSize &&\n a.fontWeight === b.fontWeight &&\n a.fontWeightBold === b.fontWeightBold &&\n a.allowTransparency === b.allowTransparency &&\n a.deviceCharWidth === b.deviceCharWidth &&\n a.deviceCharHeight === b.deviceCharHeight &&\n a.drawBoldTextInBrightColors === b.drawBoldTextInBrightColors &&\n a.minimumContrastRatio === b.minimumContrastRatio &&\n a.colors.foreground.rgba === b.colors.foreground.rgba &&\n a.colors.background.rgba === b.colors.background.rgba;\n}\n\nexport function is256Color(colorCode: number): boolean {\n return (colorCode & Attributes.CM_MASK) === Attributes.CM_P16 || (colorCode & Attributes.CM_MASK) === Attributes.CM_P256;\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { ITerminalOptions, Terminal } from '@xterm/xterm';\nimport { ITerminal, ReadonlyColorSet } from 'browser/Types';\nimport { ICharAtlasConfig, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { generateConfig, configEquals } from 'browser/renderer/shared/CharAtlasUtils';\n\ninterface ITextureAtlasCacheEntry {\n atlas: ITextureAtlas;\n config: ICharAtlasConfig;\n // N.B. This implementation potentially holds onto copies of the terminal forever, so\n // this may cause memory leaks.\n ownedBy: Terminal[];\n}\n\nconst charAtlasCache: ITextureAtlasCacheEntry[] = [];\n\n/**\n * Acquires a char atlas, either generating a new one or returning an existing\n * one that is in use by another terminal.\n */\nexport function acquireTextureAtlas(\n terminal: Terminal,\n options: Required<ITerminalOptions>,\n colors: ReadonlyColorSet,\n deviceCellWidth: number,\n deviceCellHeight: number,\n deviceCharWidth: number,\n deviceCharHeight: number,\n devicePixelRatio: number\n): ITextureAtlas {\n const newConfig = generateConfig(deviceCellWidth, deviceCellHeight, deviceCharWidth, deviceCharHeight, options, colors, devicePixelRatio);\n\n // Check to see if the terminal already owns this config\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n const ownedByIndex = entry.ownedBy.indexOf(terminal);\n if (ownedByIndex >= 0) {\n if (configEquals(entry.config, newConfig)) {\n return entry.atlas;\n }\n // The configs differ, release the terminal from the entry\n if (entry.ownedBy.length === 1) {\n entry.atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n entry.ownedBy.splice(ownedByIndex, 1);\n }\n break;\n }\n }\n\n // Try match a char atlas from the cache\n for (let i = 0; i < charAtlasCache.length; i++) {\n const entry = charAtlasCache[i];\n if (configEquals(entry.config, newConfig)) {\n // Add the terminal to the cache entry and return\n entry.ownedBy.push(terminal);\n return entry.atlas;\n }\n }\n\n const core: ITerminal = (terminal as any)._core;\n const newEntry: ITextureAtlasCacheEntry = {\n atlas: new TextureAtlas(document, newConfig, core.unicodeService),\n config: newConfig,\n ownedBy: [terminal]\n };\n charAtlasCache.push(newEntry);\n return newEntry.atlas;\n}\n\n/**\n * Removes a terminal reference from the cache, allowing its memory to be freed.\n * @param terminal The terminal to remove.\n */\nexport function removeTerminalFromCache(terminal: Terminal): void {\n for (let i = 0; i < charAtlasCache.length; i++) {\n const index = charAtlasCache[i].ownedBy.indexOf(terminal);\n if (index !== -1) {\n if (charAtlasCache[i].ownedBy.length === 1) {\n // Remove the cache entry if it's the only terminal\n charAtlasCache[i].atlas.dispose();\n charAtlasCache.splice(i, 1);\n } else {\n // Remove the reference from the cache entry\n charAtlasCache[i].ownedBy.splice(index, 1);\n }\n break;\n }\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICoreBrowserService } from 'browser/services/Services';\n\n/**\n * The time between cursor blinks.\n */\nconst BLINK_INTERVAL = 600;\n\nexport class CursorBlinkStateManager {\n public isCursorVisible: boolean;\n\n private _animationFrame: number | undefined;\n private _blinkStartTimeout: number | undefined;\n private _blinkInterval: number | undefined;\n\n /**\n * The time at which the animation frame was restarted, this is used on the\n * next render to restart the timers so they don't need to restart the timers\n * multiple times over a short period.\n */\n private _animationTimeRestarted: number | undefined;\n\n constructor(\n private _renderCallback: () => void,\n private _coreBrowserService: ICoreBrowserService\n ) {\n this.isCursorVisible = true;\n if (this._coreBrowserService.isFocused) {\n this._restartInterval();\n }\n }\n\n public get isPaused(): boolean { return !(this._blinkStartTimeout || this._blinkInterval); }\n\n public dispose(): void {\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public restartBlinkAnimation(): void {\n if (this.isPaused) {\n return;\n }\n // Save a timestamp so that the restart can be done on the next interval\n this._animationTimeRestarted = Date.now();\n // Force a cursor render to ensure it's visible and in the correct position\n this.isCursorVisible = true;\n if (!this._animationFrame) {\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }\n }\n\n private _restartInterval(timeToStart: number = BLINK_INTERVAL): void {\n // Clear any existing interval\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n\n // Setup the initial timeout which will hide the cursor, this is done before\n // the regular interval is setup in order to support restarting the blink\n // animation in a lightweight way (without thrashing clearInterval and\n // setInterval).\n this._blinkStartTimeout = this._coreBrowserService.window.setTimeout(() => {\n // Check if another animation restart was requested while this was being\n // started\n if (this._animationTimeRestarted) {\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n if (time > 0) {\n this._restartInterval(time);\n return;\n }\n }\n\n // Hide the cursor\n this.isCursorVisible = false;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n\n // Setup the blink interval\n this._blinkInterval = this._coreBrowserService.window.setInterval(() => {\n // Adjust the animation time if it was restarted\n if (this._animationTimeRestarted) {\n // calc time diff\n // Make restart interval do a setTimeout initially?\n const time = BLINK_INTERVAL - (Date.now() - this._animationTimeRestarted);\n this._animationTimeRestarted = undefined;\n this._restartInterval(time);\n return;\n }\n\n // Invert visibility and render\n this.isCursorVisible = !this.isCursorVisible;\n this._animationFrame = this._coreBrowserService.window.requestAnimationFrame(() => {\n this._renderCallback();\n this._animationFrame = undefined;\n });\n }, BLINK_INTERVAL);\n }, timeToStart);\n }\n\n public pause(): void {\n this.isCursorVisible = true;\n if (this._blinkInterval) {\n this._coreBrowserService.window.clearInterval(this._blinkInterval);\n this._blinkInterval = undefined;\n }\n if (this._blinkStartTimeout) {\n this._coreBrowserService.window.clearTimeout(this._blinkStartTimeout);\n this._blinkStartTimeout = undefined;\n }\n if (this._animationFrame) {\n this._coreBrowserService.window.cancelAnimationFrame(this._animationFrame);\n this._animationFrame = undefined;\n }\n }\n\n public resume(): void {\n // Clear out any existing timers just in case\n this.pause();\n\n this._animationTimeRestarted = undefined;\n this._restartInterval();\n this.restartBlinkAnimation();\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { toDisposable } from 'common/Lifecycle';\nimport { IDisposable } from 'common/Types';\n\nexport function observeDevicePixelDimensions(element: HTMLElement, parentWindow: Window & typeof globalThis, callback: (deviceWidth: number, deviceHeight: number) => void): IDisposable {\n // Observe any resizes to the element and extract the actual pixel size of the element if the\n // devicePixelContentBoxSize API is supported. This allows correcting rounding errors when\n // converting between CSS pixels and device pixels which causes blurry rendering when device\n // pixel ratio is not a round number.\n let observer: ResizeObserver | undefined = new parentWindow.ResizeObserver((entries) => {\n const entry = entries.find((entry) => entry.target === element);\n if (!entry) {\n return;\n }\n\n // Disconnect if devicePixelContentBoxSize isn't supported by the browser\n if (!('devicePixelContentBoxSize' in entry)) {\n observer?.disconnect();\n observer = undefined;\n return;\n }\n\n // Fire the callback, ignore events where the dimensions are 0x0 as the canvas is likely hidden\n const width = entry.devicePixelContentBoxSize[0].inlineSize;\n const height = entry.devicePixelContentBoxSize[0].blockSize;\n if (width > 0 && height > 0) {\n callback(width, height);\n }\n });\n try {\n observer.observe(element, { box: ['device-pixel-content-box'] } as any);\n } catch {\n observer.disconnect();\n observer = undefined;\n }\n return toDisposable(() => observer?.disconnect());\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\n/**\n * Polyfill - Convert UTF32 codepoint into JS string.\n * Note: The built-in String.fromCodePoint happens to be much slower\n * due to additional sanity checks. We can avoid them since\n * we always operate on legal UTF32 (granted by the input decoders)\n * and use this faster version instead.\n */\nexport function stringFromCodePoint(codePoint: number): string {\n if (codePoint > 0xFFFF) {\n codePoint -= 0x10000;\n return String.fromCharCode((codePoint >> 10) + 0xD800) + String.fromCharCode((codePoint % 0x400) + 0xDC00);\n }\n return String.fromCharCode(codePoint);\n}\n\n/**\n * Convert UTF32 char codes into JS string.\n * Basically the same as `stringFromCodePoint` but for multiple codepoints\n * in a loop (which is a lot faster).\n */\nexport function utf32ToString(data: Uint32Array, start: number = 0, end: number = data.length): string {\n let result = '';\n for (let i = start; i < end; ++i) {\n let codepoint = data[i];\n if (codepoint > 0xFFFF) {\n // JS strings are encoded as UTF16, thus a non BMP codepoint gets converted into a surrogate\n // pair conversion rules:\n // - subtract 0x10000 from code point, leaving a 20 bit number\n // - add high 10 bits to 0xD800 --> first surrogate\n // - add low 10 bits to 0xDC00 --> second surrogate\n codepoint -= 0x10000;\n result += String.fromCharCode((codepoint >> 10) + 0xD800) + String.fromCharCode((codepoint % 0x400) + 0xDC00);\n } else {\n result += String.fromCharCode(codepoint);\n }\n }\n return result;\n}\n\n/**\n * StringToUtf32 - decodes UTF16 sequences into UTF32 codepoints.\n * To keep the decoder in line with JS strings it handles single surrogates as UCS2.\n */\nexport class StringToUtf32 {\n private _interim: number = 0;\n\n /**\n * Clears interim and resets decoder to clean state.\n */\n public clear(): void {\n this._interim = 0;\n }\n\n /**\n * Decode JS string to UTF32 codepoints.\n * The methods assumes stream input and will store partly transmitted\n * surrogate pairs and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided input data does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: string, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let startPos = 0;\n\n // handle leftover surrogate high\n if (this._interim) {\n const second = input.charCodeAt(startPos++);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (this._interim - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = this._interim;\n target[size++] = second;\n }\n this._interim = 0;\n }\n\n for (let i = startPos; i < length; ++i) {\n const code = input.charCodeAt(i);\n // surrogate pair first\n if (0xD800 <= code && code <= 0xDBFF) {\n if (++i >= length) {\n this._interim = code;\n return size;\n }\n const second = input.charCodeAt(i);\n if (0xDC00 <= second && second <= 0xDFFF) {\n target[size++] = (code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000;\n } else {\n // illegal codepoint (USC2 handling)\n target[size++] = code;\n target[size++] = second;\n }\n continue;\n }\n if (code === 0xFEFF) {\n // BOM\n continue;\n }\n target[size++] = code;\n }\n return size;\n }\n}\n\n/**\n * Utf8Decoder - decodes UTF8 byte sequences into UTF32 codepoints.\n */\nexport class Utf8ToUtf32 {\n public interim: Uint8Array = new Uint8Array(3);\n\n /**\n * Clears interim bytes and resets decoder to clean state.\n */\n public clear(): void {\n this.interim.fill(0);\n }\n\n /**\n * Decodes UTF8 byte sequences in `input` to UTF32 codepoints in `target`.\n * The methods assumes stream input and will store partly transmitted bytes\n * and decode them with the next data chunk.\n * Note: The method does no bound checks for target, therefore make sure\n * the provided data chunk does not exceed the size of `target`.\n * Returns the number of written codepoints in `target`.\n */\n public decode(input: Uint8Array, target: Uint32Array): number {\n const length = input.length;\n\n if (!length) {\n return 0;\n }\n\n let size = 0;\n let byte1: number;\n let byte2: number;\n let byte3: number;\n let byte4: number;\n let codepoint = 0;\n let startPos = 0;\n\n // handle leftover bytes\n if (this.interim[0]) {\n let discardInterim = false;\n let cp = this.interim[0];\n cp &= ((((cp & 0xE0) === 0xC0)) ? 0x1F : (((cp & 0xF0) === 0xE0)) ? 0x0F : 0x07);\n let pos = 0;\n let tmp: number;\n while ((tmp = this.interim[++pos] & 0x3F) && pos < 4) {\n cp <<= 6;\n cp |= tmp;\n }\n // missing bytes - read ahead from input\n const type = (((this.interim[0] & 0xE0) === 0xC0)) ? 2 : (((this.interim[0] & 0xF0) === 0xE0)) ? 3 : 4;\n const missing = type - pos;\n while (startPos < missing) {\n if (startPos >= length) {\n return 0;\n }\n tmp = input[startPos++];\n if ((tmp & 0xC0) !== 0x80) {\n // wrong continuation, discard interim bytes completely\n startPos--;\n discardInterim = true;\n break;\n } else {\n // need to save so we can continue short inputs in next call\n this.interim[pos++] = tmp;\n cp <<= 6;\n cp |= tmp & 0x3F;\n }\n }\n if (!discardInterim) {\n // final test is type dependent\n if (type === 2) {\n if (cp < 0x80) {\n // wrong starter byte\n startPos--;\n } else {\n target[size++] = cp;\n }\n } else if (type === 3) {\n if (cp < 0x0800 || (cp >= 0xD800 && cp <= 0xDFFF) || cp === 0xFEFF) {\n // illegal codepoint or BOM\n } else {\n target[size++] = cp;\n }\n } else {\n if (cp < 0x010000 || cp > 0x10FFFF) {\n // illegal codepoint\n } else {\n target[size++] = cp;\n }\n }\n }\n this.interim.fill(0);\n }\n\n // loop through input\n const fourStop = length - 4;\n let i = startPos;\n while (i < length) {\n /**\n * ASCII shortcut with loop unrolled to 4 consecutive ASCII chars.\n * This is a compromise between speed gain for ASCII\n * and penalty for non ASCII:\n * For best ASCII performance the char should be stored directly into target,\n * but even a single attempt to write to target and compare afterwards\n * penalizes non ASCII really bad (-50%), thus we load the char into byteX first,\n * which reduces ASCII performance by ~15%.\n * This trial for ASCII reduces non ASCII performance by ~10% which seems acceptible\n * compared to the gains.\n * Note that this optimization only takes place for 4 consecutive ASCII chars,\n * for any shorter it bails out. Worst case - all 4 bytes being read but\n * thrown away due to the last being a non ASCII char (-10% performance).\n */\n while (i < fourStop\n && !((byte1 = input[i]) & 0x80)\n && !((byte2 = input[i + 1]) & 0x80)\n && !((byte3 = input[i + 2]) & 0x80)\n && !((byte4 = input[i + 3]) & 0x80))\n {\n target[size++] = byte1;\n target[size++] = byte2;\n target[size++] = byte3;\n target[size++] = byte4;\n i += 4;\n }\n\n // reread byte1\n byte1 = input[i++];\n\n // 1 byte\n if (byte1 < 0x80) {\n target[size++] = byte1;\n\n // 2 bytes\n } else if ((byte1 & 0xE0) === 0xC0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x1F) << 6 | (byte2 & 0x3F);\n if (codepoint < 0x80) {\n // wrong starter byte\n i--;\n continue;\n }\n target[size++] = codepoint;\n\n // 3 bytes\n } else if ((byte1 & 0xF0) === 0xE0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x0F) << 12 | (byte2 & 0x3F) << 6 | (byte3 & 0x3F);\n if (codepoint < 0x0800 || (codepoint >= 0xD800 && codepoint <= 0xDFFF) || codepoint === 0xFEFF) {\n // illegal codepoint or BOM, no i-- here\n continue;\n }\n target[size++] = codepoint;\n\n // 4 bytes\n } else if ((byte1 & 0xF8) === 0xF0) {\n if (i >= length) {\n this.interim[0] = byte1;\n return size;\n }\n byte2 = input[i++];\n if ((byte2 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n return size;\n }\n byte3 = input[i++];\n if ((byte3 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n if (i >= length) {\n this.interim[0] = byte1;\n this.interim[1] = byte2;\n this.interim[2] = byte3;\n return size;\n }\n byte4 = input[i++];\n if ((byte4 & 0xC0) !== 0x80) {\n // wrong continuation\n i--;\n continue;\n }\n codepoint = (byte1 & 0x07) << 18 | (byte2 & 0x3F) << 12 | (byte3 & 0x3F) << 6 | (byte4 & 0x3F);\n if (codepoint < 0x010000 || codepoint > 0x10FFFF) {\n // illegal codepoint, no i-- here\n continue;\n }\n target[size++] = codepoint;\n } else {\n // illegal byte, just skip\n }\n }\n return size;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { CharData, ICellData, IExtendedAttrs } from 'common/Types';\nimport { stringFromCodePoint } from 'common/input/TextDecoder';\nimport { CHAR_DATA_CHAR_INDEX, CHAR_DATA_WIDTH_INDEX, CHAR_DATA_ATTR_INDEX, Content } from 'common/buffer/Constants';\nimport { AttributeData, ExtendedAttrs } from 'common/buffer/AttributeData';\n\n/**\n * CellData - represents a single Cell in the terminal buffer.\n */\nexport class CellData extends AttributeData implements ICellData {\n /** Helper to create CellData from CharData. */\n public static fromCharData(value: CharData): CellData {\n const obj = new CellData();\n obj.setFromCharData(value);\n return obj;\n }\n /** Primitives from terminal buffer. */\n public content = 0;\n public fg = 0;\n public bg = 0;\n public extended: IExtendedAttrs = new ExtendedAttrs();\n public combinedData = '';\n /** Whether cell contains a combined string. */\n public isCombined(): number {\n return this.content & Content.IS_COMBINED_MASK;\n }\n /** Width of the cell. */\n public getWidth(): number {\n return this.content >> Content.WIDTH_SHIFT;\n }\n /** JS string of the content. */\n public getChars(): string {\n if (this.content & Content.IS_COMBINED_MASK) {\n return this.combinedData;\n }\n if (this.content & Content.CODEPOINT_MASK) {\n return stringFromCodePoint(this.content & Content.CODEPOINT_MASK);\n }\n return '';\n }\n /**\n * Codepoint of cell\n * Note this returns the UTF32 codepoint of single chars,\n * if content is a combined string it returns the codepoint\n * of the last char in string to be in line with code in CharData.\n */\n public getCode(): number {\n return (this.isCombined())\n ? this.combinedData.charCodeAt(this.combinedData.length - 1)\n : this.content & Content.CODEPOINT_MASK;\n }\n /** Set data from CharData */\n public setFromCharData(value: CharData): void {\n this.fg = value[CHAR_DATA_ATTR_INDEX];\n this.bg = 0;\n let combined = false;\n // surrogates and combined strings need special treatment\n if (value[CHAR_DATA_CHAR_INDEX].length > 2) {\n combined = true;\n }\n else if (value[CHAR_DATA_CHAR_INDEX].length === 2) {\n const code = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0);\n // if the 2-char string is a surrogate create single codepoint\n // everything else is combined\n if (0xD800 <= code && code <= 0xDBFF) {\n const second = value[CHAR_DATA_CHAR_INDEX].charCodeAt(1);\n if (0xDC00 <= second && second <= 0xDFFF) {\n this.content = ((code - 0xD800) * 0x400 + second - 0xDC00 + 0x10000) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n else {\n combined = true;\n }\n }\n else {\n combined = true;\n }\n }\n else {\n this.content = value[CHAR_DATA_CHAR_INDEX].charCodeAt(0) | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n if (combined) {\n this.combinedData = value[CHAR_DATA_CHAR_INDEX];\n this.content = Content.IS_COMBINED_MASK | (value[CHAR_DATA_WIDTH_INDEX] << Content.WIDTH_SHIFT);\n }\n }\n /** Get data as CharData. */\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\n\n/**\n * A matrix that when multiplies will translate 0-1 coordinates (left to right,\n * top to bottom) to clip space.\n */\nexport const PROJECTION_MATRIX = new Float32Array([\n 2, 0, 0, 0,\n 0, -2, 0, 0,\n 0, 0, 1, 0,\n -1, 1, 0, 1\n]);\n\nexport function createProgram(gl: WebGLRenderingContext, vertexSource: string, fragmentSource: string): WebGLProgram | undefined {\n const program = throwIfFalsy(gl.createProgram());\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.VERTEX_SHADER, vertexSource)));\n gl.attachShader(program, throwIfFalsy(createShader(gl, gl.FRAGMENT_SHADER, fragmentSource)));\n gl.linkProgram(program);\n const success = gl.getProgramParameter(program, gl.LINK_STATUS);\n if (success) {\n return program;\n }\n\n console.error(gl.getProgramInfoLog(program));\n gl.deleteProgram(program);\n}\n\nexport function createShader(gl: WebGLRenderingContext, type: number, source: string): WebGLShader | undefined {\n const shader = throwIfFalsy(gl.createShader(type));\n gl.shaderSource(shader, source);\n gl.compileShader(shader);\n const success = gl.getShaderParameter(shader, gl.COMPILE_STATUS);\n if (success) {\n return shader;\n }\n\n console.error(gl.getShaderInfoLog(shader));\n gl.deleteShader(shader);\n}\n\nexport function expandFloat32Array(source: Float32Array, max: number): Float32Array {\n const newLength = Math.min(source.length * 2, max);\n const newArray = new Float32Array(newLength);\n for (let i = 0; i < source.length; i++) {\n newArray[i] = source[i];\n }\n return newArray;\n}\n\nexport class GLTexture {\n public texture: WebGLTexture;\n public version: number;\n\n constructor(texture: WebGLTexture) {\n this.texture = texture;\n this.version = -1;\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { allowRescaling, throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { TextureAtlas } from 'browser/renderer/shared/TextureAtlas';\nimport { IRasterizedGlyph, IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, GLTexture, PROJECTION_MATRIX } from './WebglUtils';\nimport type { IOptionsService } from 'common/services/Services';\n\ninterface IVertices {\n attributes: Float32Array;\n /**\n * These buffers are the ones used to bind to WebGL, the reason there are\n * multiple is to allow double buffering to work as you cannot modify the\n * buffer while it's being used by the GPU. Having multiple lets us start\n * working on the next frame.\n */\n attributesBuffers: Float32Array[];\n count: number;\n}\n\nconst enum VertexAttribLocations {\n UNIT_QUAD = 0,\n CELL_POSITION = 1,\n OFFSET = 2,\n SIZE = 3,\n TEXPAGE = 4,\n TEXCOORD = 5,\n TEXSIZE = 6\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\nlayout (location = ${VertexAttribLocations.CELL_POSITION}) in vec2 a_cellpos;\nlayout (location = ${VertexAttribLocations.OFFSET}) in vec2 a_offset;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.TEXPAGE}) in float a_texpage;\nlayout (location = ${VertexAttribLocations.TEXCOORD}) in vec2 a_texcoord;\nlayout (location = ${VertexAttribLocations.TEXSIZE}) in vec2 a_texsize;\n\nuniform mat4 u_projection;\nuniform vec2 u_resolution;\n\nout vec2 v_texcoord;\nflat out int v_texpage;\n\nvoid main() {\n vec2 zeroToOne = (a_offset / u_resolution) + a_cellpos + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_texpage = int(a_texpage);\n v_texcoord = a_texcoord + a_unitquad * a_texsize;\n}`;\n\nfunction createFragmentShaderSource(maxFragmentShaderTextureUnits: number): string {\n let textureConditionals = '';\n for (let i = 1; i < maxFragmentShaderTextureUnits; i++) {\n textureConditionals += ` else if (v_texpage == ${i}) { outColor = texture(u_texture[${i}], v_texcoord); }`;\n }\n return (`#version 300 es\nprecision lowp float;\n\nin vec2 v_texcoord;\nflat in int v_texpage;\n\nuniform sampler2D u_texture[${maxFragmentShaderTextureUnits}];\n\nout vec4 outColor;\n\nvoid main() {\n if (v_texpage == 0) {\n outColor = texture(u_texture[0], v_texcoord);\n } ${textureConditionals}\n}`);\n}\n\nconst INDICES_PER_CELL = 11;\nconst BYTES_PER_CELL = INDICES_PER_CELL * Float32Array.BYTES_PER_ELEMENT;\nconst CELL_POSITION_INDICES = 2;\n\n// Work variables to avoid garbage collection\nlet $i = 0;\nlet $glyph: IRasterizedGlyph | undefined = undefined;\nlet $leftCellPadding = 0;\nlet $clippedPixels = 0;\n\nexport class GlyphRenderer extends Disposable {\n private readonly _program: WebGLProgram;\n private readonly _vertexArrayObject: IWebGLVertexArrayObject;\n private readonly _projectionLocation: WebGLUniformLocation;\n private readonly _resolutionLocation: WebGLUniformLocation;\n private readonly _textureLocation: WebGLUniformLocation;\n private readonly _atlasTextures: GLTexture[];\n private readonly _attributesBuffer: WebGLBuffer;\n\n private _atlas: ITextureAtlas | undefined;\n private _activeBuffer: number = 0;\n private readonly _vertices: IVertices = {\n count: 0,\n attributes: new Float32Array(0),\n attributesBuffers: [\n new Float32Array(0),\n new Float32Array(0)\n ]\n };\n\n constructor(\n private readonly _terminal: Terminal,\n private readonly _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _optionsService: IOptionsService\n ) {\n super();\n\n const gl = this._gl;\n\n if (TextureAtlas.maxAtlasPages === undefined) {\n // Typically 8 or 16\n TextureAtlas.maxAtlasPages = Math.min(32, throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_IMAGE_UNITS) as number | null));\n // Almost all clients will support >= 4096\n TextureAtlas.maxTextureSize = throwIfFalsy(gl.getParameter(gl.MAX_TEXTURE_SIZE) as number | null);\n }\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, createFragmentShaderSource(TextureAtlas.maxAtlasPages)));\n this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n this._resolutionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_resolution'));\n this._textureLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_texture'));\n\n // Create and set the vertex array object\n this._vertexArrayObject = gl.createVertexArray();\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.OFFSET);\n gl.vertexAttribPointer(VertexAttribLocations.OFFSET, 2, gl.FLOAT, false, BYTES_PER_CELL, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.OFFSET, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXPAGE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXPAGE, 1, gl.FLOAT, false, BYTES_PER_CELL, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXPAGE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXCOORD);\n gl.vertexAttribPointer(VertexAttribLocations.TEXCOORD, 2, gl.FLOAT, false, BYTES_PER_CELL, 5 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXCOORD, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.TEXSIZE);\n gl.vertexAttribPointer(VertexAttribLocations.TEXSIZE, 2, gl.FLOAT, false, BYTES_PER_CELL, 7 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.TEXSIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.CELL_POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.CELL_POSITION, 2, gl.FLOAT, false, BYTES_PER_CELL, 9 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.CELL_POSITION, 1);\n\n // Setup static uniforms\n gl.useProgram(this._program);\n const textureUnits = new Int32Array(TextureAtlas.maxAtlasPages);\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n textureUnits[i] = i;\n }\n gl.uniform1iv(this._textureLocation, textureUnits);\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Setup 1x1 red pixel textures for all potential atlas pages, if one of these invalid textures\n // is ever drawn it will show characters as red rectangles.\n this._atlasTextures = [];\n for (let i = 0; i < TextureAtlas.maxAtlasPages; i++) {\n const glTexture = new GLTexture(throwIfFalsy(gl.createTexture()));\n this.register(toDisposable(() => gl.deleteTexture(glTexture.texture)));\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, glTexture.texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_BYTE, new Uint8Array([255, 0, 0, 255]));\n this._atlasTextures[i] = glTexture;\n }\n\n // Allow drawing of transparent texture\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // Set viewport\n this.handleResize();\n }\n\n public beginFrame(): boolean {\n return this._atlas ? this._atlas.beginFrame() : true;\n }\n\n public updateCell(x: number, y: number, code: number, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n // Since this function is called for every cell (`rows*cols`), it must be very optimized. It\n // should not instantiate any variables unless a new glyph is drawn to the cache where the\n // slight slowdown is acceptable for the developer ergonomics provided as it's a once of for\n // each glyph.\n this._updateCell(this._vertices.attributes, x, y, code, bg, fg, ext, chars, width, lastBg);\n }\n\n private _updateCell(array: Float32Array, x: number, y: number, code: number | undefined, bg: number, fg: number, ext: number, chars: string, width: number, lastBg: number): void {\n $i = (y * this._terminal.cols + x) * INDICES_PER_CELL;\n\n // Exit early if this is a null character, allow space character to continue as it may have\n // underline/strikethrough styles\n if (code === NULL_CELL_CODE || code === undefined/* This is used for the right side of wide chars */) {\n array.fill(0, $i, $i + INDICES_PER_CELL - 1 - CELL_POSITION_INDICES);\n return;\n }\n\n if (!this._atlas) {\n return;\n }\n\n // Get the glyph\n if (chars && chars.length > 1) {\n $glyph = this._atlas.getRasterizedGlyphCombinedChar(chars, bg, fg, ext, false);\n } else {\n $glyph = this._atlas.getRasterizedGlyph(code, bg, fg, ext, false);\n }\n\n $leftCellPadding = Math.floor((this._dimensions.device.cell.width - this._dimensions.device.char.width) / 2);\n if (bg !== lastBg && $glyph.offset.x > $leftCellPadding) {\n $clippedPixels = $glyph.offset.x - $leftCellPadding;\n // a_origin\n array[$i ] = -($glyph.offset.x - $clippedPixels) + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = ($glyph.size.x - $clippedPixels) / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x + $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x - $clippedPixels / this._atlas.pages[$glyph.texturePage].canvas.width;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n } else {\n // a_origin\n array[$i ] = -$glyph.offset.x + this._dimensions.device.char.left;\n array[$i + 1] = -$glyph.offset.y + this._dimensions.device.char.top;\n // a_size\n array[$i + 2] = $glyph.size.x / this._dimensions.device.canvas.width;\n array[$i + 3] = $glyph.size.y / this._dimensions.device.canvas.height;\n // a_texpage\n array[$i + 4] = $glyph.texturePage;\n // a_texcoord\n array[$i + 5] = $glyph.texturePositionClipSpace.x;\n array[$i + 6] = $glyph.texturePositionClipSpace.y;\n // a_texsize\n array[$i + 7] = $glyph.sizeClipSpace.x;\n array[$i + 8] = $glyph.sizeClipSpace.y;\n }\n // a_cellpos only changes on resize\n\n // Reduce scale horizontally for wide glyphs printed in cells that would overlap with the\n // following cell (ie. the width is not 2).\n if (this._optionsService.rawOptions.rescaleOverlappingGlyphs) {\n if (allowRescaling(code, width, $glyph.size.x, this._dimensions.device.cell.width)) {\n array[$i + 2] = (this._dimensions.device.cell.width - 1) / this._dimensions.device.canvas.width; // - 1 to improve readability\n }\n }\n }\n\n public clear(): void {\n const terminal = this._terminal;\n const newCount = terminal.cols * terminal.rows * INDICES_PER_CELL;\n\n // Clear vertices\n if (this._vertices.count !== newCount) {\n this._vertices.attributes = new Float32Array(newCount);\n } else {\n this._vertices.attributes.fill(0);\n }\n let i = 0;\n for (; i < this._vertices.attributesBuffers.length; i++) {\n if (this._vertices.count !== newCount) {\n this._vertices.attributesBuffers[i] = new Float32Array(newCount);\n } else {\n this._vertices.attributesBuffers[i].fill(0);\n }\n }\n this._vertices.count = newCount;\n i = 0;\n for (let y = 0; y < terminal.rows; y++) {\n for (let x = 0; x < terminal.cols; x++) {\n this._vertices.attributes[i + 9] = x / terminal.cols;\n this._vertices.attributes[i + 10] = y / terminal.rows;\n i += INDICES_PER_CELL;\n }\n }\n }\n\n public handleResize(): void {\n const gl = this._gl;\n gl.useProgram(this._program);\n gl.viewport(0, 0, gl.canvas.width, gl.canvas.height);\n gl.uniform2f(this._resolutionLocation, gl.canvas.width, gl.canvas.height);\n this.clear();\n }\n\n public render(renderModel: IRenderModel): void {\n if (!this._atlas) {\n return;\n }\n\n const gl = this._gl;\n\n gl.useProgram(this._program);\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Alternate buffers each frame as the active buffer gets locked while it's in use by the GPU\n this._activeBuffer = (this._activeBuffer + 1) % 2;\n const activeBuffer = this._vertices.attributesBuffers[this._activeBuffer];\n\n // Copy data for each cell of each line up to its line length (the last non-whitespace cell)\n // from the attributes buffer into activeBuffer, which is the one that gets bound to the GPU.\n // The reasons for this are as follows:\n // - So the active buffer can be alternated so we don't get blocked on rendering finishing\n // - To copy either the normal attributes buffer or the selection attributes buffer when there\n // is a selection\n // - So we don't send vertices for all the line-ending whitespace to the GPU\n let bufferLength = 0;\n for (let y = 0; y < renderModel.lineLengths.length; y++) {\n const si = y * this._terminal.cols * INDICES_PER_CELL;\n const sub = this._vertices.attributes.subarray(si, si + renderModel.lineLengths[y] * INDICES_PER_CELL);\n activeBuffer.set(sub, bufferLength);\n bufferLength += sub.length;\n }\n\n // Bind the attributes buffer\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, activeBuffer.subarray(0, bufferLength), gl.STREAM_DRAW);\n\n // Bind the atlas page texture if they have changed\n for (let i = 0; i < this._atlas.pages.length; i++) {\n if (this._atlas.pages[i].version !== this._atlasTextures[i].version) {\n this._bindAtlasPageTexture(gl, this._atlas, i);\n }\n }\n\n // Draw the viewport\n gl.drawElementsInstanced(gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, bufferLength / INDICES_PER_CELL);\n }\n\n public setAtlas(atlas: ITextureAtlas): void {\n this._atlas = atlas;\n for (const glTexture of this._atlasTextures) {\n glTexture.version = -1;\n }\n }\n\n private _bindAtlasPageTexture(gl: IWebGL2RenderingContext, atlas: ITextureAtlas, i: number): void {\n gl.activeTexture(gl.TEXTURE0 + i);\n gl.bindTexture(gl.TEXTURE_2D, this._atlasTextures[i].texture);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE);\n gl.texParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE);\n gl.texImage2D(gl.TEXTURE_2D, 0, gl.RGBA, gl.RGBA, gl.UNSIGNED_BYTE, atlas.pages[i].canvas);\n gl.generateMipmap(gl.TEXTURE_2D);\n this._atlasTextures[i].version = atlas.pages[i].version;\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n}\n", "/**\n * Copyright (c) 2022 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ITerminal } from 'browser/Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { Terminal } from '@xterm/xterm';\n\nclass SelectionRenderModel implements ISelectionRenderModel {\n public hasSelection!: boolean;\n public columnSelectMode!: boolean;\n public viewportStartRow!: number;\n public viewportEndRow!: number;\n public viewportCappedStartRow!: number;\n public viewportCappedEndRow!: number;\n public startCol!: number;\n public endCol!: number;\n public selectionStart: [number, number] | undefined;\n public selectionEnd: [number, number] | undefined;\n\n constructor() {\n this.clear();\n }\n\n public clear(): void {\n this.hasSelection = false;\n this.columnSelectMode = false;\n this.viewportStartRow = 0;\n this.viewportEndRow = 0;\n this.viewportCappedStartRow = 0;\n this.viewportCappedEndRow = 0;\n this.startCol = 0;\n this.endCol = 0;\n this.selectionStart = undefined;\n this.selectionEnd = undefined;\n }\n\n public update(terminal: ITerminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {\n this.selectionStart = start;\n this.selectionEnd = end;\n // Selection does not exist\n if (!start || !end || (start[0] === end[0] && start[1] === end[1])) {\n this.clear();\n return;\n }\n\n // Translate from buffer position to viewport position\n const viewportY = terminal.buffers.active.ydisp;\n const viewportStartRow = start[1] - viewportY;\n const viewportEndRow = end[1] - viewportY;\n const viewportCappedStartRow = Math.max(viewportStartRow, 0);\n const viewportCappedEndRow = Math.min(viewportEndRow, terminal.rows - 1);\n\n // No need to draw the selection\n if (viewportCappedStartRow >= terminal.rows || viewportCappedEndRow < 0) {\n this.clear();\n return;\n }\n\n this.hasSelection = true;\n this.columnSelectMode = columnSelectMode;\n this.viewportStartRow = viewportStartRow;\n this.viewportEndRow = viewportEndRow;\n this.viewportCappedStartRow = viewportCappedStartRow;\n this.viewportCappedEndRow = viewportCappedEndRow;\n this.startCol = start[0];\n this.endCol = end[0];\n }\n\n public isCellSelected(terminal: Terminal, x: number, y: number): boolean {\n if (!this.hasSelection) {\n return false;\n }\n y -= terminal.buffer.active.viewportY;\n if (this.columnSelectMode) {\n if (this.startCol <= this.endCol) {\n return x >= this.startCol && y >= this.viewportCappedStartRow &&\n x < this.endCol && y <= this.viewportCappedEndRow;\n }\n return x < this.startCol && y >= this.viewportCappedStartRow &&\n x >= this.endCol && y <= this.viewportCappedEndRow;\n }\n return (y > this.viewportStartRow && y < this.viewportEndRow) ||\n (this.viewportStartRow === this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportEndRow && x < this.endCol) ||\n (this.viewportStartRow < this.viewportEndRow && y === this.viewportStartRow && x >= this.startCol);\n }\n}\n\nexport function createSelectionRenderModel(): ISelectionRenderModel {\n return new SelectionRenderModel();\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ICursorRenderModel, IRenderModel } from './Types';\nimport { ISelectionRenderModel } from 'browser/renderer/shared/Types';\nimport { createSelectionRenderModel } from 'browser/renderer/shared/SelectionRenderModel';\n\nexport const RENDER_MODEL_INDICIES_PER_CELL = 4;\nexport const RENDER_MODEL_BG_OFFSET = 1;\nexport const RENDER_MODEL_FG_OFFSET = 2;\nexport const RENDER_MODEL_EXT_OFFSET = 3;\n\nexport const COMBINED_CHAR_BIT_MASK = 0x80000000;\n\nexport class RenderModel implements IRenderModel {\n public cells: Uint32Array;\n public lineLengths: Uint32Array;\n public selection: ISelectionRenderModel;\n public cursor?: ICursorRenderModel;\n\n constructor() {\n this.cells = new Uint32Array(0);\n this.lineLengths = new Uint32Array(0);\n this.selection = createSelectionRenderModel();\n }\n\n public resize(cols: number, rows: number): void {\n const indexCount = cols * rows * RENDER_MODEL_INDICIES_PER_CELL;\n if (indexCount !== this.cells.length) {\n this.cells = new Uint32Array(indexCount);\n this.lineLengths = new Uint32Array(rows);\n }\n }\n\n public clear(): void {\n this.cells.fill(0, 0);\n this.lineLengths.fill(0, 0);\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { IThemeService } from 'browser/services/Services';\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { Attributes, FgFlags } from 'common/buffer/Constants';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { IColor } from 'common/Types';\nimport { Terminal } from '@xterm/xterm';\nimport { RENDER_MODEL_BG_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL } from './RenderModel';\nimport { IRenderModel, IWebGL2RenderingContext, IWebGLVertexArrayObject } from './Types';\nimport { createProgram, expandFloat32Array, PROJECTION_MATRIX } from './WebglUtils';\n\nconst enum VertexAttribLocations {\n POSITION = 0,\n SIZE = 1,\n COLOR = 2,\n UNIT_QUAD = 3\n}\n\nconst vertexShaderSource = `#version 300 es\nlayout (location = ${VertexAttribLocations.POSITION}) in vec2 a_position;\nlayout (location = ${VertexAttribLocations.SIZE}) in vec2 a_size;\nlayout (location = ${VertexAttribLocations.COLOR}) in vec4 a_color;\nlayout (location = ${VertexAttribLocations.UNIT_QUAD}) in vec2 a_unitquad;\n\nuniform mat4 u_projection;\n\nout vec4 v_color;\n\nvoid main() {\n vec2 zeroToOne = a_position + (a_unitquad * a_size);\n gl_Position = u_projection * vec4(zeroToOne, 0.0, 1.0);\n v_color = a_color;\n}`;\n\nconst fragmentShaderSource = `#version 300 es\nprecision lowp float;\n\nin vec4 v_color;\n\nout vec4 outColor;\n\nvoid main() {\n outColor = v_color;\n}`;\n\nconst INDICES_PER_RECTANGLE = 8;\nconst BYTES_PER_RECTANGLE = INDICES_PER_RECTANGLE * Float32Array.BYTES_PER_ELEMENT;\n\nconst INITIAL_BUFFER_RECTANGLE_CAPACITY = 20 * INDICES_PER_RECTANGLE;\n\nclass Vertices {\n public attributes: Float32Array;\n public count: number;\n\n constructor() {\n this.attributes = new Float32Array(INITIAL_BUFFER_RECTANGLE_CAPACITY);\n this.count = 0;\n }\n}\n\n// Work variables to avoid garbage collection\nlet $rgba = 0;\nlet $x1 = 0;\nlet $y1 = 0;\nlet $r = 0;\nlet $g = 0;\nlet $b = 0;\nlet $a = 0;\n\nexport class RectangleRenderer extends Disposable {\n\n private _program: WebGLProgram;\n private _vertexArrayObject: IWebGLVertexArrayObject;\n private _attributesBuffer: WebGLBuffer;\n private _projectionLocation: WebGLUniformLocation;\n private _bgFloat!: Float32Array;\n private _cursorFloat!: Float32Array;\n\n private _vertices: Vertices = new Vertices();\n private _verticesCursor: Vertices = new Vertices();\n\n constructor(\n private _terminal: Terminal,\n private _gl: IWebGL2RenderingContext,\n private _dimensions: IRenderDimensions,\n private readonly _themeService: IThemeService\n ) {\n super();\n\n const gl = this._gl;\n\n this._program = throwIfFalsy(createProgram(gl, vertexShaderSource, fragmentShaderSource));\n this.register(toDisposable(() => gl.deleteProgram(this._program)));\n\n // Uniform locations\n this._projectionLocation = throwIfFalsy(gl.getUniformLocation(this._program, 'u_projection'));\n\n // Create and set the vertex array object\n this._vertexArrayObject = gl.createVertexArray();\n gl.bindVertexArray(this._vertexArrayObject);\n\n // Setup a_unitquad, this defines the 4 vertices of a rectangle\n const unitQuadVertices = new Float32Array([0, 0, 1, 0, 0, 1, 1, 1]);\n const unitQuadVerticesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(unitQuadVerticesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, unitQuadVerticesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, unitQuadVertices, gl.STATIC_DRAW);\n gl.enableVertexAttribArray(VertexAttribLocations.UNIT_QUAD);\n gl.vertexAttribPointer(VertexAttribLocations.UNIT_QUAD, 2, this._gl.FLOAT, false, 0, 0);\n\n // Setup the unit quad element array buffer, this points to indices in\n // unitQuadVertices to allow is to draw 2 triangles from the vertices via a\n // triangle strip\n const unitQuadElementIndices = new Uint8Array([0, 1, 2, 3]);\n const elementIndicesBuffer = gl.createBuffer();\n this.register(toDisposable(() => gl.deleteBuffer(elementIndicesBuffer)));\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, elementIndicesBuffer);\n gl.bufferData(gl.ELEMENT_ARRAY_BUFFER, unitQuadElementIndices, gl.STATIC_DRAW);\n\n // Setup attributes\n this._attributesBuffer = throwIfFalsy(gl.createBuffer());\n this.register(toDisposable(() => gl.deleteBuffer(this._attributesBuffer)));\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.enableVertexAttribArray(VertexAttribLocations.POSITION);\n gl.vertexAttribPointer(VertexAttribLocations.POSITION, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 0);\n gl.vertexAttribDivisor(VertexAttribLocations.POSITION, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.SIZE);\n gl.vertexAttribPointer(VertexAttribLocations.SIZE, 2, gl.FLOAT, false, BYTES_PER_RECTANGLE, 2 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.SIZE, 1);\n gl.enableVertexAttribArray(VertexAttribLocations.COLOR);\n gl.vertexAttribPointer(VertexAttribLocations.COLOR, 4, gl.FLOAT, false, BYTES_PER_RECTANGLE, 4 * Float32Array.BYTES_PER_ELEMENT);\n gl.vertexAttribDivisor(VertexAttribLocations.COLOR, 1);\n\n this._updateCachedColors(_themeService.colors);\n this.register(this._themeService.onChangeColors(e => {\n this._updateCachedColors(e);\n this._updateViewportRectangle();\n }));\n }\n\n public renderBackgrounds(): void {\n this._renderVertices(this._vertices);\n }\n\n public renderCursor(): void {\n this._renderVertices(this._verticesCursor);\n }\n\n private _renderVertices(vertices: Vertices): void {\n const gl = this._gl;\n\n gl.useProgram(this._program);\n\n gl.bindVertexArray(this._vertexArrayObject);\n\n gl.uniformMatrix4fv(this._projectionLocation, false, PROJECTION_MATRIX);\n\n // Bind attributes buffer and draw\n gl.bindBuffer(gl.ARRAY_BUFFER, this._attributesBuffer);\n gl.bufferData(gl.ARRAY_BUFFER, vertices.attributes, gl.DYNAMIC_DRAW);\n gl.drawElementsInstanced(this._gl.TRIANGLE_STRIP, 4, gl.UNSIGNED_BYTE, 0, vertices.count);\n }\n\n public handleResize(): void {\n this._updateViewportRectangle();\n }\n\n public setDimensions(dimensions: IRenderDimensions): void {\n this._dimensions = dimensions;\n }\n\n private _updateCachedColors(colors: ReadonlyColorSet): void {\n this._bgFloat = this._colorToFloat32Array(colors.background);\n this._cursorFloat = this._colorToFloat32Array(colors.cursor);\n }\n\n private _updateViewportRectangle(): void {\n // Set first rectangle that clears the screen\n this._addRectangleFloat(\n this._vertices.attributes,\n 0,\n 0,\n 0,\n this._terminal.cols * this._dimensions.device.cell.width,\n this._terminal.rows * this._dimensions.device.cell.height,\n this._bgFloat\n );\n }\n\n public updateBackgrounds(model: IRenderModel): void {\n const terminal = this._terminal;\n const vertices = this._vertices;\n\n // Declare variable ahead of time to avoid garbage collection\n let rectangleCount = 1;\n let y: number;\n let x: number;\n let currentStartX: number;\n let currentBg: number;\n let currentFg: number;\n let currentInverse: boolean;\n let modelIndex: number;\n let bg: number;\n let fg: number;\n let inverse: boolean;\n let offset: number;\n\n for (y = 0; y < terminal.rows; y++) {\n currentStartX = -1;\n currentBg = 0;\n currentFg = 0;\n currentInverse = false;\n for (x = 0; x < terminal.cols; x++) {\n modelIndex = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n bg = model.cells[modelIndex + RENDER_MODEL_BG_OFFSET];\n fg = model.cells[modelIndex + RENDER_MODEL_FG_OFFSET];\n inverse = !!(fg & FgFlags.INVERSE);\n if (bg !== currentBg || (fg !== currentFg && (currentInverse || inverse))) {\n // A rectangle needs to be drawn if going from non-default to another color\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, x, y);\n }\n currentStartX = x;\n currentBg = bg;\n currentFg = fg;\n currentInverse = inverse;\n }\n }\n // Finish rectangle if it's still going\n if (currentBg !== 0 || (currentInverse && currentFg !== 0)) {\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._updateRectangle(vertices, offset, currentFg, currentBg, currentStartX, terminal.cols, y);\n }\n }\n vertices.count = rectangleCount;\n }\n\n public updateCursor(model: IRenderModel): void {\n const vertices = this._verticesCursor;\n const cursor = model.cursor;\n if (!cursor || cursor.style === 'block') {\n vertices.count = 0;\n return;\n }\n\n let offset: number;\n let rectangleCount = 0;\n\n if (cursor.style === 'bar' || cursor.style === 'outline') {\n // Left edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.style === 'bar' ? cursor.dpr * cursor.cursorWidth : cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n if (cursor.style === 'underline' || cursor.style === 'outline') {\n // Bottom edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n (cursor.y + 1) * this._dimensions.device.cell.height - cursor.dpr,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n }\n if (cursor.style === 'outline') {\n // Top edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n cursor.x * this._dimensions.device.cell.width,\n cursor.y * this._dimensions.device.cell.height,\n cursor.width * this._dimensions.device.cell.width,\n cursor.dpr,\n this._cursorFloat\n );\n // Right edge\n offset = rectangleCount++ * INDICES_PER_RECTANGLE;\n this._addRectangleFloat(\n vertices.attributes,\n offset,\n (cursor.x + cursor.width) * this._dimensions.device.cell.width - cursor.dpr,\n cursor.y * this._dimensions.device.cell.height,\n cursor.dpr,\n this._dimensions.device.cell.height,\n this._cursorFloat\n );\n }\n\n vertices.count = rectangleCount;\n }\n\n private _updateRectangle(vertices: Vertices, offset: number, fg: number, bg: number, startX: number, endX: number, y: number): void {\n if (fg & FgFlags.INVERSE) {\n switch (fg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[fg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (fg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.foreground.rgba;\n }\n } else {\n switch (bg & Attributes.CM_MASK) {\n case Attributes.CM_P16:\n case Attributes.CM_P256:\n $rgba = this._themeService.colors.ansi[bg & Attributes.PCOLOR_MASK].rgba;\n break;\n case Attributes.CM_RGB:\n $rgba = (bg & Attributes.RGB_MASK) << 8;\n break;\n case Attributes.CM_DEFAULT:\n default:\n $rgba = this._themeService.colors.background.rgba;\n }\n }\n\n if (vertices.attributes.length < offset + 4) {\n vertices.attributes = expandFloat32Array(vertices.attributes, this._terminal.rows * this._terminal.cols * INDICES_PER_RECTANGLE);\n }\n $x1 = startX * this._dimensions.device.cell.width;\n $y1 = y * this._dimensions.device.cell.height;\n $r = (($rgba >> 24) & 0xFF) / 255;\n $g = (($rgba >> 16) & 0xFF) / 255;\n $b = (($rgba >> 8 ) & 0xFF) / 255;\n $a = 1;\n\n this._addRectangle(vertices.attributes, offset, $x1, $y1, (endX - startX) * this._dimensions.device.cell.width, this._dimensions.device.cell.height, $r, $g, $b, $a);\n }\n\n private _addRectangle(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, r: number, g: number, b: number, a: number): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = r;\n array[offset + 5] = g;\n array[offset + 6] = b;\n array[offset + 7] = a;\n }\n\n private _addRectangleFloat(array: Float32Array, offset: number, x1: number, y1: number, width: number, height: number, color: Float32Array): void {\n array[offset ] = x1 / this._dimensions.device.canvas.width;\n array[offset + 1] = y1 / this._dimensions.device.canvas.height;\n array[offset + 2] = width / this._dimensions.device.canvas.width;\n array[offset + 3] = height / this._dimensions.device.canvas.height;\n array[offset + 4] = color[0];\n array[offset + 5] = color[1];\n array[offset + 6] = color[2];\n array[offset + 7] = color[3];\n }\n\n private _colorToFloat32Array(color: IColor): Float32Array {\n return new Float32Array([\n ((color.rgba >> 24) & 0xFF) / 255,\n ((color.rgba >> 16) & 0xFF) / 255,\n ((color.rgba >> 8 ) & 0xFF) / 255,\n ((color.rgba ) & 0xFF) / 255\n ]);\n }\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { ReadonlyColorSet } from 'browser/Types';\nimport { acquireTextureAtlas } from 'browser/renderer/shared/CharAtlasCache';\nimport { TEXT_BASELINE } from 'browser/renderer/shared/Constants';\nimport { throwIfFalsy } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { CellData } from 'common/buffer/CellData';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { IRenderLayer } from './Types';\n\nexport abstract class BaseRenderLayer extends Disposable implements IRenderLayer {\n private _canvas: HTMLCanvasElement;\n protected _ctx!: CanvasRenderingContext2D;\n private _deviceCharWidth: number = 0;\n private _deviceCharHeight: number = 0;\n private _deviceCellWidth: number = 0;\n private _deviceCellHeight: number = 0;\n private _deviceCharLeft: number = 0;\n private _deviceCharTop: number = 0;\n\n protected _charAtlas: ITextureAtlas | undefined;\n\n constructor(\n terminal: Terminal,\n private _container: HTMLElement,\n id: string,\n zIndex: number,\n private _alpha: boolean,\n protected readonly _coreBrowserService: ICoreBrowserService,\n protected readonly _optionsService: IOptionsService,\n protected readonly _themeService: IThemeService\n ) {\n super();\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n this._canvas.classList.add(`xterm-${id}-layer`);\n this._canvas.style.zIndex = zIndex.toString();\n this._initCanvas();\n this._container.appendChild(this._canvas);\n this.register(this._themeService.onChangeColors(e => {\n this._refreshCharAtlas(terminal, e);\n this.reset(terminal);\n }));\n this.register(toDisposable(() => {\n this._canvas.remove();\n }));\n }\n\n private _initCanvas(): void {\n this._ctx = throwIfFalsy(this._canvas.getContext('2d', { alpha: this._alpha }));\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n }\n\n public handleBlur(terminal: Terminal): void {}\n public handleFocus(terminal: Terminal): void {}\n public handleCursorMove(terminal: Terminal): void {}\n public handleGridChanged(terminal: Terminal, startRow: number, endRow: number): void {}\n public handleSelectionChanged(terminal: Terminal, start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean = false): void {}\n\n protected _setTransparency(terminal: Terminal, alpha: boolean): void {\n // Do nothing when alpha doesn't change\n if (alpha === this._alpha) {\n return;\n }\n\n // Create new canvas and replace old one\n const oldCanvas = this._canvas;\n this._alpha = alpha;\n // Cloning preserves properties\n this._canvas = this._canvas.cloneNode() as HTMLCanvasElement;\n this._initCanvas();\n this._container.replaceChild(this._canvas, oldCanvas);\n\n // Regenerate char atlas and force a full redraw\n this._refreshCharAtlas(terminal, this._themeService.colors);\n this.handleGridChanged(terminal, 0, terminal.rows - 1);\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n * @param terminal The terminal.\n * @param colorSet The color set to use for the char atlas.\n */\n private _refreshCharAtlas(terminal: Terminal, colorSet: ReadonlyColorSet): void {\n if (this._deviceCharWidth <= 0 && this._deviceCharHeight <= 0) {\n return;\n }\n this._charAtlas = acquireTextureAtlas(terminal, this._optionsService.rawOptions, colorSet, this._deviceCellWidth, this._deviceCellHeight, this._deviceCharWidth, this._deviceCharHeight, this._coreBrowserService.dpr);\n this._charAtlas.warmUp();\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n this._deviceCellWidth = dim.device.cell.width;\n this._deviceCellHeight = dim.device.cell.height;\n this._deviceCharWidth = dim.device.char.width;\n this._deviceCharHeight = dim.device.char.height;\n this._deviceCharLeft = dim.device.char.left;\n this._deviceCharTop = dim.device.char.top;\n this._canvas.width = dim.device.canvas.width;\n this._canvas.height = dim.device.canvas.height;\n this._canvas.style.width = `${dim.css.canvas.width}px`;\n this._canvas.style.height = `${dim.css.canvas.height}px`;\n\n // Draw the background if this is an opaque layer\n if (!this._alpha) {\n this._clearAll();\n }\n\n this._refreshCharAtlas(terminal, this._themeService.colors);\n }\n\n public abstract reset(terminal: Terminal): void;\n\n /**\n * Fills a 1px line (2px on HDPI) at the bottom of the cell. This uses the\n * existing fillStyle on the context.\n * @param x The column to fill.\n * @param y The row to fill.\n */\n protected _fillBottomLineAtCells(x: number, y: number, width: number = 1): void {\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n (y + 1) * this._deviceCellHeight - this._coreBrowserService.dpr - 1 /* Ensure it's drawn within the cell */,\n width * this._deviceCellWidth,\n this._coreBrowserService.dpr);\n }\n\n /**\n * Clears the entire canvas.\n */\n protected _clearAll(): void {\n if (this._alpha) {\n this._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n }\n }\n\n /**\n * Clears 1+ cells completely.\n * @param x The column to start at.\n * @param y The row to start at.\n * @param width The number of columns to clear.\n * @param height The number of rows to clear.\n */\n protected _clearCells(x: number, y: number, width: number, height: number): void {\n if (this._alpha) {\n this._ctx.clearRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n } else {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n this._ctx.fillRect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n height * this._deviceCellHeight);\n }\n }\n\n /**\n * Draws a truecolor character at the cell. The character will be clipped to\n * ensure that it fits with the cell, including the cell to the right if it's\n * a wide character. This uses the existing fillStyle on the context.\n * @param terminal The terminal.\n * @param cell The cell data for the character to draw.\n * @param x The column to draw at.\n * @param y The row to draw at.\n */\n protected _fillCharTrueColor(terminal: Terminal, cell: CellData, x: number, y: number): void {\n this._ctx.font = this._getFont(terminal, false, false);\n this._ctx.textBaseline = TEXT_BASELINE;\n this._clipCell(x, y, cell.getWidth());\n this._ctx.fillText(\n cell.getChars(),\n x * this._deviceCellWidth + this._deviceCharLeft,\n y * this._deviceCellHeight + this._deviceCharTop + this._deviceCharHeight);\n }\n\n /**\n * Clips a cell to ensure no pixels will be drawn outside of it.\n * @param x The column to clip.\n * @param y The row to clip.\n * @param width The number of columns to clip.\n */\n private _clipCell(x: number, y: number, width: number): void {\n this._ctx.beginPath();\n this._ctx.rect(\n x * this._deviceCellWidth,\n y * this._deviceCellHeight,\n width * this._deviceCellWidth,\n this._deviceCellHeight);\n this._ctx.clip();\n }\n\n /**\n * Gets the current font.\n * @param terminal The terminal.\n * @param isBold If we should use the bold fontWeight.\n */\n protected _getFont(terminal: Terminal, isBold: boolean, isItalic: boolean): string {\n const fontWeight = isBold ? terminal.options.fontWeightBold : terminal.options.fontWeight;\n const fontStyle = isItalic ? 'italic' : '';\n\n return `${fontStyle} ${fontWeight} ${terminal.options.fontSize! * this._coreBrowserService.dpr}px ${terminal.options.fontFamily}`;\n }\n}\n\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { is256Color } from 'browser/renderer/shared/CharAtlasUtils';\nimport { INVERTED_DEFAULT_COLOR } from 'browser/renderer/shared/Constants';\nimport { IRenderDimensions } from 'browser/renderer/shared/Types';\nimport { ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { ILinkifier2, ILinkifierEvent } from 'browser/Types';\nimport { IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { BaseRenderLayer } from './BaseRenderLayer';\n\nexport class LinkRenderLayer extends BaseRenderLayer {\n private _state: ILinkifierEvent | undefined;\n\n constructor(\n container: HTMLElement,\n zIndex: number,\n terminal: Terminal,\n linkifier2: ILinkifier2,\n coreBrowserService: ICoreBrowserService,\n optionsService: IOptionsService,\n themeService: IThemeService\n ) {\n super(terminal, container, 'link', zIndex, true, coreBrowserService, optionsService, themeService);\n\n this.register(linkifier2.onShowLinkUnderline(e => this._handleShowLinkUnderline(e)));\n this.register(linkifier2.onHideLinkUnderline(e => this._handleHideLinkUnderline(e)));\n }\n\n public resize(terminal: Terminal, dim: IRenderDimensions): void {\n super.resize(terminal, dim);\n // Resizing the canvas discards the contents of the canvas so clear state\n this._state = undefined;\n }\n\n public reset(terminal: Terminal): void {\n this._clearCurrentLink();\n }\n\n private _clearCurrentLink(): void {\n if (this._state) {\n this._clearCells(this._state.x1, this._state.y1, this._state.cols - this._state.x1, 1);\n const middleRowCount = this._state.y2 - this._state.y1 - 1;\n if (middleRowCount > 0) {\n this._clearCells(0, this._state.y1 + 1, this._state.cols, middleRowCount);\n }\n this._clearCells(0, this._state.y2, this._state.x2, 1);\n this._state = undefined;\n }\n }\n\n private _handleShowLinkUnderline(e: ILinkifierEvent): void {\n if (e.fg === INVERTED_DEFAULT_COLOR) {\n this._ctx.fillStyle = this._themeService.colors.background.css;\n } else if (e.fg !== undefined && is256Color(e.fg)) {\n // 256 color support\n this._ctx.fillStyle = this._themeService.colors.ansi[e.fg!].css;\n } else {\n this._ctx.fillStyle = this._themeService.colors.foreground.css;\n }\n\n if (e.y1 === e.y2) {\n // Single line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.x2 - e.x1);\n } else {\n // Multi-line link\n this._fillBottomLineAtCells(e.x1, e.y1, e.cols - e.x1);\n for (let y = e.y1 + 1; y < e.y2; y++) {\n this._fillBottomLineAtCells(0, y, e.cols);\n }\n this._fillBottomLineAtCells(0, e.y2, e.x2);\n }\n this._state = e;\n }\n\n private _handleHideLinkUnderline(e: ILinkifierEvent): void {\n this._clearCurrentLink();\n }\n}\n", "/**\n * Copyright (c) 2018 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { addDisposableDomListener } from 'browser/Lifecycle';\nimport { ITerminal } from 'browser/Types';\nimport { CellColorResolver } from 'browser/renderer/shared/CellColorResolver';\nimport { acquireTextureAtlas, removeTerminalFromCache } from 'browser/renderer/shared/CharAtlasCache';\nimport { CursorBlinkStateManager } from 'browser/renderer/shared/CursorBlinkStateManager';\nimport { observeDevicePixelDimensions } from 'browser/renderer/shared/DevicePixelObserver';\nimport { createRenderDimensions } from 'browser/renderer/shared/RendererUtils';\nimport { IRenderDimensions, IRenderer, IRequestRedrawEvent, ITextureAtlas } from 'browser/renderer/shared/Types';\nimport { ICharSizeService, ICharacterJoinerService, ICoreBrowserService, IThemeService } from 'browser/services/Services';\nimport { Disposable, MutableDisposable, getDisposeArrayDisposable, toDisposable } from 'common/Lifecycle';\nimport { CharData, IBufferLine, ICellData } from 'common/Types';\nimport { AttributeData } from 'common/buffer/AttributeData';\nimport { CellData } from 'common/buffer/CellData';\nimport { Attributes, Content, NULL_CELL_CHAR, NULL_CELL_CODE } from 'common/buffer/Constants';\nimport { ICoreService, IDecorationService, IOptionsService } from 'common/services/Services';\nimport { Terminal } from '@xterm/xterm';\nimport { GlyphRenderer } from './GlyphRenderer';\nimport { RectangleRenderer } from './RectangleRenderer';\nimport { COMBINED_CHAR_BIT_MASK, RENDER_MODEL_BG_OFFSET, RENDER_MODEL_EXT_OFFSET, RENDER_MODEL_FG_OFFSET, RENDER_MODEL_INDICIES_PER_CELL, RenderModel } from './RenderModel';\nimport { IWebGL2RenderingContext } from './Types';\nimport { LinkRenderLayer } from './renderLayer/LinkRenderLayer';\nimport { IRenderLayer } from './renderLayer/Types';\nimport { Emitter, Event } from 'vs/base/common/event';\n\nexport class WebglRenderer extends Disposable implements IRenderer {\n private _renderLayers: IRenderLayer[];\n private _cursorBlinkStateManager: MutableDisposable<CursorBlinkStateManager> = new MutableDisposable();\n private _charAtlasDisposable = this.register(new MutableDisposable());\n private _charAtlas: ITextureAtlas | undefined;\n private _devicePixelRatio: number;\n private _observerDisposable = this.register(new MutableDisposable());\n\n private _model: RenderModel = new RenderModel();\n private _workCell: ICellData = new CellData();\n private _workCell2: ICellData = new CellData();\n private _cellColorResolver: CellColorResolver;\n\n private _canvas: HTMLCanvasElement;\n private _gl: IWebGL2RenderingContext;\n private _rectangleRenderer: MutableDisposable<RectangleRenderer> = this.register(new MutableDisposable());\n private _glyphRenderer: MutableDisposable<GlyphRenderer> = this.register(new MutableDisposable());\n\n public readonly dimensions: IRenderDimensions;\n\n private _core: ITerminal;\n private _isAttached: boolean;\n private _contextRestorationTimeout: number | undefined;\n\n private readonly _onChangeTextureAtlas = this.register(new Emitter<HTMLCanvasElement>());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this.register(new Emitter<HTMLCanvasElement>());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this.register(new Emitter<HTMLCanvasElement>());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onRequestRedraw = this.register(new Emitter<IRequestRedrawEvent>());\n public readonly onRequestRedraw = this._onRequestRedraw.event;\n private readonly _onContextLoss = this.register(new Emitter<void>());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _terminal: Terminal,\n private readonly _characterJoinerService: ICharacterJoinerService,\n private readonly _charSizeService: ICharSizeService,\n private readonly _coreBrowserService: ICoreBrowserService,\n private readonly _coreService: ICoreService,\n private readonly _decorationService: IDecorationService,\n private readonly _optionsService: IOptionsService,\n private readonly _themeService: IThemeService,\n preserveDrawingBuffer?: boolean\n ) {\n super();\n\n this.register(this._themeService.onChangeColors(() => this._handleColorChange()));\n\n this._cellColorResolver = new CellColorResolver(this._terminal, this._optionsService, this._model.selection, this._decorationService, this._coreBrowserService, this._themeService);\n\n this._core = (this._terminal as any)._core;\n\n this._renderLayers = [\n new LinkRenderLayer(this._core.screenElement!, 2, this._terminal, this._core.linkifier!, this._coreBrowserService, _optionsService, this._themeService)\n ];\n this.dimensions = createRenderDimensions();\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this._updateDimensions();\n this._updateCursorBlink();\n this.register(_optionsService.onOptionChange(() => this._handleOptionsChanged()));\n\n this._canvas = this._coreBrowserService.mainDocument.createElement('canvas');\n\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer\n };\n this._gl = this._canvas.getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!this._gl) {\n throw new Error('WebGL2 not supported ' + this._gl);\n }\n\n this.register(addDisposableDomListener(this._canvas, 'webglcontextlost', (e) => {\n console.log('webglcontextlost event received');\n // Prevent the default behavior in order to enable WebGL context restoration.\n e.preventDefault();\n // Wait a few seconds to see if the 'webglcontextrestored' event is fired.\n // If not, dispatch the onContextLoss notification to observers.\n this._contextRestorationTimeout = setTimeout(() => {\n this._contextRestorationTimeout = undefined;\n console.warn('webgl context not restored; firing onContextLoss');\n this._onContextLoss.fire(e);\n }, 3000 /* ms */);\n }));\n this.register(addDisposableDomListener(this._canvas, 'webglcontextrestored', (e) => {\n console.warn('webglcontextrestored event received');\n clearTimeout(this._contextRestorationTimeout);\n this._contextRestorationTimeout = undefined;\n // The texture atlas and glyph renderer must be fully reinitialized\n // because their contents have been lost.\n removeTerminalFromCache(this._terminal);\n this._initializeWebGLState();\n this._requestRedrawViewport();\n }));\n\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, this._coreBrowserService.window, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n this.register(this._coreBrowserService.onWindowChange(w => {\n this._observerDisposable.value = observeDevicePixelDimensions(this._canvas, w, (w, h) => this._setCanvasDevicePixelDimensions(w, h));\n }));\n\n this._core.screenElement!.appendChild(this._canvas);\n\n [this._rectangleRenderer.value, this._glyphRenderer.value] = this._initializeWebGLState();\n\n this._isAttached = this._coreBrowserService.window.document.body.contains(this._core.screenElement!);\n\n this.register(toDisposable(() => {\n for (const l of this._renderLayers) {\n l.dispose();\n }\n this._canvas.parentElement?.removeChild(this._canvas);\n removeTerminalFromCache(this._terminal);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._charAtlas?.pages[0].canvas;\n }\n\n private _handleColorChange(): void {\n this._refreshCharAtlas();\n\n // Force a full refresh\n this._clearModel(true);\n }\n\n public handleDevicePixelRatioChange(): void {\n // If the device pixel ratio changed, the char atlas needs to be regenerated\n // and the terminal needs to refreshed\n if (this._devicePixelRatio !== this._coreBrowserService.dpr) {\n this._devicePixelRatio = this._coreBrowserService.dpr;\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n }\n\n public handleResize(cols: number, rows: number): void {\n // Update character and canvas dimensions\n this._updateDimensions();\n\n this._model.resize(this._terminal.cols, this._terminal.rows);\n\n // Resize all render layers\n for (const l of this._renderLayers) {\n l.resize(this._terminal, this.dimensions);\n }\n\n // Resize the canvas\n this._canvas.width = this.dimensions.device.canvas.width;\n this._canvas.height = this.dimensions.device.canvas.height;\n this._canvas.style.width = `${this.dimensions.css.canvas.width}px`;\n this._canvas.style.height = `${this.dimensions.css.canvas.height}px`;\n\n // Resize the screen\n this._core.screenElement!.style.width = `${this.dimensions.css.canvas.width}px`;\n this._core.screenElement!.style.height = `${this.dimensions.css.canvas.height}px`;\n\n this._rectangleRenderer.value?.setDimensions(this.dimensions);\n this._rectangleRenderer.value?.handleResize();\n this._glyphRenderer.value?.setDimensions(this.dimensions);\n this._glyphRenderer.value?.handleResize();\n\n this._refreshCharAtlas();\n\n // Force a full refresh. Resizing `_glyphRenderer` should clear it already,\n // so there is no need to clear it again here.\n this._clearModel(false);\n }\n\n public handleCharSizeChanged(): void {\n this.handleResize(this._terminal.cols, this._terminal.rows);\n }\n\n public handleBlur(): void {\n for (const l of this._renderLayers) {\n l.handleBlur(this._terminal);\n }\n this._cursorBlinkStateManager.value?.pause();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleFocus(): void {\n for (const l of this._renderLayers) {\n l.handleFocus(this._terminal);\n }\n this._cursorBlinkStateManager.value?.resume();\n // Request a redraw for active/inactive selection background\n this._requestRedrawViewport();\n }\n\n public handleSelectionChanged(start: [number, number] | undefined, end: [number, number] | undefined, columnSelectMode: boolean): void {\n for (const l of this._renderLayers) {\n l.handleSelectionChanged(this._terminal, start, end, columnSelectMode);\n }\n this._model.selection.update(this._core, start, end, columnSelectMode);\n this._requestRedrawViewport();\n }\n\n public handleCursorMove(): void {\n for (const l of this._renderLayers) {\n l.handleCursorMove(this._terminal);\n }\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n }\n\n private _handleOptionsChanged(): void {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._updateCursorBlink();\n }\n\n /**\n * Initializes members dependent on WebGL context state.\n */\n private _initializeWebGLState(): [RectangleRenderer, GlyphRenderer] {\n this._rectangleRenderer.value = new RectangleRenderer(this._terminal, this._gl, this.dimensions, this._themeService);\n this._glyphRenderer.value = new GlyphRenderer(this._terminal, this._gl, this.dimensions, this._optionsService);\n\n // Update dimensions and acquire char atlas\n this.handleCharSizeChanged();\n\n return [this._rectangleRenderer.value, this._glyphRenderer.value];\n }\n\n /**\n * Refreshes the char atlas, aquiring a new one if necessary.\n */\n private _refreshCharAtlas(): void {\n if (this.dimensions.device.char.width <= 0 && this.dimensions.device.char.height <= 0) {\n // Mark as not attached so char atlas gets refreshed on next render\n this._isAttached = false;\n return;\n }\n\n const atlas = acquireTextureAtlas(\n this._terminal,\n this._optionsService.rawOptions,\n this._themeService.colors,\n this.dimensions.device.cell.width,\n this.dimensions.device.cell.height,\n this.dimensions.device.char.width,\n this.dimensions.device.char.height,\n this._coreBrowserService.dpr\n );\n if (this._charAtlas !== atlas) {\n this._onChangeTextureAtlas.fire(atlas.pages[0].canvas);\n this._charAtlasDisposable.value = getDisposeArrayDisposable([\n Event.forward(atlas.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas),\n Event.forward(atlas.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas)\n ]);\n }\n this._charAtlas = atlas;\n this._charAtlas.warmUp();\n this._glyphRenderer.value?.setAtlas(this._charAtlas);\n }\n\n /**\n * Clear the model.\n * @param clearGlyphRenderer Whether to also clear the glyph renderer. This\n * should be true generally to make sure it is in the same state as the model.\n */\n private _clearModel(clearGlyphRenderer: boolean): void {\n this._model.clear();\n if (clearGlyphRenderer) {\n this._glyphRenderer.value?.clear();\n }\n }\n\n public clearTextureAtlas(): void {\n this._charAtlas?.clearTexture();\n this._clearModel(true);\n this._requestRedrawViewport();\n }\n\n public clear(): void {\n this._clearModel(true);\n for (const l of this._renderLayers) {\n l.reset(this._terminal);\n }\n\n this._cursorBlinkStateManager.value?.restartBlinkAnimation();\n this._updateCursorBlink();\n }\n\n public registerCharacterJoiner(handler: (text: string) => [number, number][]): number {\n return -1;\n }\n\n public deregisterCharacterJoiner(joinerId: number): boolean {\n return false;\n }\n\n public renderRows(start: number, end: number): void {\n if (!this._isAttached) {\n if (this._coreBrowserService.window.document.body.contains(this._core.screenElement!) && this._charSizeService.width && this._charSizeService.height) {\n this._updateDimensions();\n this._refreshCharAtlas();\n this._isAttached = true;\n } else {\n return;\n }\n }\n\n // Update render layers\n for (const l of this._renderLayers) {\n l.handleGridChanged(this._terminal, start, end);\n }\n\n if (!this._glyphRenderer.value || !this._rectangleRenderer.value) {\n return;\n }\n\n // Tell renderer the frame is beginning\n // upon a model clear also refresh the full viewport model\n // (also triggered by an atlas page merge, part of #4480)\n if (this._glyphRenderer.value.beginFrame()) {\n this._clearModel(true);\n this._updateModel(0, this._terminal.rows - 1);\n } else {\n // just update changed lines to draw\n this._updateModel(start, end);\n }\n\n // Render\n this._rectangleRenderer.value.renderBackgrounds();\n this._glyphRenderer.value.render(this._model);\n if (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible) {\n this._rectangleRenderer.value.renderCursor();\n }\n }\n\n private _updateCursorBlink(): void {\n if (this._terminal.options.cursorBlink) {\n this._cursorBlinkStateManager.value = new CursorBlinkStateManager(() => {\n this._requestRedrawCursor();\n }, this._coreBrowserService);\n } else {\n this._cursorBlinkStateManager.clear();\n }\n // Request a refresh from the terminal as management of rendering is being\n // moved back to the terminal\n this._requestRedrawCursor();\n }\n\n private _updateModel(start: number, end: number): void {\n const terminal = this._core;\n let cell: ICellData = this._workCell;\n\n // Declare variable ahead of time to avoid garbage collection\n let lastBg: number;\n let y: number;\n let row: number;\n let line: IBufferLine;\n let joinedRanges: [number, number][];\n let isJoined: boolean;\n let lastCharX: number;\n let range: [number, number];\n let chars: string;\n let code: number;\n let width: number;\n let i: number;\n let x: number;\n let j: number;\n start = clamp(start, terminal.rows - 1, 0);\n end = clamp(end, terminal.rows - 1, 0);\n\n const cursorY = this._terminal.buffer.active.baseY + this._terminal.buffer.active.cursorY;\n const viewportRelativeCursorY = cursorY - terminal.buffer.ydisp;\n // in case cursor.x == cols adjust visual cursor to cols - 1\n const cursorX = Math.min(this._terminal.buffer.active.cursorX, terminal.cols - 1);\n let lastCursorX = -1;\n const isCursorVisible =\n this._coreService.isCursorInitialized &&\n !this._coreService.isCursorHidden &&\n (!this._cursorBlinkStateManager.value || this._cursorBlinkStateManager.value.isCursorVisible);\n this._model.cursor = undefined;\n let modelUpdated = false;\n\n for (y = start; y <= end; y++) {\n row = y + terminal.buffer.ydisp;\n line = terminal.buffer.lines.get(row)!;\n this._model.lineLengths[y] = 0;\n joinedRanges = this._characterJoinerService.getJoinedCharacters(row);\n for (x = 0; x < terminal.cols; x++) {\n lastBg = this._cellColorResolver.result.bg;\n line.loadCell(x, cell);\n\n if (x === 0) {\n lastBg = this._cellColorResolver.result.bg;\n }\n\n // If true, indicates that the current character(s) to draw were joined.\n isJoined = false;\n lastCharX = x;\n\n // Process any joined character ranges as needed. Because of how the\n // ranges are produced, we know that they are valid for the characters\n // and attributes of our input.\n if (joinedRanges.length > 0 && x === joinedRanges[0][0]) {\n isJoined = true;\n range = joinedRanges.shift()!;\n\n // We already know the exact start and end column of the joined range,\n // so we get the string and width representing it directly.\n cell = new JoinedCellData(\n cell,\n line!.translateToString(true, range[0], range[1]),\n range[1] - range[0]\n );\n\n // Skip over the cells occupied by this range in the loop\n lastCharX = range[1] - 1;\n }\n\n chars = cell.getChars();\n code = cell.getCode();\n i = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n\n // Load colors/resolve overrides into work colors\n this._cellColorResolver.resolve(cell, x, row, this.dimensions.device.cell.width);\n\n // Override colors for cursor cell\n if (isCursorVisible && row === cursorY) {\n if (x === cursorX) {\n this._model.cursor = {\n x: cursorX,\n y: viewportRelativeCursorY,\n width: cell.getWidth(),\n style: this._coreBrowserService.isFocused ?\n (terminal.options.cursorStyle || 'block') : terminal.options.cursorInactiveStyle,\n cursorWidth: terminal.options.cursorWidth,\n dpr: this._devicePixelRatio\n };\n lastCursorX = cursorX + cell.getWidth() - 1;\n }\n if (x >= cursorX && x <= lastCursorX &&\n ((this._coreBrowserService.isFocused &&\n (terminal.options.cursorStyle || 'block') === 'block') ||\n (this._coreBrowserService.isFocused === false &&\n terminal.options.cursorInactiveStyle === 'block'))) {\n this._cellColorResolver.result.fg =\n Attributes.CM_RGB | (this._themeService.colors.cursorAccent.rgba >> 8 & Attributes.RGB_MASK);\n this._cellColorResolver.result.bg =\n Attributes.CM_RGB | (this._themeService.colors.cursor.rgba >> 8 & Attributes.RGB_MASK);\n }\n }\n\n if (code !== NULL_CELL_CODE) {\n this._model.lineLengths[y] = x + 1;\n }\n\n // Nothing has changed, no updates needed\n if (this._model.cells[i] === code &&\n this._model.cells[i + RENDER_MODEL_BG_OFFSET] === this._cellColorResolver.result.bg &&\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] === this._cellColorResolver.result.fg &&\n this._model.cells[i + RENDER_MODEL_EXT_OFFSET] === this._cellColorResolver.result.ext) {\n continue;\n }\n\n modelUpdated = true;\n\n // Flag combined chars with a bit mask so they're easily identifiable\n if (chars.length > 1) {\n code |= COMBINED_CHAR_BIT_MASK;\n }\n\n // Cache the results in the model\n this._model.cells[i] = code;\n this._model.cells[i + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[i + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[i + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n\n width = cell.getWidth();\n this._glyphRenderer.value!.updateCell(x, y, code, this._cellColorResolver.result.bg, this._cellColorResolver.result.fg, this._cellColorResolver.result.ext, chars, width, lastBg);\n\n if (isJoined) {\n // Restore work cell\n cell = this._workCell;\n\n // Null out non-first cells\n for (x++; x < lastCharX; x++) {\n j = ((y * terminal.cols) + x) * RENDER_MODEL_INDICIES_PER_CELL;\n this._glyphRenderer.value!.updateCell(x, y, NULL_CELL_CODE, 0, 0, 0, NULL_CELL_CHAR, 0, 0);\n this._model.cells[j] = NULL_CELL_CODE;\n this._model.cells[j + RENDER_MODEL_BG_OFFSET] = this._cellColorResolver.result.bg;\n this._model.cells[j + RENDER_MODEL_FG_OFFSET] = this._cellColorResolver.result.fg;\n this._model.cells[j + RENDER_MODEL_EXT_OFFSET] = this._cellColorResolver.result.ext;\n }\n }\n }\n }\n if (modelUpdated) {\n this._rectangleRenderer.value!.updateBackgrounds(this._model);\n }\n this._rectangleRenderer.value!.updateCursor(this._model);\n }\n\n /**\n * Recalculates the character and canvas dimensions.\n */\n private _updateDimensions(): void {\n // Perform a new measure if the CharMeasure dimensions are not yet available\n if (!this._charSizeService.width || !this._charSizeService.height) {\n return;\n }\n\n // Calculate the device character width. Width is floored as it must be drawn to an integer grid\n // in order for the char atlas glyphs to not be blurry.\n this.dimensions.device.char.width = Math.floor(this._charSizeService.width * this._devicePixelRatio);\n\n // Calculate the device character height. Height is ceiled in case devicePixelRatio is a\n // floating point number in order to ensure there is enough space to draw the character to the\n // cell.\n this.dimensions.device.char.height = Math.ceil(this._charSizeService.height * this._devicePixelRatio);\n\n // Calculate the device cell height, if lineHeight is _not_ 1, the resulting value will be\n // floored since lineHeight can never be lower then 1, this guarentees the device cell height\n // will always be larger than device char height.\n this.dimensions.device.cell.height = Math.floor(this.dimensions.device.char.height * this._optionsService.rawOptions.lineHeight);\n\n // Calculate the y offset within a cell that glyph should draw at in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.top = this._optionsService.rawOptions.lineHeight === 1 ? 0 : Math.round((this.dimensions.device.cell.height - this.dimensions.device.char.height) / 2);\n\n // Calculate the device cell width, taking the letterSpacing into account.\n this.dimensions.device.cell.width = this.dimensions.device.char.width + Math.round(this._optionsService.rawOptions.letterSpacing);\n\n // Calculate the x offset with a cell that text should draw from in order for it to be centered\n // correctly within the cell.\n this.dimensions.device.char.left = Math.floor(this._optionsService.rawOptions.letterSpacing / 2);\n\n // Recalculate the canvas dimensions, the device dimensions define the actual number of pixel in\n // the canvas\n this.dimensions.device.canvas.height = this._terminal.rows * this.dimensions.device.cell.height;\n this.dimensions.device.canvas.width = this._terminal.cols * this.dimensions.device.cell.width;\n\n // The the size of the canvas on the page. It's important that this rounds to nearest integer\n // and not ceils as browsers often have floating point precision issues where\n // `window.devicePixelRatio` ends up being something like `1.100000023841858` for example, when\n // it's actually 1.1. Ceiling may causes blurriness as the backing canvas image is 1 pixel too\n // large for the canvas element size.\n this.dimensions.css.canvas.height = Math.round(this.dimensions.device.canvas.height / this._devicePixelRatio);\n this.dimensions.css.canvas.width = Math.round(this.dimensions.device.canvas.width / this._devicePixelRatio);\n\n // Get the CSS dimensions of an individual cell. This needs to be derived from the calculated\n // device pixel canvas value above. CharMeasure.width/height by itself is insufficient when the\n // page is not at 100% zoom level as CharMeasure is measured in CSS pixels, but the actual char\n // size on the canvas can differ.\n this.dimensions.css.cell.height = this.dimensions.device.cell.height / this._devicePixelRatio;\n this.dimensions.css.cell.width = this.dimensions.device.cell.width / this._devicePixelRatio;\n }\n\n private _setCanvasDevicePixelDimensions(width: number, height: number): void {\n if (this._canvas.width === width && this._canvas.height === height) {\n return;\n }\n // While the actual canvas size has changed, keep device canvas dimensions as the value before\n // the change as it's an exact multiple of the cell sizes.\n this._canvas.width = width;\n this._canvas.height = height;\n this._requestRedrawViewport();\n }\n\n private _requestRedrawViewport(): void {\n this._onRequestRedraw.fire({ start: 0, end: this._terminal.rows - 1 });\n }\n\n private _requestRedrawCursor(): void {\n const cursorY = this._terminal.buffer.active.cursorY;\n this._onRequestRedraw.fire({ start: cursorY, end: cursorY });\n }\n}\n\n// TODO: Share impl with core\nexport class JoinedCellData extends AttributeData implements ICellData {\n private _width: number;\n // .content carries no meaning for joined CellData, simply nullify it\n // thus we have to overload all other .content accessors\n public content: number = 0;\n public fg: number;\n public bg: number;\n public combinedData: string = '';\n\n constructor(firstCell: ICellData, chars: string, width: number) {\n super();\n this.fg = firstCell.fg;\n this.bg = firstCell.bg;\n this.combinedData = chars;\n this._width = width;\n }\n\n public isCombined(): number {\n // always mark joined cell data as combined\n return Content.IS_COMBINED_MASK;\n }\n\n public getWidth(): number {\n return this._width;\n }\n\n public getChars(): string {\n return this.combinedData;\n }\n\n public getCode(): number {\n // code always gets the highest possible fake codepoint (read as -1)\n // this is needed as code is used by caches as identifier\n return 0x1FFFFF;\n }\n\n public setFromCharData(value: CharData): void {\n throw new Error('not implemented');\n }\n\n public getAsCharData(): CharData {\n return [this.fg, this.getChars(), this.getWidth(), this.getCode()];\n }\n}\n\nfunction clamp(value: number, max: number, min: number = 0): number {\n return Math.max(Math.min(value, max), min);\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n *\n * This was heavily inspired from microsoft/vscode's dependency injection system (MIT).\n */\n/*---------------------------------------------------------------------------------------------\n * Copyright (c) Microsoft Corporation. All rights reserved.\n * Licensed under the MIT License. See License.txt in the project root for license information.\n *--------------------------------------------------------------------------------------------*/\n\nimport { IServiceIdentifier } from 'common/services/Services';\n\nconst DI_TARGET = 'di$target';\nconst DI_DEPENDENCIES = 'di$dependencies';\n\nexport const serviceRegistry: Map<string, IServiceIdentifier<any>> = new Map();\n\nexport function getServiceDependencies(ctor: any): { id: IServiceIdentifier<any>, index: number, optional: boolean }[] {\n return ctor[DI_DEPENDENCIES] || [];\n}\n\nexport function createDecorator<T>(id: string): IServiceIdentifier<T> {\n if (serviceRegistry.has(id)) {\n return serviceRegistry.get(id)!;\n }\n\n const decorator: any = function (target: Function, key: string, index: number): any {\n if (arguments.length !== 3) {\n throw new Error('@IServiceName-decorator can only be used to decorate a parameter');\n }\n\n storeServiceDependency(decorator, target, index);\n };\n\n decorator.toString = () => id;\n\n serviceRegistry.set(id, decorator);\n return decorator;\n}\n\nfunction storeServiceDependency(id: Function, target: Function, index: number): void {\n if ((target as any)[DI_TARGET] === target) {\n (target as any)[DI_DEPENDENCIES].push({ id, index });\n } else {\n (target as any)[DI_DEPENDENCIES] = [{ id, index }];\n (target as any)[DI_TARGET] = target;\n }\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { IDecoration, IDecorationOptions, ILinkHandler, ILogger, IWindowsPty } from '@xterm/xterm';\nimport { CoreMouseEncoding, CoreMouseEventType, CursorInactiveStyle, CursorStyle, IAttributeData, ICharset, IColor, ICoreMouseEvent, ICoreMouseProtocol, IDecPrivateModes, IDisposable, IModes, IOscLinkData, IWindowOptions } from 'common/Types';\nimport { IBuffer, IBufferSet } from 'common/buffer/Types';\nimport { createDecorator } from 'common/services/ServiceRegistry';\nimport type { Emitter, Event } from 'vs/base/common/event';\n\nexport const IBufferService = createDecorator<IBufferService>('BufferService');\nexport interface IBufferService {\n serviceBrand: undefined;\n\n readonly cols: number;\n readonly rows: number;\n readonly buffer: IBuffer;\n readonly buffers: IBufferSet;\n isUserScrolling: boolean;\n onResize: Event<{ cols: number, rows: number }>;\n onScroll: Event<number>;\n scroll(eraseAttr: IAttributeData, isWrapped?: boolean): void;\n scrollLines(disp: number, suppressScrollEvent?: boolean): void;\n resize(cols: number, rows: number): void;\n reset(): void;\n}\n\nexport const ICoreMouseService = createDecorator<ICoreMouseService>('CoreMouseService');\nexport interface ICoreMouseService {\n serviceBrand: undefined;\n\n activeProtocol: string;\n activeEncoding: string;\n areMouseEventsActive: boolean;\n addProtocol(name: string, protocol: ICoreMouseProtocol): void;\n addEncoding(name: string, encoding: CoreMouseEncoding): void;\n reset(): void;\n\n /**\n * Triggers a mouse event to be sent.\n *\n * Returns true if the event passed all protocol restrictions and a report\n * was sent, otherwise false. The return value may be used to decide whether\n * the default event action in the bowser component should be omitted.\n *\n * Note: The method will change values of the given event object\n * to fullfill protocol and encoding restrictions.\n */\n triggerMouseEvent(event: ICoreMouseEvent): boolean;\n\n /**\n * Event to announce changes in mouse tracking.\n */\n onProtocolChange: Event<CoreMouseEventType>;\n\n /**\n * Human readable version of mouse events.\n */\n explainEvents(events: CoreMouseEventType): { [event: string]: boolean };\n}\n\nexport const ICoreService = createDecorator<ICoreService>('CoreService');\nexport interface ICoreService {\n serviceBrand: undefined;\n\n /**\n * Initially the cursor will not be visible until the first time the terminal\n * is focused.\n */\n isCursorInitialized: boolean;\n isCursorHidden: boolean;\n\n readonly modes: IModes;\n readonly decPrivateModes: IDecPrivateModes;\n\n readonly onData: Event<string>;\n readonly onUserInput: Event<void>;\n readonly onBinary: Event<string>;\n readonly onRequestScrollToBottom: Event<void>;\n\n reset(): void;\n\n /**\n * Triggers the onData event in the public API.\n * @param data The data that is being emitted.\n * @param wasUserInput Whether the data originated from the user (as opposed to\n * resulting from parsing incoming data). When true this will also:\n * - Scroll to the bottom of the buffer if option scrollOnUserInput is true.\n * - Fire the `onUserInput` event (so selection can be cleared).\n */\n triggerDataEvent(data: string, wasUserInput?: boolean): void;\n\n /**\n * Triggers the onBinary event in the public API.\n * @param data The data that is being emitted.\n */\n triggerBinaryEvent(data: string): void;\n}\n\nexport const ICharsetService = createDecorator<ICharsetService>('CharsetService');\nexport interface ICharsetService {\n serviceBrand: undefined;\n\n charset: ICharset | undefined;\n readonly glevel: number;\n\n reset(): void;\n\n /**\n * Set the G level of the terminal.\n * @param g\n */\n setgLevel(g: number): void;\n\n /**\n * Set the charset for the given G level of the terminal.\n * @param g\n * @param charset\n */\n setgCharset(g: number, charset: ICharset | undefined): void;\n}\n\nexport interface IServiceIdentifier<T> {\n (...args: any[]): void;\n type: T;\n}\n\nexport interface IBrandedService {\n serviceBrand: undefined;\n}\n\ntype GetLeadingNonServiceArgs<TArgs extends any[]> = TArgs extends [] ? []\n : TArgs extends [...infer TFirst, infer TLast] ? TLast extends IBrandedService ? GetLeadingNonServiceArgs<TFirst> : TArgs\n : never;\n\nexport const IInstantiationService = createDecorator<IInstantiationService>('InstantiationService');\nexport interface IInstantiationService {\n serviceBrand: undefined;\n\n setService<T>(id: IServiceIdentifier<T>, instance: T): void;\n getService<T>(id: IServiceIdentifier<T>): T | undefined;\n createInstance<Ctor extends new (...args: any[]) => any, R extends InstanceType<Ctor>>(t: Ctor, ...args: GetLeadingNonServiceArgs<ConstructorParameters<Ctor>>): R;\n}\n\nexport enum LogLevelEnum {\n TRACE = 0,\n DEBUG = 1,\n INFO = 2,\n WARN = 3,\n ERROR = 4,\n OFF = 5\n}\n\nexport const ILogService = createDecorator<ILogService>('LogService');\nexport interface ILogService {\n serviceBrand: undefined;\n\n readonly logLevel: LogLevelEnum;\n\n trace(message: any, ...optionalParams: any[]): void;\n debug(message: any, ...optionalParams: any[]): void;\n info(message: any, ...optionalParams: any[]): void;\n warn(message: any, ...optionalParams: any[]): void;\n error(message: any, ...optionalParams: any[]): void;\n}\n\nexport const IOptionsService = createDecorator<IOptionsService>('OptionsService');\nexport interface IOptionsService {\n serviceBrand: undefined;\n\n /**\n * Read only access to the raw options object, this is an internal-only fast path for accessing\n * single options without any validation as we trust TypeScript to enforce correct usage\n * internally.\n */\n readonly rawOptions: Required<ITerminalOptions>;\n\n /**\n * Options as exposed through the public API, this property uses getters and setters with\n * validation which makes it safer but slower. {@link rawOptions} should be used for pretty much\n * all internal usage for performance reasons.\n */\n readonly options: Required<ITerminalOptions>;\n\n /**\n * Adds an event listener for when any option changes.\n */\n readonly onOptionChange: Event<keyof ITerminalOptions>;\n\n /**\n * Adds an event listener for when a specific option changes, this is a convenience method that is\n * preferred over {@link onOptionChange} when only a single option is being listened to.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onSpecificOptionChange<T extends keyof ITerminalOptions>(key: T, listener: (arg1: Required<ITerminalOptions>[T]) => any): IDisposable;\n\n /**\n * Adds an event listener for when a set of specific options change, this is a convenience method\n * that is preferred over {@link onOptionChange} when multiple options are being listened to and\n * handled the same way.\n */\n // eslint-disable-next-line @typescript-eslint/naming-convention\n onMultipleOptionChange(keys: (keyof ITerminalOptions)[], listener: () => any): IDisposable;\n}\n\nexport type FontWeight = 'normal' | 'bold' | '100' | '200' | '300' | '400' | '500' | '600' | '700' | '800' | '900' | number;\nexport type LogLevel = 'trace' | 'debug' | 'info' | 'warn' | 'error' | 'off';\n\nexport interface ITerminalOptions {\n allowProposedApi?: boolean;\n allowTransparency?: boolean;\n altClickMovesCursor?: boolean;\n cols?: number;\n convertEol?: boolean;\n cursorBlink?: boolean;\n cursorStyle?: CursorStyle;\n cursorWidth?: number;\n cursorInactiveStyle?: CursorInactiveStyle;\n customGlyphs?: boolean;\n disableStdin?: boolean;\n documentOverride?: any | null;\n drawBoldTextInBrightColors?: boolean;\n /** @deprecated No longer supported */\n fastScrollModifier?: 'none' | 'alt' | 'ctrl' | 'shift';\n fastScrollSensitivity?: number;\n fontSize?: number;\n fontFamily?: string;\n fontWeight?: FontWeight;\n fontWeightBold?: FontWeight;\n ignoreBracketedPasteMode?: boolean;\n letterSpacing?: number;\n lineHeight?: number;\n linkHandler?: ILinkHandler | null;\n logLevel?: LogLevel;\n logger?: ILogger | null;\n macOptionIsMeta?: boolean;\n macOptionClickForcesSelection?: boolean;\n minimumContrastRatio?: number;\n rescaleOverlappingGlyphs?: boolean;\n rightClickSelectsWord?: boolean;\n rows?: number;\n screenReaderMode?: boolean;\n scrollback?: number;\n scrollOnUserInput?: boolean;\n scrollSensitivity?: number;\n smoothScrollDuration?: number;\n tabStopWidth?: number;\n theme?: ITheme;\n windowsMode?: boolean;\n windowsPty?: IWindowsPty;\n windowOptions?: IWindowOptions;\n wordSeparator?: string;\n overviewRulerWidth?: number;\n\n [key: string]: any;\n cancelEvents: boolean;\n termName: string;\n}\n\nexport interface ITheme {\n foreground?: string;\n background?: string;\n cursor?: string;\n cursorAccent?: string;\n selectionForeground?: string;\n selectionBackground?: string;\n selectionInactiveBackground?: string;\n scrollbarSliderBackground?: string;\n scrollbarSliderHoverBackground?: string;\n scrollbarSliderActiveBackground?: string;\n overviewRulerBorder?: string;\n black?: string;\n red?: string;\n green?: string;\n yellow?: string;\n blue?: string;\n magenta?: string;\n cyan?: string;\n white?: string;\n brightBlack?: string;\n brightRed?: string;\n brightGreen?: string;\n brightYellow?: string;\n brightBlue?: string;\n brightMagenta?: string;\n brightCyan?: string;\n brightWhite?: string;\n extendedAnsi?: string[];\n}\n\nexport const IOscLinkService = createDecorator<IOscLinkService>('OscLinkService');\nexport interface IOscLinkService {\n serviceBrand: undefined;\n /**\n * Registers a link to the service, returning the link ID. The link data is managed by this\n * service and will be freed when this current cursor position is trimmed off the buffer.\n */\n registerLink(linkData: IOscLinkData): number;\n /**\n * Adds a line to a link if needed.\n */\n addLineToLink(linkId: number, y: number): void;\n /** Get the link data associated with a link ID. */\n getLinkData(linkId: number): IOscLinkData | undefined;\n}\n\n/*\n * Width and Grapheme_Cluster_Break properties of a character as a bit mask.\n *\n * bit 0: shouldJoin - should combine with preceding character.\n * bit 1..2: wcwidth - see UnicodeCharWidth.\n * bit 3..31: class of character (currently only 4 bits are used).\n * This is used to determined grapheme clustering - i.e. which codepoints\n * are to be combined into a single compound character.\n *\n * Use the UnicodeService static function createPropertyValue to create a\n * UnicodeCharProperties; use extractShouldJoin, extractWidth, and\n * extractCharKind to extract the components.\n */\nexport type UnicodeCharProperties = number;\n\n/**\n * Width in columns of a character.\n * In a CJK context, \"half-width\" characters (such as Latin) are width 1,\n * while \"full-width\" characters (such as Kanji) are 2 columns wide.\n * Combining characters (such as accents) are width 0.\n */\nexport type UnicodeCharWidth = 0 | 1 | 2;\n\nexport const IUnicodeService = createDecorator<IUnicodeService>('UnicodeService');\nexport interface IUnicodeService {\n serviceBrand: undefined;\n /** Register an Unicode version provider. */\n register(provider: IUnicodeVersionProvider): void;\n /** Registered Unicode versions. */\n readonly versions: string[];\n /** Currently active version. */\n activeVersion: string;\n /** Event triggered, when activate version changed. */\n readonly onChange: Event<string>;\n\n /**\n * Unicode version dependent\n */\n wcwidth(codepoint: number): UnicodeCharWidth;\n getStringCellWidth(s: string): number;\n /**\n * Return character width and type for grapheme clustering.\n * If preceding != 0, it is the return code from the previous character;\n * in that case the result specifies if the characters should be joined.\n */\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport interface IUnicodeVersionProvider {\n readonly version: string;\n wcwidth(ucs: number): UnicodeCharWidth;\n charProperties(codepoint: number, preceding: UnicodeCharProperties): UnicodeCharProperties;\n}\n\nexport const IDecorationService = createDecorator<IDecorationService>('DecorationService');\nexport interface IDecorationService extends IDisposable {\n serviceBrand: undefined;\n readonly decorations: IterableIterator<IInternalDecoration>;\n readonly onDecorationRegistered: Event<IInternalDecoration>;\n readonly onDecorationRemoved: Event<IInternalDecoration>;\n registerDecoration(decorationOptions: IDecorationOptions): IDecoration | undefined;\n reset(): void;\n /**\n * Trigger a callback over the decoration at a cell (in no particular order). This uses a callback\n * instead of an iterator as it's typically used in hot code paths.\n */\n forEachDecorationAtCell(x: number, line: number, layer: 'bottom' | 'top' | undefined, callback: (decoration: IInternalDecoration) => void): void;\n}\nexport interface IInternalDecoration extends IDecoration {\n readonly options: IDecorationOptions;\n readonly backgroundColorRGB: IColor | undefined;\n readonly foregroundColorRGB: IColor | undefined;\n readonly onRenderEmitter: Emitter<HTMLElement>;\n}\n", "/**\n * Copyright (c) 2019 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport { Disposable } from 'common/Lifecycle';\nimport { ILogService, IOptionsService, LogLevelEnum } from 'common/services/Services';\n\ntype LogType = (message?: any, ...optionalParams: any[]) => void;\n\ninterface IConsole {\n log: LogType;\n error: LogType;\n info: LogType;\n trace: LogType;\n warn: LogType;\n}\n\n// console is available on both node.js and browser contexts but the common\n// module doesn't depend on them so we need to explicitly declare it.\ndeclare const console: IConsole;\n\nconst optionsKeyToLogLevel: { [key: string]: LogLevelEnum } = {\n trace: LogLevelEnum.TRACE,\n debug: LogLevelEnum.DEBUG,\n info: LogLevelEnum.INFO,\n warn: LogLevelEnum.WARN,\n error: LogLevelEnum.ERROR,\n off: LogLevelEnum.OFF\n};\n\nconst LOG_PREFIX = 'xterm.js: ';\n\nexport class LogService extends Disposable implements ILogService {\n public serviceBrand: any;\n\n private _logLevel: LogLevelEnum = LogLevelEnum.OFF;\n public get logLevel(): LogLevelEnum { return this._logLevel; }\n\n constructor(\n @IOptionsService private readonly _optionsService: IOptionsService\n ) {\n super();\n this._updateLogLevel();\n this.register(this._optionsService.onSpecificOptionChange('logLevel', () => this._updateLogLevel()));\n\n // For trace logging, assume the latest created log service is valid\n traceLogger = this;\n }\n\n private _updateLogLevel(): void {\n this._logLevel = optionsKeyToLogLevel[this._optionsService.rawOptions.logLevel];\n }\n\n private _evalLazyOptionalParams(optionalParams: any[]): void {\n for (let i = 0; i < optionalParams.length; i++) {\n if (typeof optionalParams[i] === 'function') {\n optionalParams[i] = optionalParams[i]();\n }\n }\n }\n\n private _log(type: LogType, message: string, optionalParams: any[]): void {\n this._evalLazyOptionalParams(optionalParams);\n type.call(console, (this._optionsService.options.logger ? '' : LOG_PREFIX) + message, ...optionalParams);\n }\n\n public trace(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.TRACE) {\n this._log(this._optionsService.options.logger?.trace.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public debug(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.DEBUG) {\n this._log(this._optionsService.options.logger?.debug.bind(this._optionsService.options.logger) ?? console.log, message, optionalParams);\n }\n }\n\n public info(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.INFO) {\n this._log(this._optionsService.options.logger?.info.bind(this._optionsService.options.logger) ?? console.info, message, optionalParams);\n }\n }\n\n public warn(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.WARN) {\n this._log(this._optionsService.options.logger?.warn.bind(this._optionsService.options.logger) ?? console.warn, message, optionalParams);\n }\n }\n\n public error(message: string, ...optionalParams: any[]): void {\n if (this._logLevel <= LogLevelEnum.ERROR) {\n this._log(this._optionsService.options.logger?.error.bind(this._optionsService.options.logger) ?? console.error, message, optionalParams);\n }\n }\n}\n\nlet traceLogger: ILogService;\nexport function setTraceLogger(logger: ILogService): void {\n traceLogger = logger;\n}\n\n/**\n * A decorator that can be used to automatically log trace calls to the decorated function.\n */\nexport function traceCall(_target: any, key: string, descriptor: any): any {\n if (typeof descriptor.value !== 'function') {\n throw new Error('not supported');\n }\n const fnKey = 'value';\n const fn = descriptor.value;\n descriptor[fnKey] = function (...args: any[]) {\n // Early exit\n if (traceLogger.logLevel !== LogLevelEnum.TRACE) {\n return fn.apply(this, args);\n }\n\n traceLogger.trace(`GlyphRenderer#${fn.name}(${args.map(e => JSON.stringify(e)).join(', ')})`);\n const result = fn.apply(this, args);\n traceLogger.trace(`GlyphRenderer#${fn.name} return`, result);\n return result;\n };\n}\n", "/**\n * Copyright (c) 2017 The xterm.js authors. All rights reserved.\n * @license MIT\n */\n\nimport type { ITerminalAddon, Terminal } from '@xterm/xterm';\nimport type { WebglAddon as IWebglApi } from '@xterm/addon-webgl';\nimport { ICharacterJoinerService, ICharSizeService, ICoreBrowserService, IRenderService, IThemeService } from 'browser/services/Services';\nimport { ITerminal } from 'browser/Types';\nimport { Disposable, toDisposable } from 'common/Lifecycle';\nimport { getSafariVersion, isSafari } from 'common/Platform';\nimport { ICoreService, IDecorationService, ILogService, IOptionsService } from 'common/services/Services';\nimport { IWebGL2RenderingContext } from './Types';\nimport { WebglRenderer } from './WebglRenderer';\nimport { setTraceLogger } from 'common/services/LogService';\nimport { Emitter, Event } from 'vs/base/common/event';\n\nexport class WebglAddon extends Disposable implements ITerminalAddon , IWebglApi {\n private _terminal?: Terminal;\n private _renderer?: WebglRenderer;\n\n private readonly _onChangeTextureAtlas = this.register(new Emitter<HTMLCanvasElement>());\n public readonly onChangeTextureAtlas = this._onChangeTextureAtlas.event;\n private readonly _onAddTextureAtlasCanvas = this.register(new Emitter<HTMLCanvasElement>());\n public readonly onAddTextureAtlasCanvas = this._onAddTextureAtlasCanvas.event;\n private readonly _onRemoveTextureAtlasCanvas = this.register(new Emitter<HTMLCanvasElement>());\n public readonly onRemoveTextureAtlasCanvas = this._onRemoveTextureAtlasCanvas.event;\n private readonly _onContextLoss = this.register(new Emitter<void>());\n public readonly onContextLoss = this._onContextLoss.event;\n\n constructor(\n private _preserveDrawingBuffer?: boolean\n ) {\n if (isSafari && getSafariVersion() < 16) {\n // Perform an extra check to determine if Webgl2 is manually enabled in developer settings\n const contextAttributes = {\n antialias: false,\n depth: false,\n preserveDrawingBuffer: true\n };\n const gl = document.createElement('canvas').getContext('webgl2', contextAttributes) as IWebGL2RenderingContext;\n if (!gl) {\n throw new Error('Webgl2 is only supported on Safari 16 and above');\n }\n }\n super();\n }\n\n public activate(terminal: Terminal): void {\n const core = (terminal as any)._core as ITerminal;\n if (!terminal.element) {\n this.register(core.onWillOpen(() => this.activate(terminal)));\n return;\n }\n\n this._terminal = terminal;\n const coreService: ICoreService = core.coreService;\n const optionsService: IOptionsService = core.optionsService;\n\n const unsafeCore = core as any;\n const renderService: IRenderService = unsafeCore._renderService;\n const characterJoinerService: ICharacterJoinerService = unsafeCore._characterJoinerService;\n const charSizeService: ICharSizeService = unsafeCore._charSizeService;\n const coreBrowserService: ICoreBrowserService = unsafeCore._coreBrowserService;\n const decorationService: IDecorationService = unsafeCore._decorationService;\n const logService: ILogService = unsafeCore._logService;\n const themeService: IThemeService = unsafeCore._themeService;\n\n // Set trace logger just in case it hasn't been yet which could happen when the addon is\n // bundled separately to the core module\n setTraceLogger(logService);\n\n this._renderer = this.register(new WebglRenderer(\n terminal,\n characterJoinerService,\n charSizeService,\n coreBrowserService,\n coreService,\n decorationService,\n optionsService,\n themeService,\n this._preserveDrawingBuffer\n ));\n this.register(Event.forward(this._renderer.onContextLoss, this._onContextLoss));\n this.register(Event.forward(this._renderer.onChangeTextureAtlas, this._onChangeTextureAtlas));\n this.register(Event.forward(this._renderer.onAddTextureAtlasCanvas, this._onAddTextureAtlasCanvas));\n this.register(Event.forward(this._renderer.onRemoveTextureAtlasCanvas, this._onRemoveTextureAtlasCanvas));\n renderService.setRenderer(this._renderer);\n\n this.register(toDisposable(() => {\n const renderService: IRenderService = (this._terminal as any)._core._renderService;\n renderService.setRenderer((this._terminal as any)._core._createRenderer());\n renderService.handleResize(terminal.cols, terminal.rows);\n }));\n }\n\n public get textureAtlas(): HTMLCanvasElement | undefined {\n return this._renderer?.textureAtlas;\n }\n\n public clearTextureAtlas(): void {\n this._renderer?.clearTextureAtlas();\n }\n}\n"],
|
|
5
|
+
"mappings": "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EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGhC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGhC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAChC,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAC5D,SAAK,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAG5D,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EACxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAGxC,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,CAAC,EAEpE,YAAa,CAAC,CAAE,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,EAAG,CAAE,EAAG,CAAE,E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",
|
|
6
|
+
"names": ["Disposable", "d", "index", "MutableDisposable", "value", "toDisposable", "f", "disposeArray", "disposables", "getDisposeArrayDisposable", "array", "isNode", "userAgent", "platform", "isFirefox", "isLegacyEdge", "isSafari", "getSafariVersion", "majorVersion", "isMac", "isWindows", "platform", "isLinux", "isChromeOS", "userAgent", "addDisposableDomListener", "node", "type", "handler", "options", "disposed", "NULL_CELL_CHAR", "$r", "$g", "$b", "$a", "NULL_COLOR", "channels", "toCss", "r", "g", "b", "a", "toPaddedHex", "toRgba", "toColor", "color", "blend", "bg", "fg", "fgR", "fgG", "fgB", "bgR", "bgG", "bgB", "css", "rgba", "isOpaque", "ensureContrastRatio", "ratio", "result", "opaque", "rgbaColor", "opacity", "multiplyOpacity", "factor", "toColorRGB", "$ctx", "$litmusColor", "canvas", "ctx", "rgbaMatch", "rgb", "relativeLuminance", "relativeLuminance2", "rs", "gs", "bs", "rr", "rg", "rb", "bgRgba", "fgRgba", "bgL", "fgL", "contrastRatio", "resultA", "reduceLuminance", "resultARatio", "resultB", "increaseLuminance", "resultBRatio", "cr", "toChannels", "value", "c", "s", "l1", "l2", "throwIfFalsy", "value", "isPowerlineGlyph", "codepoint", "isRestrictedPowerlineGlyph", "isNerdFontGlyph", "isBoxOrBlockGlyph", "isEmoji", "allowRescaling", "width", "glyphSizeX", "deviceCellWidth", "treatGlyphAsBackgroundColor", "createRenderDimensions", "createDimension", "computeNextVariantOffset", "cellWidth", "lineWidth", "currentOffset", "$fg", "$bg", "$hasFg", "$hasBg", "$isSelected", "$colors", "$variantOffset", "CellColorResolver", "_terminal", "_optionService", "_selectionRenderModel", "_decorationService", "_coreBrowserService", "_themeService", "cell", "x", "y", "deviceCellWidth", "lineWidth", "d", "rgba", "treatGlyphAsBackgroundColor", "INVERTED_DEFAULT_COLOR", "DIM_OPACITY", "TEXT_BASELINE", "isFirefox", "isLegacyEdge", "blockElementDefinitions", "patternCharacterDefinitions", "boxDrawingDefinitions", "xp", "yp", "powerlineDefinitions", "tryDrawCustomChar", "ctx", "c", "xOffset", "yOffset", "deviceCellWidth", "deviceCellHeight", "fontSize", "devicePixelRatio", "blockElementDefinition", "blockElementDefinitions", "drawBlockElementChar", "patternDefinition", "patternCharacterDefinitions", "drawPatternChar", "boxDrawingDefinition", "boxDrawingDefinitions", "drawBoxDrawingChar", "powerlineDefinition", "drawPowerlineChar", "charDefinition", "i", "box", "xEighth", "yEighth", "cachedPatterns", "patternSet", "fillStyle", "pattern", "width", "height", "tmpCanvas", "tmpCtx", "throwIfFalsy", "imageData", "r", "g", "b", "a", "e", "y", "x", "fontWeight", "instructions", "actualInstructions", "yp", "instruction", "type", "f", "svgToCanvasInstructionMap", "args", "translateArgs", "clipRegion", "cssLineWidth", "clamp", "value", "max", "min", "cellWidth", "cellHeight", "doClamp", "leftPadding", "rightPadding", "result", "TwoKeyMap", "first", "second", "value", "FourKeyMap", "third", "fourth", "TaskQueue", "task", "deadline", "taskDuration", "longestTask", "lastDeadlineRemaining", "deadlineRemaining", "PriorityTaskQueue", "callback", "identifier", "duration", "end", "IdleTaskQueueInternal", "IdleTaskQueue", "isNode", "AttributeData", "_AttributeData", "ExtendedAttrs", "value", "newObj", "_ExtendedAttrs", "ext", "urlId", "val", "ErrorHandler", "ErrorNoTelemetry", "listener", "newUnexpectedErrorHandler", "errorHandler", "onUnexpectedError", "e", "isCancellationError", "errorHandler", "canceledName", "isCancellationError", "error", "CancellationError", "ErrorNoTelemetry", "_ErrorNoTelemetry", "msg", "err", "result", "createSingleCallFunction", "fn", "fnDidRunCallback", "_this", "didCall", "result", "findLastIdxMonotonous", "array", "predicate", "startIdx", "endIdxEx", "i", "j", "k", "_MonotonousArray", "_array", "predicate", "item", "idx", "findLastIdxMonotonous", "MonotonousArray", "CompareResult", "isLessThan", "result", "isLessThanOrEqual", "isGreaterThan", "isNeitherLessOrGreaterThan", "compareBy", "selector", "comparator", "a", "b", "numberComparator", "a", "b", "_CallbackIterable", "iterate", "handler", "item", "result", "predicate", "cb", "mapFn", "comparator", "first", "CompareResult", "_callback", "CallbackIterable", "groupBy", "data", "groupFn", "result", "element", "key", "target", "_a", "_b", "SetWithKey", "values", "toKey", "value", "key", "entry", "callbackfn", "thisArg", "SetMap", "key", "value", "values", "fn", "Iterable", "is", "thing", "_empty", "empty", "single", "element", "wrap", "iterableOrElement", "from", "iterable", "reverse", "array", "i", "isEmpty", "first", "some", "predicate", "find", "filter", "map", "fn", "index", "flatMap", "concat", "iterables", "reduce", "reducer", "initialValue", "value", "slice", "arr", "to", "consume", "atMost", "consumed", "iterator", "next", "asyncToArray", "result", "item", "TRACK_DISPOSABLES", "disposableTracker", "_DisposableTracker", "d", "val", "data", "child", "parent", "x", "disposable", "cache", "cacheValue", "result", "rootParentCache", "v", "k", "maxReported", "preComputedLeaks", "uncoveredLeakingObjs", "leakingObjects", "info", "leakingObjsSet", "o", "l", "getStackTracePath", "leaking", "removePrefix", "array", "linesToRemove", "regexp", "lines", "p", "stackTraceStarts", "SetMap", "stackTracePath", "i", "compareBy", "numberComparator", "message", "stackTraceFormattedLines", "line", "prevStarts", "continuations", "groupBy", "cont", "set", "DisposableTracker", "setDisposableTracker", "tracker", "__is_disposable_tracked__", "stack", "Disposable", "trackDisposable", "markAsDisposed", "setParentOfDisposable", "setParentOfDisposables", "children", "dispose", "arg", "Iterable", "errors", "d", "e", "combinedDisposable", "disposables", "parent", "toDisposable", "dispose", "setParentOfDisposables", "fn", "self", "trackDisposable", "createSingleCallFunction", "markAsDisposed", "_DisposableStore", "o", "setParentOfDisposable", "DisposableStore", "Disposable", "_Node", "element", "Node", "hasPerformanceNow", "StopWatch", "_StopWatch", "highResolution", "_enableListenerGCedWarning", "_enableDisposeWithListenerWarning", "_enableSnapshotPotentialLeakWarning", "Event", "Disposable", "_addLeakageTraceLogic", "options", "origListenerDidAdd", "stack", "Stacktrace", "count", "defer", "event", "disposable", "debounce", "once", "listener", "thisArgs", "disposables", "didFire", "result", "e", "map", "snapshot", "i", "forEach", "each", "filter", "signal", "any", "events", "combinedDisposable", "addAndReturnDisposable", "reduce", "merge", "initial", "output", "emitter", "Emitter", "d", "store", "delay", "leading", "flushOnListenerRemove", "leakWarningThreshold", "subscription", "handle", "numDebouncedCalls", "doFire", "cur", "_output", "accumulate", "last", "latch", "equals", "a", "b", "firstCall", "cache", "value", "shouldEmit", "split", "isT", "buffer", "flushAfterTimeout", "_buffer", "flush", "chain", "sythensize", "cs", "ChainableSynthesis", "HaltChainable", "fn", "v", "step", "fromNodeEventEmitter", "eventName", "id", "args", "onFirstListenerAdd", "onLastListenerRemove", "fromDOMEventEmitter", "toPromise", "resolve", "fromPromise", "promise", "res", "forward", "from", "to", "runAndSubscribe", "handler", "EmitterObserver", "_observable", "_change", "fromObservable", "obs", "fromObservableLight", "observable", "didChange", "observer", "DisposableStore", "_EventProfiling", "name", "listenerCount", "StopWatch", "elapsed", "EventProfiling", "_globalLeakWarningThreshold", "_LeakageMonitor", "_errorHandler", "threshold", "name", "stack", "listenerCount", "count", "topStack", "topCount", "message", "error", "ListenerLeakError", "LeakageMonitor", "Stacktrace", "_Stacktrace", "value", "err", "ListenerRefusalError", "id", "UniqueContainer", "compactionThreshold", "forEachListener", "listeners", "fn", "i", "l", "_listenerFinalizers", "_enableListenerGCedWarning", "leaks", "heldValue", "Emitter", "options", "_globalLeakWarningThreshold", "onUnexpectedError", "EventProfiling", "_enableDisposeWithListenerWarning", "callback", "thisArgs", "disposables", "tuple", "Disposable", "contained", "removeMonitor", "EventDeliveryQueuePrivate", "result", "toDisposable", "DisposableStore", "match", "listener", "index", "adjustDeliveryQueue", "n", "errorHandler", "e", "dq", "event", "EventDeliveryQueuePrivate", "emitter", "value", "end", "NULL_RASTERIZED_GLYPH", "TMP_CANVAS_GLYPH_PADDING", "$glyph", "TextureAtlas", "_TextureAtlas", "_document", "_config", "_unicodeService", "FourKeyMap", "AttributeData", "Emitter", "createCanvas", "TMP_CANVAS_GLYPH_PADDING", "throwIfFalsy", "page", "queue", "IdleTaskQueue", "i", "rasterizedGlyph", "pagesBySize", "e", "b", "sameSizeI", "size", "mergingPages", "sortedMergingPagesIndexes", "mergedPageIndex", "mergedPage", "newPage", "AtlasPage", "mergedSize", "p", "xOffset", "yOffset", "g", "index", "pageIndex", "j", "adjustingPage", "chars", "bg", "fg", "ext", "restrictToCellHeight", "code", "cacheMap", "key", "idx", "bgColorMode", "bgColor", "inverse", "dim", "NULL_COLOR", "result", "arr", "channels", "color", "fgColorMode", "fgColor", "bold", "excludeFromContrastRatioDemands", "minimumContrastColor", "DIM_OPACITY", "cache", "adjustedColor", "bgRgba", "fgRgba", "rgba", "codeOrChars", "allowedWidth", "allowedHeight", "NULL_RASTERIZED_GLYPH", "italic", "underline", "strikethrough", "overline", "temp", "temp2", "backgroundColor", "fontWeight", "fontStyle", "TEXT_BASELINE", "powerlineGlyph", "isPowerlineGlyph", "restrictedPowerlineGlyph", "isRestrictedPowerlineGlyph", "foregroundColor", "treatGlyphAsBackgroundColor", "padding", "customGlyph", "tryDrawCustomChar", "enableClearThresholdCheck", "chWidth", "lineWidth", "xLeft", "yTop", "yMid", "yBot", "nextOffset", "xChLeft", "xChRight", "xChMid", "yCurlyBot", "yCurlyTop", "clipRegion", "offsetWidth", "computeNextVariantOffset", "lineRatio", "gapRatio", "xChWidth", "line", "gap", "end", "metrics", "isBeyondCellBounds", "clearColor", "offset", "imageData", "isEmpty", "checkCompletelyTransparent", "activePage", "activeRow", "row", "wasPageAndRowFound", "candidatePage", "boundingBox", "restrictedGlyph", "height", "width", "found", "y", "x", "alphaOffset", "document", "sourcePages", "glyph", "enableThresholdCheck", "r", "fgR", "fgG", "fgB", "threshold", "canvas", "generateConfig", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "options", "colors", "devicePixelRatio", "clonedColors", "NULL_COLOR", "configEquals", "a", "b", "i", "is256Color", "colorCode", "charAtlasCache", "acquireTextureAtlas", "terminal", "options", "colors", "deviceCellWidth", "deviceCellHeight", "deviceCharWidth", "deviceCharHeight", "devicePixelRatio", "newConfig", "generateConfig", "i", "entry", "ownedByIndex", "configEquals", "core", "newEntry", "TextureAtlas", "removeTerminalFromCache", "index", "BLINK_INTERVAL", "CursorBlinkStateManager", "_renderCallback", "_coreBrowserService", "timeToStart", "time", "observeDevicePixelDimensions", "element", "parentWindow", "callback", "observer", "entries", "entry", "width", "height", "toDisposable", "stringFromCodePoint", "codePoint", "CellData", "_CellData", "AttributeData", "ExtendedAttrs", "value", "obj", "stringFromCodePoint", "combined", "code", "second", "PROJECTION_MATRIX", "createProgram", "gl", "vertexSource", "fragmentSource", "program", "throwIfFalsy", "createShader", "type", "source", "shader", "expandFloat32Array", "max", "newLength", "newArray", "i", "GLTexture", "texture", "vertexShaderSource", "createFragmentShaderSource", "maxFragmentShaderTextureUnits", "textureConditionals", "i", "INDICES_PER_CELL", "BYTES_PER_CELL", "CELL_POSITION_INDICES", "$i", "$glyph", "$leftCellPadding", "$clippedPixels", "GlyphRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_optionsService", "gl", "TextureAtlas", "throwIfFalsy", "createProgram", "toDisposable", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "textureUnits", "PROJECTION_MATRIX", "glTexture", "GLTexture", "x", "y", "code", "bg", "fg", "ext", "chars", "width", "lastBg", "array", "allowRescaling", "terminal", "newCount", "renderModel", "activeBuffer", "bufferLength", "si", "sub", "atlas", "dimensions", "SelectionRenderModel", "terminal", "start", "end", "columnSelectMode", "viewportY", "viewportStartRow", "viewportEndRow", "viewportCappedStartRow", "viewportCappedEndRow", "x", "y", "createSelectionRenderModel", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "RENDER_MODEL_EXT_OFFSET", "COMBINED_CHAR_BIT_MASK", "RenderModel", "createSelectionRenderModel", "cols", "rows", "indexCount", "vertexShaderSource", "fragmentShaderSource", "INDICES_PER_RECTANGLE", "BYTES_PER_RECTANGLE", "INITIAL_BUFFER_RECTANGLE_CAPACITY", "Vertices", "$rgba", "$x1", "$y1", "$r", "$g", "$b", "$a", "RectangleRenderer", "Disposable", "_terminal", "_gl", "_dimensions", "_themeService", "gl", "throwIfFalsy", "createProgram", "toDisposable", "unitQuadVertices", "unitQuadVerticesBuffer", "unitQuadElementIndices", "elementIndicesBuffer", "e", "vertices", "PROJECTION_MATRIX", "dimensions", "colors", "model", "terminal", "rectangleCount", "y", "x", "currentStartX", "currentBg", "currentFg", "currentInverse", "modelIndex", "bg", "fg", "inverse", "offset", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "cursor", "startX", "endX", "expandFloat32Array", "array", "x1", "y1", "width", "height", "r", "g", "b", "a", "color", "BaseRenderLayer", "Disposable", "terminal", "_container", "id", "zIndex", "_alpha", "_coreBrowserService", "_optionsService", "_themeService", "e", "toDisposable", "throwIfFalsy", "startRow", "endRow", "start", "end", "columnSelectMode", "alpha", "oldCanvas", "colorSet", "acquireTextureAtlas", "dim", "x", "y", "width", "height", "cell", "TEXT_BASELINE", "isBold", "isItalic", "fontWeight", "LinkRenderLayer", "BaseRenderLayer", "container", "zIndex", "terminal", "linkifier2", "coreBrowserService", "optionsService", "themeService", "e", "dim", "middleRowCount", "INVERTED_DEFAULT_COLOR", "is256Color", "y", "WebglRenderer", "Disposable", "_terminal", "_characterJoinerService", "_charSizeService", "_coreBrowserService", "_coreService", "_decorationService", "_optionsService", "_themeService", "preserveDrawingBuffer", "MutableDisposable", "RenderModel", "CellData", "Emitter", "CellColorResolver", "LinkRenderLayer", "createRenderDimensions", "contextAttributes", "addDisposableDomListener", "e", "removeTerminalFromCache", "observeDevicePixelDimensions", "w", "h", "toDisposable", "l", "cols", "rows", "start", "end", "columnSelectMode", "RectangleRenderer", "GlyphRenderer", "atlas", "acquireTextureAtlas", "getDisposeArrayDisposable", "Event", "clearGlyphRenderer", "handler", "joinerId", "CursorBlinkStateManager", "terminal", "cell", "lastBg", "y", "row", "line", "joinedRanges", "isJoined", "lastCharX", "range", "chars", "code", "width", "i", "x", "j", "clamp", "cursorY", "viewportRelativeCursorY", "cursorX", "lastCursorX", "isCursorVisible", "modelUpdated", "JoinedCellData", "RENDER_MODEL_INDICIES_PER_CELL", "RENDER_MODEL_BG_OFFSET", "RENDER_MODEL_FG_OFFSET", "RENDER_MODEL_EXT_OFFSET", "COMBINED_CHAR_BIT_MASK", "NULL_CELL_CHAR", "height", "AttributeData", "firstCell", "value", "max", "min", "DI_TARGET", "DI_DEPENDENCIES", "serviceRegistry", "createDecorator", "id", "serviceRegistry", "decorator", "target", "key", "index", "storeServiceDependency", "DI_TARGET", "DI_DEPENDENCIES", "IBufferService", "createDecorator", "ICoreMouseService", "ICoreService", "ICharsetService", "IInstantiationService", "ILogService", "createDecorator", "IOptionsService", "IOscLinkService", "IUnicodeService", "IDecorationService", "optionsKeyToLogLevel", "LOG_PREFIX", "LogService", "Disposable", "_optionsService", "traceLogger", "optionalParams", "i", "type", "message", "__decorateClass", "__decorateParam", "IOptionsService", "setTraceLogger", "logger", "WebglAddon", "Disposable", "_preserveDrawingBuffer", "isSafari", "getSafariVersion", "contextAttributes", "Emitter", "terminal", "core", "coreService", "optionsService", "unsafeCore", "renderService", "characterJoinerService", "charSizeService", "coreBrowserService", "decorationService", "logService", "themeService", "setTraceLogger", "WebglRenderer", "Event", "toDisposable"]
|
|
7
7
|
}
|