@profullstack/hqtui 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -0
- package/dist/ansi.d.ts +42 -0
- package/dist/ansi.d.ts.map +1 -0
- package/dist/ansi.js +66 -0
- package/dist/ansi.js.map +1 -0
- package/dist/app.d.ts +128 -0
- package/dist/app.d.ts.map +1 -0
- package/dist/app.js +296 -0
- package/dist/app.js.map +1 -0
- package/dist/buffer.d.ts +50 -0
- package/dist/buffer.d.ts.map +1 -0
- package/dist/buffer.js +184 -0
- package/dist/buffer.js.map +1 -0
- package/dist/capabilities.d.ts +36 -0
- package/dist/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +93 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/color.d.ts +47 -0
- package/dist/color.d.ts.map +1 -0
- package/dist/color.js +176 -0
- package/dist/color.js.map +1 -0
- package/dist/diff.d.ts +39 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +203 -0
- package/dist/diff.js.map +1 -0
- package/dist/graphics/blocks.d.ts +26 -0
- package/dist/graphics/blocks.d.ts.map +1 -0
- package/dist/graphics/blocks.js +49 -0
- package/dist/graphics/blocks.js.map +1 -0
- package/dist/graphics/braille.d.ts +33 -0
- package/dist/graphics/braille.d.ts.map +1 -0
- package/dist/graphics/braille.js +166 -0
- package/dist/graphics/braille.js.map +1 -0
- package/dist/graphics/index.d.ts +4 -0
- package/dist/graphics/index.d.ts.map +1 -0
- package/dist/graphics/index.js +4 -0
- package/dist/graphics/index.js.map +1 -0
- package/dist/graphics/plot.d.ts +91 -0
- package/dist/graphics/plot.d.ts.map +1 -0
- package/dist/graphics/plot.js +291 -0
- package/dist/graphics/plot.js.map +1 -0
- package/dist/index.d.ts +34 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/input.d.ts +62 -0
- package/dist/input.d.ts.map +1 -0
- package/dist/input.js +245 -0
- package/dist/input.js.map +1 -0
- package/dist/layout.d.ts +51 -0
- package/dist/layout.d.ts.map +1 -0
- package/dist/layout.js +163 -0
- package/dist/layout.js.map +1 -0
- package/dist/surface.d.ts +81 -0
- package/dist/surface.d.ts.map +1 -0
- package/dist/surface.js +181 -0
- package/dist/surface.js.map +1 -0
- package/dist/terminal.d.ts +63 -0
- package/dist/terminal.d.ts.map +1 -0
- package/dist/terminal.js +189 -0
- package/dist/terminal.js.map +1 -0
- package/dist/testing.d.ts +71 -0
- package/dist/testing.d.ts.map +1 -0
- package/dist/testing.js +171 -0
- package/dist/testing.js.map +1 -0
- package/dist/theme.d.ts +58 -0
- package/dist/theme.d.ts.map +1 -0
- package/dist/theme.js +238 -0
- package/dist/theme.js.map +1 -0
- package/dist/ui.d.ts +194 -0
- package/dist/ui.d.ts.map +1 -0
- package/dist/ui.js +439 -0
- package/dist/ui.js.map +1 -0
- package/dist/unicode.d.ts +36 -0
- package/dist/unicode.d.ts.map +1 -0
- package/dist/unicode.js +221 -0
- package/dist/unicode.js.map +1 -0
- package/dist/widgets/controls.d.ts +95 -0
- package/dist/widgets/controls.d.ts.map +1 -0
- package/dist/widgets/controls.js +231 -0
- package/dist/widgets/controls.js.map +1 -0
- package/dist/widgets/index.d.ts +5 -0
- package/dist/widgets/index.d.ts.map +1 -0
- package/dist/widgets/index.js +5 -0
- package/dist/widgets/index.js.map +1 -0
- package/dist/widgets/meters.d.ts +100 -0
- package/dist/widgets/meters.d.ts.map +1 -0
- package/dist/widgets/meters.js +209 -0
- package/dist/widgets/meters.js.map +1 -0
- package/dist/widgets/table.d.ts +92 -0
- package/dist/widgets/table.d.ts.map +1 -0
- package/dist/widgets/table.js +228 -0
- package/dist/widgets/table.js.map +1 -0
- package/dist/widgets/text.d.ts +64 -0
- package/dist/widgets/text.d.ts.map +1 -0
- package/dist/widgets/text.js +123 -0
- package/dist/widgets/text.js.map +1 -0
- package/package.json +56 -0
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What the terminal can actually do. Detection is deliberately conservative:
|
|
3
|
+
* we degrade colors and glyphs rather than print mojibake on someone's console.
|
|
4
|
+
*/
|
|
5
|
+
function detectProgram(env) {
|
|
6
|
+
if (env.KITTY_WINDOW_ID || env.TERM === "xterm-kitty")
|
|
7
|
+
return "kitty";
|
|
8
|
+
if (env.WEZTERM_EXECUTABLE || env.TERM_PROGRAM === "WezTerm")
|
|
9
|
+
return "wezterm";
|
|
10
|
+
if (env.GHOSTTY_RESOURCES_DIR || env.TERM === "xterm-ghostty")
|
|
11
|
+
return "ghostty";
|
|
12
|
+
if (env.TERM_PROGRAM === "iTerm.app")
|
|
13
|
+
return "iterm";
|
|
14
|
+
if (env.ALACRITTY_WINDOW_ID || env.TERM === "alacritty")
|
|
15
|
+
return "alacritty";
|
|
16
|
+
if (env.TERM_PROGRAM === "vscode")
|
|
17
|
+
return "vscode";
|
|
18
|
+
if (env.WT_SESSION)
|
|
19
|
+
return "windows-terminal";
|
|
20
|
+
if (env.TERM_PROGRAM === "Apple_Terminal")
|
|
21
|
+
return "apple-terminal";
|
|
22
|
+
if (env.KONSOLE_VERSION)
|
|
23
|
+
return "konsole";
|
|
24
|
+
if ((env.TERM ?? "").startsWith("xterm"))
|
|
25
|
+
return "xterm";
|
|
26
|
+
return "unknown";
|
|
27
|
+
}
|
|
28
|
+
function detectColors(env, tty) {
|
|
29
|
+
if (env.NO_COLOR !== undefined && env.NO_COLOR !== "")
|
|
30
|
+
return "none";
|
|
31
|
+
if (env.FORCE_COLOR === "0")
|
|
32
|
+
return "none";
|
|
33
|
+
if (env.FORCE_COLOR === "1")
|
|
34
|
+
return "ansi16";
|
|
35
|
+
if (env.FORCE_COLOR === "2")
|
|
36
|
+
return "ansi256";
|
|
37
|
+
if (env.FORCE_COLOR === "3")
|
|
38
|
+
return "truecolor";
|
|
39
|
+
if (!tty)
|
|
40
|
+
return "none";
|
|
41
|
+
const term = env.TERM ?? "";
|
|
42
|
+
if (term === "dumb")
|
|
43
|
+
return "none";
|
|
44
|
+
const colorterm = (env.COLORTERM ?? "").toLowerCase();
|
|
45
|
+
if (colorterm === "truecolor" || colorterm === "24bit")
|
|
46
|
+
return "truecolor";
|
|
47
|
+
const program = detectProgram(env);
|
|
48
|
+
if (["kitty", "wezterm", "ghostty", "iterm", "vscode", "windows-terminal", "konsole"].includes(program)) {
|
|
49
|
+
return "truecolor";
|
|
50
|
+
}
|
|
51
|
+
if (term.includes("256"))
|
|
52
|
+
return "ansi256";
|
|
53
|
+
if (term === "")
|
|
54
|
+
return "ansi16";
|
|
55
|
+
return "ansi16";
|
|
56
|
+
}
|
|
57
|
+
function detectUnicode(env) {
|
|
58
|
+
const locale = env.LC_ALL || env.LC_CTYPE || env.LANG || "";
|
|
59
|
+
if (/UTF-?8/i.test(locale))
|
|
60
|
+
return true;
|
|
61
|
+
// Windows Terminal and modern emulators are UTF-8 regardless of locale vars.
|
|
62
|
+
if (env.WT_SESSION || env.TERM_PROGRAM || env.KITTY_WINDOW_ID)
|
|
63
|
+
return true;
|
|
64
|
+
return process.platform === "win32" ? Boolean(env.WT_SESSION) : locale === "";
|
|
65
|
+
}
|
|
66
|
+
export function detectCapabilities(overrides = {}, env = process.env, stream = process.stdout) {
|
|
67
|
+
const tty = overrides.tty ?? Boolean(stream.isTTY);
|
|
68
|
+
const term = env.TERM ?? "";
|
|
69
|
+
const program = detectProgram(env);
|
|
70
|
+
const tmux = Boolean(env.TMUX) || term.startsWith("tmux") || term.startsWith("screen");
|
|
71
|
+
const screen = term.startsWith("screen") && !env.TMUX;
|
|
72
|
+
const ssh = Boolean(env.SSH_CLIENT || env.SSH_TTY || env.SSH_CONNECTION);
|
|
73
|
+
const colors = overrides.colors ?? detectColors(env, tty);
|
|
74
|
+
const unicode = overrides.unicode ?? detectUnicode(env);
|
|
75
|
+
const syncCapable = ["kitty", "wezterm", "ghostty", "iterm", "windows-terminal", "konsole", "alacritty"].includes(program) || tmux;
|
|
76
|
+
return {
|
|
77
|
+
tty,
|
|
78
|
+
colors,
|
|
79
|
+
trueColor: colors === "truecolor",
|
|
80
|
+
unicode,
|
|
81
|
+
braille: overrides.braille ?? (unicode && program !== "apple-terminal"),
|
|
82
|
+
mouse: overrides.mouse ?? (tty && term !== "dumb" && term !== "linux"),
|
|
83
|
+
synchronizedOutput: overrides.synchronizedOutput ?? (tty && syncCapable),
|
|
84
|
+
bracketedPaste: tty && term !== "dumb",
|
|
85
|
+
focusEvents: tty && term !== "dumb" && !screen,
|
|
86
|
+
tmux,
|
|
87
|
+
screen,
|
|
88
|
+
ssh,
|
|
89
|
+
windows: process.platform === "win32",
|
|
90
|
+
program,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=capabilities.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
|
package/dist/color.d.ts
ADDED
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Colors are packed into a single 32-bit integer so a cell never needs an object.
|
|
3
|
+
*
|
|
4
|
+
* 0 -> "terminal default"
|
|
5
|
+
* 0x1000000 | 0xRRGGBB -> truecolor
|
|
6
|
+
* 0x2000000 | index -> explicit 256-colour palette index
|
|
7
|
+
*/
|
|
8
|
+
export type Color = number;
|
|
9
|
+
export declare const DEFAULT_COLOR: Color;
|
|
10
|
+
/** Truecolor from 0-255 components. */
|
|
11
|
+
export declare function rgb(r: number, g: number, b: number): Color;
|
|
12
|
+
/** `hex("#00d7ff")`, `hex("#0df")` or `hex(0x00d7ff)`. */
|
|
13
|
+
export declare function hex(value: string | number): Color;
|
|
14
|
+
/** An explicit xterm-256 palette entry (rarely needed; truecolor is quantized for you). */
|
|
15
|
+
export declare function ansi256(index: number): Color;
|
|
16
|
+
export declare function isDefault(c: Color): boolean;
|
|
17
|
+
export declare function red(c: Color): number;
|
|
18
|
+
export declare function green(c: Color): number;
|
|
19
|
+
export declare function blue(c: Color): number;
|
|
20
|
+
/** Mix two colors. `t` of 0 returns `a`, 1 returns `b`. Software alpha — terminals have none. */
|
|
21
|
+
export declare function mix(a: Color, b: Color, t: number): Color;
|
|
22
|
+
/** Blend a color over a background at `alpha` (0-1). Used for subtle fills and shadows. */
|
|
23
|
+
export declare function alpha(fg: Color, bg: Color, a: number): Color;
|
|
24
|
+
export declare function lighten(c: Color, amount?: number): Color;
|
|
25
|
+
export declare function darken(c: Color, amount?: number): Color;
|
|
26
|
+
/** Relative luminance, 0-1. */
|
|
27
|
+
export declare function luminance(c: Color): number;
|
|
28
|
+
/** WCAG contrast ratio between two colors (1-21). */
|
|
29
|
+
export declare function contrast(a: Color, b: Color): number;
|
|
30
|
+
/**
|
|
31
|
+
* A multi-stop gradient. Returns a sampler: `g(0)` is the first stop, `g(1)` the last.
|
|
32
|
+
*
|
|
33
|
+
* const heat = gradient(["#00d7ff", "#5fff87", "#ffd75f", "#ff5f5f"]);
|
|
34
|
+
* heat(0.75);
|
|
35
|
+
*/
|
|
36
|
+
export declare function gradient(stops: (Color | string)[]): (t: number) => Color;
|
|
37
|
+
/** Sample `n` evenly spaced colors from a gradient. */
|
|
38
|
+
export declare function gradientSteps(stops: (Color | string)[], n: number): Color[];
|
|
39
|
+
/** Quantize truecolor to the xterm-256 palette (used when COLORTERM is absent). */
|
|
40
|
+
export declare function to256(c: Color): number;
|
|
41
|
+
/** Quantize truecolor to the 16-color palette (last-resort terminals). */
|
|
42
|
+
export declare function to16(c: Color): number;
|
|
43
|
+
/** Convert a 256-palette index back to truecolor. */
|
|
44
|
+
export declare function from256(index: number): Color;
|
|
45
|
+
/** Desaturate towards grey — powers `monochrome` mode. */
|
|
46
|
+
export declare function grayscale(c: Color): Color;
|
|
47
|
+
//# sourceMappingURL=color.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.d.ts","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,KAAK,GAAG,MAAM,CAAC;AAE3B,eAAO,MAAM,aAAa,EAAE,KAAS,CAAC;AAItC,uCAAuC;AACvC,wBAAgB,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAE1D;AAED,0DAA0D;AAC1D,wBAAgB,GAAG,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,KAAK,CAKjD;AAED,2FAA2F;AAC3F,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAE5C;AAED,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,OAAO,CAE3C;AAED,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAEpC;AACD,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAEtC;AACD,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAErC;AAED,iGAAiG;AACjG,wBAAgB,GAAG,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAQxD;AAED,2FAA2F;AAC3F,wBAAgB,KAAK,CAAC,EAAE,EAAE,KAAK,EAAE,EAAE,EAAE,KAAK,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,CAE5D;AAED,wBAAgB,OAAO,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,SAAM,GAAG,KAAK,CAErD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,MAAM,SAAM,GAAG,KAAK,CAEpD;AAED,+BAA+B;AAC/B,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAM1C;AAED,qDAAqD;AACrD,wBAAgB,QAAQ,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,KAAK,GAAG,MAAM,CAInD;AAED;;;;;GAKG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,GAAG,CAAC,CAAC,EAAE,MAAM,KAAK,KAAK,CAUxE;AAED,uDAAuD;AACvD,wBAAgB,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,GAAG,MAAM,CAAC,EAAE,EAAE,CAAC,EAAE,MAAM,GAAG,KAAK,EAAE,CAK3E;AAiBD,mFAAmF;AACnF,wBAAgB,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAYtC;AASD,0EAA0E;AAC1E,wBAAgB,IAAI,CAAC,CAAC,EAAE,KAAK,GAAG,MAAM,CAmBrC;AAED,qDAAqD;AACrD,wBAAgB,OAAO,CAAC,KAAK,EAAE,MAAM,GAAG,KAAK,CAY5C;AAED,0DAA0D;AAC1D,wBAAgB,SAAS,CAAC,CAAC,EAAE,KAAK,GAAG,KAAK,CAIzC"}
|
package/dist/color.js
ADDED
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Colors are packed into a single 32-bit integer so a cell never needs an object.
|
|
3
|
+
*
|
|
4
|
+
* 0 -> "terminal default"
|
|
5
|
+
* 0x1000000 | 0xRRGGBB -> truecolor
|
|
6
|
+
* 0x2000000 | index -> explicit 256-colour palette index
|
|
7
|
+
*/
|
|
8
|
+
export const DEFAULT_COLOR = 0;
|
|
9
|
+
const RGB_FLAG = 0x1000000;
|
|
10
|
+
const IDX_FLAG = 0x2000000;
|
|
11
|
+
/** Truecolor from 0-255 components. */
|
|
12
|
+
export function rgb(r, g, b) {
|
|
13
|
+
return RGB_FLAG | ((r & 255) << 16) | ((g & 255) << 8) | (b & 255);
|
|
14
|
+
}
|
|
15
|
+
/** `hex("#00d7ff")`, `hex("#0df")` or `hex(0x00d7ff)`. */
|
|
16
|
+
export function hex(value) {
|
|
17
|
+
if (typeof value === "number")
|
|
18
|
+
return RGB_FLAG | (value & 0xffffff);
|
|
19
|
+
let s = value.trim().replace(/^#/, "");
|
|
20
|
+
if (s.length === 3)
|
|
21
|
+
s = s[0] + s[0] + s[1] + s[1] + s[2] + s[2];
|
|
22
|
+
return RGB_FLAG | (Number.parseInt(s, 16) & 0xffffff);
|
|
23
|
+
}
|
|
24
|
+
/** An explicit xterm-256 palette entry (rarely needed; truecolor is quantized for you). */
|
|
25
|
+
export function ansi256(index) {
|
|
26
|
+
return IDX_FLAG | (index & 255);
|
|
27
|
+
}
|
|
28
|
+
export function isDefault(c) {
|
|
29
|
+
return c === DEFAULT_COLOR;
|
|
30
|
+
}
|
|
31
|
+
export function red(c) {
|
|
32
|
+
return (c >> 16) & 255;
|
|
33
|
+
}
|
|
34
|
+
export function green(c) {
|
|
35
|
+
return (c >> 8) & 255;
|
|
36
|
+
}
|
|
37
|
+
export function blue(c) {
|
|
38
|
+
return c & 255;
|
|
39
|
+
}
|
|
40
|
+
/** Mix two colors. `t` of 0 returns `a`, 1 returns `b`. Software alpha — terminals have none. */
|
|
41
|
+
export function mix(a, b, t) {
|
|
42
|
+
if (isDefault(a) || isDefault(b))
|
|
43
|
+
return t < 0.5 ? a : b;
|
|
44
|
+
const k = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
45
|
+
return rgb(Math.round(red(a) + (red(b) - red(a)) * k), Math.round(green(a) + (green(b) - green(a)) * k), Math.round(blue(a) + (blue(b) - blue(a)) * k));
|
|
46
|
+
}
|
|
47
|
+
/** Blend a color over a background at `alpha` (0-1). Used for subtle fills and shadows. */
|
|
48
|
+
export function alpha(fg, bg, a) {
|
|
49
|
+
return mix(bg, fg, a);
|
|
50
|
+
}
|
|
51
|
+
export function lighten(c, amount = 0.2) {
|
|
52
|
+
return mix(c, rgb(255, 255, 255), amount);
|
|
53
|
+
}
|
|
54
|
+
export function darken(c, amount = 0.2) {
|
|
55
|
+
return mix(c, rgb(0, 0, 0), amount);
|
|
56
|
+
}
|
|
57
|
+
/** Relative luminance, 0-1. */
|
|
58
|
+
export function luminance(c) {
|
|
59
|
+
const f = (v) => {
|
|
60
|
+
const x = v / 255;
|
|
61
|
+
return x <= 0.03928 ? x / 12.92 : ((x + 0.055) / 1.055) ** 2.4;
|
|
62
|
+
};
|
|
63
|
+
return 0.2126 * f(red(c)) + 0.7152 * f(green(c)) + 0.0722 * f(blue(c));
|
|
64
|
+
}
|
|
65
|
+
/** WCAG contrast ratio between two colors (1-21). */
|
|
66
|
+
export function contrast(a, b) {
|
|
67
|
+
const la = luminance(a);
|
|
68
|
+
const lb = luminance(b);
|
|
69
|
+
return (Math.max(la, lb) + 0.05) / (Math.min(la, lb) + 0.05);
|
|
70
|
+
}
|
|
71
|
+
/**
|
|
72
|
+
* A multi-stop gradient. Returns a sampler: `g(0)` is the first stop, `g(1)` the last.
|
|
73
|
+
*
|
|
74
|
+
* const heat = gradient(["#00d7ff", "#5fff87", "#ffd75f", "#ff5f5f"]);
|
|
75
|
+
* heat(0.75);
|
|
76
|
+
*/
|
|
77
|
+
export function gradient(stops) {
|
|
78
|
+
const cols = stops.map((s) => (typeof s === "string" ? hex(s) : s));
|
|
79
|
+
if (cols.length === 0)
|
|
80
|
+
return () => DEFAULT_COLOR;
|
|
81
|
+
if (cols.length === 1)
|
|
82
|
+
return () => cols[0];
|
|
83
|
+
return (t) => {
|
|
84
|
+
const k = t < 0 ? 0 : t > 1 ? 1 : t;
|
|
85
|
+
const pos = k * (cols.length - 1);
|
|
86
|
+
const i = Math.min(Math.floor(pos), cols.length - 2);
|
|
87
|
+
return mix(cols[i], cols[i + 1], pos - i);
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
/** Sample `n` evenly spaced colors from a gradient. */
|
|
91
|
+
export function gradientSteps(stops, n) {
|
|
92
|
+
const g = gradient(stops);
|
|
93
|
+
const out = [];
|
|
94
|
+
for (let i = 0; i < n; i++)
|
|
95
|
+
out.push(g(n === 1 ? 0 : i / (n - 1)));
|
|
96
|
+
return out;
|
|
97
|
+
}
|
|
98
|
+
const CUBE = [0, 95, 135, 175, 215, 255];
|
|
99
|
+
function nearestCubeIndex(v) {
|
|
100
|
+
let best = 0;
|
|
101
|
+
let bestD = Infinity;
|
|
102
|
+
for (let i = 0; i < 6; i++) {
|
|
103
|
+
const d = Math.abs(CUBE[i] - v);
|
|
104
|
+
if (d < bestD) {
|
|
105
|
+
bestD = d;
|
|
106
|
+
best = i;
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return best;
|
|
110
|
+
}
|
|
111
|
+
/** Quantize truecolor to the xterm-256 palette (used when COLORTERM is absent). */
|
|
112
|
+
export function to256(c) {
|
|
113
|
+
if ((c & IDX_FLAG) !== 0)
|
|
114
|
+
return c & 255;
|
|
115
|
+
const r = red(c);
|
|
116
|
+
const g = green(c);
|
|
117
|
+
const b = blue(c);
|
|
118
|
+
// Grey ramp often beats the cube for desaturated colors.
|
|
119
|
+
if (Math.abs(r - g) < 8 && Math.abs(g - b) < 8) {
|
|
120
|
+
if (r < 8)
|
|
121
|
+
return 16;
|
|
122
|
+
if (r > 248)
|
|
123
|
+
return 231;
|
|
124
|
+
return 232 + Math.round(((r - 8) / 247) * 24);
|
|
125
|
+
}
|
|
126
|
+
return 16 + 36 * nearestCubeIndex(r) + 6 * nearestCubeIndex(g) + nearestCubeIndex(b);
|
|
127
|
+
}
|
|
128
|
+
const BASE16 = [
|
|
129
|
+
[0, 0, 0], [205, 49, 49], [13, 188, 121], [229, 229, 16],
|
|
130
|
+
[36, 114, 200], [188, 63, 188], [17, 168, 205], [229, 229, 229],
|
|
131
|
+
[102, 102, 102], [241, 76, 76], [35, 209, 139], [245, 245, 67],
|
|
132
|
+
[59, 142, 234], [214, 112, 214], [41, 184, 219], [255, 255, 255],
|
|
133
|
+
];
|
|
134
|
+
/** Quantize truecolor to the 16-color palette (last-resort terminals). */
|
|
135
|
+
export function to16(c) {
|
|
136
|
+
if ((c & IDX_FLAG) !== 0) {
|
|
137
|
+
const i = c & 255;
|
|
138
|
+
return i < 16 ? i : to16(from256(i));
|
|
139
|
+
}
|
|
140
|
+
const r = red(c);
|
|
141
|
+
const g = green(c);
|
|
142
|
+
const b = blue(c);
|
|
143
|
+
let best = 7;
|
|
144
|
+
let bestD = Infinity;
|
|
145
|
+
for (let i = 0; i < 16; i++) {
|
|
146
|
+
const [br, bg, bb] = BASE16[i];
|
|
147
|
+
const d = (r - br) ** 2 + (g - bg) ** 2 + (b - bb) ** 2;
|
|
148
|
+
if (d < bestD) {
|
|
149
|
+
bestD = d;
|
|
150
|
+
best = i;
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
return best;
|
|
154
|
+
}
|
|
155
|
+
/** Convert a 256-palette index back to truecolor. */
|
|
156
|
+
export function from256(index) {
|
|
157
|
+
const i = index & 255;
|
|
158
|
+
if (i < 16) {
|
|
159
|
+
const [r, g, b] = BASE16[i];
|
|
160
|
+
return rgb(r, g, b);
|
|
161
|
+
}
|
|
162
|
+
if (i >= 232) {
|
|
163
|
+
const v = 8 + (i - 232) * 10;
|
|
164
|
+
return rgb(v, v, v);
|
|
165
|
+
}
|
|
166
|
+
const n = i - 16;
|
|
167
|
+
return rgb(CUBE[Math.floor(n / 36) % 6], CUBE[Math.floor(n / 6) % 6], CUBE[n % 6]);
|
|
168
|
+
}
|
|
169
|
+
/** Desaturate towards grey — powers `monochrome` mode. */
|
|
170
|
+
export function grayscale(c) {
|
|
171
|
+
if (isDefault(c))
|
|
172
|
+
return c;
|
|
173
|
+
const v = Math.round(0.299 * red(c) + 0.587 * green(c) + 0.114 * blue(c));
|
|
174
|
+
return rgb(v, v, v);
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=color.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"color.js","sourceRoot":"","sources":["../src/color.ts"],"names":[],"mappings":"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"}
|
package/dist/diff.d.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { FrameBuffer } from "./buffer.ts";
|
|
2
|
+
import type { Capabilities } from "./capabilities.ts";
|
|
3
|
+
export interface EncodeResult {
|
|
4
|
+
/** The bytes to hand to stdout. */
|
|
5
|
+
output: string;
|
|
6
|
+
changedCells: number;
|
|
7
|
+
/** Rows that contained at least one change. */
|
|
8
|
+
dirtyRows: number;
|
|
9
|
+
}
|
|
10
|
+
export interface EncoderOptions {
|
|
11
|
+
colors?: Capabilities["colors"];
|
|
12
|
+
/** Drain all color, keeping attributes. */
|
|
13
|
+
monochrome?: boolean;
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Turns two framebuffers into the smallest practical stream of escape sequences.
|
|
17
|
+
* It keeps a model of the terminal's current pen so no redundant SGR is emitted.
|
|
18
|
+
*/
|
|
19
|
+
export declare class Encoder {
|
|
20
|
+
private state;
|
|
21
|
+
private parts;
|
|
22
|
+
colors: Capabilities["colors"];
|
|
23
|
+
monochrome: boolean;
|
|
24
|
+
constructor(options?: EncoderOptions);
|
|
25
|
+
/** Forget what we believe about the terminal; the next write re-states everything. */
|
|
26
|
+
invalidateState(): void;
|
|
27
|
+
private fgSeq;
|
|
28
|
+
private bgSeq;
|
|
29
|
+
private applyStyle;
|
|
30
|
+
private moveCursor;
|
|
31
|
+
/**
|
|
32
|
+
* Encode the difference between `prev` and `next`.
|
|
33
|
+
* Pass `full` to repaint every cell (first frame, resize, or after a redraw request).
|
|
34
|
+
*/
|
|
35
|
+
encode(prev: FrameBuffer, next: FrameBuffer, full?: boolean): EncodeResult;
|
|
36
|
+
}
|
|
37
|
+
/** One-shot encode of a whole buffer, e.g. for `renderToAnsi` in tests. */
|
|
38
|
+
export declare function encodeFull(buffer: FrameBuffer, options?: EncoderOptions): string;
|
|
39
|
+
//# sourceMappingURL=diff.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.d.ts","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAE/C,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAuBtD,MAAM,WAAW,YAAY;IAC3B,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;IACf,YAAY,EAAE,MAAM,CAAC;IACrB,+CAA+C;IAC/C,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,cAAc;IAC7B,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAChC,2CAA2C;IAC3C,UAAU,CAAC,EAAE,OAAO,CAAC;CACtB;AAED;;;GAGG;AACH,qBAAa,OAAO;IAClB,OAAO,CAAC,KAAK,CAAiG;IAC9G,OAAO,CAAC,KAAK,CAAgB;IAC7B,MAAM,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC/B,UAAU,EAAE,OAAO,CAAC;gBAER,OAAO,GAAE,cAAmB;IAKxC,sFAAsF;IACtF,eAAe,IAAI,IAAI;IAKvB,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,KAAK;IASb,OAAO,CAAC,UAAU;IAqClB,OAAO,CAAC,UAAU;IAoBlB;;;OAGG;IACH,MAAM,CAAC,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,UAAQ,GAAG,YAAY;CA4EzE;AAED,2EAA2E;AAC3E,wBAAgB,UAAU,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,GAAE,cAAmB,GAAG,MAAM,CAIpF"}
|
package/dist/diff.js
ADDED
|
@@ -0,0 +1,203 @@
|
|
|
1
|
+
import { Attr } from "./buffer.js";
|
|
2
|
+
import { DEFAULT_COLOR, blue, green, grayscale, red, to16, to256 } from "./color.js";
|
|
3
|
+
import { CSI, bg16, bg256, bgDefault, bgTrue, fg16, fg256, fgDefault, fgTrue, moveTo, moveToColumn, moveRight, } from "./ansi.js";
|
|
4
|
+
import { CONTINUATION, cellText, cellWidth } from "./unicode.js";
|
|
5
|
+
/**
|
|
6
|
+
* Rewriting up to this many unchanged cells is cheaper than the escape sequence
|
|
7
|
+
* needed to jump over them, so neighbouring dirty spans get merged.
|
|
8
|
+
*/
|
|
9
|
+
const GAP_MERGE = 5;
|
|
10
|
+
/**
|
|
11
|
+
* Turns two framebuffers into the smallest practical stream of escape sequences.
|
|
12
|
+
* It keeps a model of the terminal's current pen so no redundant SGR is emitted.
|
|
13
|
+
*/
|
|
14
|
+
export class Encoder {
|
|
15
|
+
state = { x: -1, y: -1, known: false, fg: DEFAULT_COLOR, bg: DEFAULT_COLOR, attrs: 0 };
|
|
16
|
+
parts = [];
|
|
17
|
+
colors;
|
|
18
|
+
monochrome;
|
|
19
|
+
constructor(options = {}) {
|
|
20
|
+
this.colors = options.colors ?? "truecolor";
|
|
21
|
+
this.monochrome = options.monochrome ?? false;
|
|
22
|
+
}
|
|
23
|
+
/** Forget what we believe about the terminal; the next write re-states everything. */
|
|
24
|
+
invalidateState() {
|
|
25
|
+
this.state = { x: -1, y: -1, known: false, fg: DEFAULT_COLOR, bg: DEFAULT_COLOR, attrs: 0 };
|
|
26
|
+
this.parts.push(`${CSI}0m`);
|
|
27
|
+
}
|
|
28
|
+
fgSeq(c) {
|
|
29
|
+
if (this.colors === "none")
|
|
30
|
+
return "";
|
|
31
|
+
if (c === DEFAULT_COLOR)
|
|
32
|
+
return fgDefault;
|
|
33
|
+
const col = this.monochrome ? grayscale(c) : c;
|
|
34
|
+
if (this.colors === "truecolor")
|
|
35
|
+
return fgTrue(red(col), green(col), blue(col));
|
|
36
|
+
if (this.colors === "ansi256")
|
|
37
|
+
return fg256(to256(col));
|
|
38
|
+
return fg16(to16(col));
|
|
39
|
+
}
|
|
40
|
+
bgSeq(c) {
|
|
41
|
+
if (this.colors === "none")
|
|
42
|
+
return "";
|
|
43
|
+
if (c === DEFAULT_COLOR)
|
|
44
|
+
return bgDefault;
|
|
45
|
+
const col = this.monochrome ? grayscale(c) : c;
|
|
46
|
+
if (this.colors === "truecolor")
|
|
47
|
+
return bgTrue(red(col), green(col), blue(col));
|
|
48
|
+
if (this.colors === "ansi256")
|
|
49
|
+
return bg256(to256(col));
|
|
50
|
+
return bg16(to16(col));
|
|
51
|
+
}
|
|
52
|
+
applyStyle(fg, bg, attrs) {
|
|
53
|
+
const s = this.state;
|
|
54
|
+
if (s.fg === fg && s.bg === bg && s.attrs === attrs)
|
|
55
|
+
return;
|
|
56
|
+
// Attributes can only be added cheaply; removing one means a full reset.
|
|
57
|
+
const removed = s.attrs & ~attrs;
|
|
58
|
+
if (removed !== 0) {
|
|
59
|
+
this.parts.push(`${CSI}0m`);
|
|
60
|
+
s.attrs = 0;
|
|
61
|
+
s.fg = DEFAULT_COLOR;
|
|
62
|
+
s.bg = DEFAULT_COLOR;
|
|
63
|
+
}
|
|
64
|
+
const added = attrs & ~s.attrs;
|
|
65
|
+
if (added !== 0) {
|
|
66
|
+
const codes = [];
|
|
67
|
+
if (added & Attr.Bold)
|
|
68
|
+
codes.push(1);
|
|
69
|
+
if (added & Attr.Dim)
|
|
70
|
+
codes.push(2);
|
|
71
|
+
if (added & Attr.Italic)
|
|
72
|
+
codes.push(3);
|
|
73
|
+
if (added & Attr.Underline)
|
|
74
|
+
codes.push(4);
|
|
75
|
+
if (added & Attr.Blink)
|
|
76
|
+
codes.push(5);
|
|
77
|
+
if (added & Attr.Reverse)
|
|
78
|
+
codes.push(7);
|
|
79
|
+
if (added & Attr.Strike)
|
|
80
|
+
codes.push(9);
|
|
81
|
+
if (codes.length)
|
|
82
|
+
this.parts.push(`${CSI}${codes.join(";")}m`);
|
|
83
|
+
s.attrs = attrs;
|
|
84
|
+
}
|
|
85
|
+
if (s.fg !== fg) {
|
|
86
|
+
this.parts.push(this.fgSeq(fg));
|
|
87
|
+
s.fg = fg;
|
|
88
|
+
}
|
|
89
|
+
if (s.bg !== bg) {
|
|
90
|
+
this.parts.push(this.bgSeq(bg));
|
|
91
|
+
s.bg = bg;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
moveCursor(x, y) {
|
|
95
|
+
const s = this.state;
|
|
96
|
+
if (s.known && s.y === y) {
|
|
97
|
+
if (s.x === x)
|
|
98
|
+
return;
|
|
99
|
+
if (x > s.x && x - s.x <= 3) {
|
|
100
|
+
// Short hop: cheaper than a full CUP, and never repaints cells.
|
|
101
|
+
this.parts.push(moveRight(x - s.x));
|
|
102
|
+
}
|
|
103
|
+
else if (x === 0) {
|
|
104
|
+
this.parts.push("\r");
|
|
105
|
+
}
|
|
106
|
+
else {
|
|
107
|
+
this.parts.push(moveToColumn(x));
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.parts.push(moveTo(x, y));
|
|
112
|
+
}
|
|
113
|
+
s.x = x;
|
|
114
|
+
s.y = y;
|
|
115
|
+
s.known = true;
|
|
116
|
+
}
|
|
117
|
+
/**
|
|
118
|
+
* Encode the difference between `prev` and `next`.
|
|
119
|
+
* Pass `full` to repaint every cell (first frame, resize, or after a redraw request).
|
|
120
|
+
*/
|
|
121
|
+
encode(prev, next, full = false) {
|
|
122
|
+
this.parts.length = 0;
|
|
123
|
+
let changed = 0;
|
|
124
|
+
let dirtyRows = 0;
|
|
125
|
+
const w = next.width;
|
|
126
|
+
const h = next.height;
|
|
127
|
+
const sameSize = prev.width === w && prev.height === h;
|
|
128
|
+
const repaint = full || !sameSize;
|
|
129
|
+
if (repaint)
|
|
130
|
+
this.invalidateState();
|
|
131
|
+
const nc = next.chars;
|
|
132
|
+
const nf = next.fg;
|
|
133
|
+
const nb = next.bg;
|
|
134
|
+
const na = next.attrs;
|
|
135
|
+
const pc = prev.chars;
|
|
136
|
+
const pf = prev.fg;
|
|
137
|
+
const pb = prev.bg;
|
|
138
|
+
const pa = prev.attrs;
|
|
139
|
+
for (let y = 0; y < h; y++) {
|
|
140
|
+
const rowStart = y * w;
|
|
141
|
+
let x = 0;
|
|
142
|
+
let rowDirty = false;
|
|
143
|
+
while (x < w) {
|
|
144
|
+
const i = rowStart + x;
|
|
145
|
+
const dirty = repaint || nc[i] !== pc[i] || nf[i] !== pf[i] || nb[i] !== pb[i] || na[i] !== pa[i];
|
|
146
|
+
if (!dirty) {
|
|
147
|
+
x++;
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
// Walk left onto the lead cell if we landed on a wide char's tail.
|
|
151
|
+
let start = x;
|
|
152
|
+
while (start > 0 && nc[rowStart + start] === CONTINUATION)
|
|
153
|
+
start--;
|
|
154
|
+
// Extend the run while cells are dirty, tolerating short clean gaps.
|
|
155
|
+
let end = start;
|
|
156
|
+
let clean = 0;
|
|
157
|
+
let probe = start;
|
|
158
|
+
while (probe < w) {
|
|
159
|
+
const j = rowStart + probe;
|
|
160
|
+
const d = repaint || nc[j] !== pc[j] || nf[j] !== pf[j] || nb[j] !== pb[j] || na[j] !== pa[j];
|
|
161
|
+
if (d) {
|
|
162
|
+
end = probe;
|
|
163
|
+
clean = 0;
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
clean++;
|
|
167
|
+
if (clean > GAP_MERGE)
|
|
168
|
+
break;
|
|
169
|
+
}
|
|
170
|
+
probe++;
|
|
171
|
+
}
|
|
172
|
+
this.moveCursor(start, y);
|
|
173
|
+
for (let cx = start; cx <= end; cx++) {
|
|
174
|
+
const j = rowStart + cx;
|
|
175
|
+
const value = nc[j];
|
|
176
|
+
if (value === CONTINUATION)
|
|
177
|
+
continue; // emitted with its lead cell
|
|
178
|
+
this.applyStyle(nf[j], nb[j], na[j]);
|
|
179
|
+
this.parts.push(value === 0 ? " " : cellText(value));
|
|
180
|
+
const cw = Math.max(1, cellWidth(value));
|
|
181
|
+
this.state.x += cw;
|
|
182
|
+
if (nc[j] !== pc[j] || nf[j] !== pf[j] || nb[j] !== pb[j] || na[j] !== pa[j])
|
|
183
|
+
changed++;
|
|
184
|
+
}
|
|
185
|
+
// Writing the final column may have triggered autowrap; stop trusting x.
|
|
186
|
+
if (this.state.x >= w)
|
|
187
|
+
this.state.known = false;
|
|
188
|
+
rowDirty = true;
|
|
189
|
+
x = end + 1;
|
|
190
|
+
}
|
|
191
|
+
if (rowDirty)
|
|
192
|
+
dirtyRows++;
|
|
193
|
+
}
|
|
194
|
+
return { output: this.parts.join(""), changedCells: changed, dirtyRows };
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
/** One-shot encode of a whole buffer, e.g. for `renderToAnsi` in tests. */
|
|
198
|
+
export function encodeFull(buffer, options = {}) {
|
|
199
|
+
const encoder = new Encoder(options);
|
|
200
|
+
const empty = { ...buffer, width: -1, height: -1 };
|
|
201
|
+
return encoder.encode(empty, buffer, true).output;
|
|
202
|
+
}
|
|
203
|
+
//# sourceMappingURL=diff.js.map
|
package/dist/diff.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diff.js","sourceRoot":"","sources":["../src/diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** Sub-cell glyph ramps. Every one degrades to ASCII when Unicode is off. */
|
|
2
|
+
/** Left-to-right eighths: ▏▎▍▌▋▊▉█ — horizontal bars and meters. */
|
|
3
|
+
export declare const HORIZONTAL_EIGHTHS: string[];
|
|
4
|
+
/** Bottom-up eighths: ▁▂▃▄▅▆▇█ — sparklines and column charts. */
|
|
5
|
+
export declare const VERTICAL_EIGHTHS: string[];
|
|
6
|
+
/** Two vertical halves, for double-density line plots. */
|
|
7
|
+
export declare const HALF_BLOCKS: {
|
|
8
|
+
readonly upper: "▀";
|
|
9
|
+
readonly lower: "▄";
|
|
10
|
+
readonly full: "█";
|
|
11
|
+
readonly empty: " ";
|
|
12
|
+
};
|
|
13
|
+
/** Quadrants indexed by a 4-bit mask: 1=TL, 2=TR, 4=BL, 8=BR. */
|
|
14
|
+
export declare const QUADRANTS: string[];
|
|
15
|
+
export declare const SHADES: string[];
|
|
16
|
+
export declare const ASCII_RAMP: string[];
|
|
17
|
+
export type FillMode = "braille" | "block" | "half" | "quadrant" | "ascii";
|
|
18
|
+
/** Pick the glyph for a 0-1 fill of one cell, bottom-up. */
|
|
19
|
+
export declare function verticalGlyph(ratio: number, mode?: FillMode): string;
|
|
20
|
+
/** Pick the glyph for a 0-1 fill of one cell, left to right. */
|
|
21
|
+
export declare function horizontalGlyph(ratio: number, mode?: FillMode): string;
|
|
22
|
+
/** Map a 0-1 value onto a shade block, for heatmaps and dim fills. */
|
|
23
|
+
export declare function shadeGlyph(ratio: number, unicode?: boolean): string;
|
|
24
|
+
/** Braille when the terminal supports it, blocks when it does not. */
|
|
25
|
+
export declare function bestMode(unicode: boolean, braille: boolean): FillMode;
|
|
26
|
+
//# sourceMappingURL=blocks.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../../src/graphics/blocks.ts"],"names":[],"mappings":"AAAA,6EAA6E;AAE7E,oEAAoE;AACpE,eAAO,MAAM,kBAAkB,UAA+C,CAAC;AAC/E,kEAAkE;AAClE,eAAO,MAAM,gBAAgB,UAA+C,CAAC;AAC7E,0DAA0D;AAC1D,eAAO,MAAM,WAAW;;;;;CAA6D,CAAC;AACtF,iEAAiE;AACjE,eAAO,MAAM,SAAS,UAErB,CAAC;AACF,eAAO,MAAM,MAAM,UAAuB,CAAC;AAC3C,eAAO,MAAM,UAAU,UAAqD,CAAC;AAE7E,MAAM,MAAM,QAAQ,GAAG,SAAS,GAAG,OAAO,GAAG,MAAM,GAAG,UAAU,GAAG,OAAO,CAAC;AAE3E,4DAA4D;AAC5D,wBAAgB,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,QAAkB,GAAG,MAAM,CAM7E;AAED,gEAAgE;AAChE,wBAAgB,eAAe,CAAC,KAAK,EAAE,MAAM,EAAE,IAAI,GAAE,QAAkB,GAAG,MAAM,CAK/E;AAED,sEAAsE;AACtE,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,UAAO,GAAG,MAAM,CAKhE;AAED,sEAAsE;AACtE,wBAAgB,QAAQ,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,QAAQ,CAIrE"}
|