Nyan Cat and a full-width rainbow over Claude Code's turn spinner: the real picture where the terminal draws images, else a braille outline with dotted speed…

Nyan Cat and a rainbow across the whole terminal width, drawn above Claude Code's turn spinner (Sauteing… (12s · tokens)) while a turn runs. The engine's own line stays under it.
Version: 0.1.1
/nyan answered nyan: nyan: pixel: Claude Code already names the command above its output, so the mod's own nyan: prefix is gone (from its debug-log line too).gif, pixel, dots), and /nyan switches between them./plugin marketplace add https://github.com/IvanLutsenko/awac-ai-agent-plugins
/plugin install nyan-progress
Requires Claude Code with function hooks (mods). This is early access: the hook API can change between releases.
/nyan gif|pixel|dots chooses the look. The choice is kept across sessions. /nyan with no argument shows the current look.
gif (the default): the real picture. It shows the 12 frames of the original gif and a rainbow wave, both 2 rows tall. It works where the terminal draws images (kitty graphics: kitty, Ghostty). If the terminal cannot draw images, gif falls back to dots after the first frame.
pixel: the 34×21 sprite in half-block colour cells, 11 rows. It works in any truecolor terminal.![]()
dots: the sprite's outline in braille dots of the text colour, 5 rows. The rainbow becomes six dotted speed lines that wave like the colour one; its colours run along the lines, because a braille cell has one colour. It works in any truecolor terminal.
tmux, herdr and similar multiplexers hide the outer terminal from Claude Code. Claude Code then decides that the terminal draws no images, and gif shows the dots look. If your multiplexer passes kitty graphics through (herdr does), tell Claude Code to use images:
# ~/.zshrc: only inside herdr
[[ -n $HERDR_ENV ]] && export CLAUDE_CODE_FORCE_TERMINAL_IMAGES=1
The previews above are screen recordings in Ghostty (light Solarized theme), cropped to the strip and the spinner line.
hooks/register.tsx: a ui.render hook on Spinner puts the strip above the engine's line. A timer runs while the turn runs. On each tick it repaints the strip with $.ui.blit and calls $.ui.invalidate.hooks/cat.ts: the sprite as text, one character per pixel, taken pixel for pixel from the original gif.hooks/cat-png.ts: the gif's frames and the two rainbow phases as PNG.Nyan Cat © Chris Torres (nyan.cat). The sprite and frames come from the original gif. This is a non-commercial fan project. The MIT license covers the code only, not the art.
claude plugin test plugins/nyanhooks/register.tsx 188 lines1import type { Register } from 'claude-code'
2
3import { CAT_H, CAT_W, FRAMES, DOT_FRAMES, DOT_H, DOT_W, PALETTE, TART_LEFT } from './cat'
4import { PNG_FRAMES, RAINBOW_PNG } from './cat-png'
5
6// Three looks, picked with /nyan: the real picture (where the terminal draws pictures, else the
7// braille look), the sprite in half-block pixels (any truecolor terminal), or its outline in braille.
8type Style = 'gif' | 'pixel' | 'dots'
9const STYLES: readonly string[] = ['gif', 'pixel', 'dots']
10
11const RAINBOW = [0xff0000, 0xff9900, 0xffff00, 0x33ff00, 0x0099ff, 0x6633ff]
12// The dots' rainbow is text on the terminal's own background, so terminals that enforce a minimum
13// contrast (Ghostty's minimum-contrast, Warp's) would darken the light colours to black. These keep
14// at least 3:1 against both light and dark backgrounds, so no theme rewrites them.
15const DOT_RAINBOW = [0xe8202a, 0xd2690a, 0x968000, 0x2f9e35, 0x1f7fe0, 0x8a4cf2]
16const SEGMENT = 6 // wave: blocks this wide sit a pixel up or down, flipping every few frames
17const NONE = 0x01000000 // terminal default color
18const UPPER = 0x2580 // ▀: fg paints the upper half, bg the lower
19const LOWER = 0x2584 // ▄: fg paints the lower half (an empty upper half stays the terminal's bg)
20const BRAILLE = 0x2800
21const DOTS = [[0x01, 0x08], [0x02, 0x10], [0x04, 0x20], [0x40, 0x80]] // [dot row][dot column] -> bit
22const PIXEL_ROWS = CAT_H / 2
23const DOT_ROWS = DOT_H / 4
24const DOT_COLS = DOT_W / 2
25const DOT_LINES_TOP = (DOT_H - 12) / 2 // six speed lines, a dot row apart, centred on the tart
26const IMAGE_ROWS = 2
27// The engine repaints the spinner row on request at most 10 times a second (the gif's own pace is
28// FRAME_MS = 70): ticking at that cap gives every frame its paint, ticking faster drops some unevenly.
29const TICK_MS = 100
30const IMAGE_MAX_COLS = 255 // an Image's width limit: on a wider terminal the rainbow is just shorter
31const IMAGE_COLS = Math.round((CAT_W / (CAT_H - 1)) * IMAGE_ROWS * 2) // keeps 34:21 with ~1:2 cells
32
33// Rainbow color at column `dx` from the cat (negative: left of it) and pixel row `y`.
34const rainbow = (dx: number, y: number, frame: number, stripe: number, top: number): number => {
35 const drop = (Math.floor((dx + 1200) / SEGMENT) + Math.floor(frame / 3)) % 2
36 const i = Math.floor((y - top - drop) / stripe)
37 return y - top - drop >= 0 && i < RAINBOW.length ? RAINBOW[i]! : NONE
38}
39
40// A Raster of `width` x `rows` cells; `at` gives the [codePoint, fg, bg] of each.
41const raster = (width: number, rows: number, at: (x: number, row: number) => readonly number[]): string => {
42 const words = new Uint32Array(width * rows * 3)
43 for (let row = 0; row < rows; row++) {
44 for (let x = 0; x < width; x++) words.set(at(x, row), (row * width + x) * 3)
45 }
46 return new Uint8Array(words.buffer).toBase64()
47}
48
49// Two stacked pixels as one cell. A default fg is the text color, not transparent,
50// so an empty half must sit on the bg.
51const halves = (top: number, bottom: number): readonly number[] =>
52 top === NONE && bottom === NONE ? [0x20, NONE, NONE] : top === NONE ? [LOWER, bottom, NONE] : [UPPER, top, bottom]
53
54// Rainbow, then the pixel cat.
55export const pack = (width: number, frame: number): string => {
56 const tail = width - CAT_W
57 const pixel = (x: number, y: number) => {
58 if (x >= tail) {
59 const c = FRAMES[frame % FRAMES.length]![y]![x - tail]!
60 if (c !== '.') return PALETTE[c] ?? NONE
61 if (x - tail >= TART_LEFT) return NONE
62 }
63 return rainbow(x - tail, y, frame, 2, 3)
64 }
65 return raster(width, PIXEL_ROWS, (x, row) => halves(pixel(x, row * 2), pixel(x, row * 2 + 1)))
66}
67
68// The braille look: the rainbow as six dotted speed lines (a dot every other column, waving like
69// the colour one), then the cat's outline in the text color. A braille cell has one colour, and two
70// lines share each row of cells, so the rainbow's colours run along the lines, one per wave segment.
71export const packDots = (width: number, frame: number): string => {
72 const tail = width - DOT_COLS
73 const sprite = DOT_FRAMES[frame % DOT_FRAMES.length]!
74 const dot = (x: number, y: number): boolean => {
75 if (x >= tail * 2) return sprite[y]?.[x - tail * 2] !== '.'
76 if (x % 2) return false
77 const line = y - DOT_LINES_TOP - ((Math.floor((x - tail * 2 + 1200) / SEGMENT) + Math.floor(frame / 3)) % 2)
78 return line >= 0 && line < 12 && line % 2 === 0
79 }
80 return raster(width, DOT_ROWS, (x, row) => {
81 let bits = 0
82 for (let dy = 0; dy < 4; dy++) {
83 for (let dx = 0; dx < 2; dx++) if (dot(x * 2 + dx, row * 4 + dy)) bits |= DOTS[dy]![dx]!
84 }
85 const fg = x < tail ? DOT_RAINBOW[Math.floor((x - tail + 1200) / (SEGMENT / 2)) % DOT_RAINBOW.length]! : NONE
86 return [BRAILLE + bits, fg, NONE]
87 })
88}
89
90export const register: Register = on => {
91 let style: Style = 'gif'
92 let picturesDraw = true // until a blit says this terminal draws the Image's alt
93 let frame = 0
94 let timer: { cancel: () => void } | null = null
95 const sites = new Map<string, number>() // spinner requestId -> strip width
96
97 const look = (): Style => (style === 'gif' && !picturesDraw ? 'dots' : style)
98
99 const stop = () => {
100 timer?.cancel()
101 timer = null
102 }
103
104 on('session.start', async ($, e, next) => {
105 const saved = await $.store.get('style')
106 if (typeof saved === 'string' && STYLES.includes(saved)) style = saved as Style
107 await $.command.register({
108 name: 'nyan',
109 description: 'Nyan spinner look: gif (the original picture where the terminal draws images, else dots), pixel, dots',
110 argumentHint: 'gif|pixel|dots',
111 })
112 return next(e)
113 })
114
115 on('command.run', { command: 'nyan' }, async ($, e) => {
116 const want = e.args.trim()
117 if (STYLES.includes(want)) {
118 style = want as Style
119 await $.store.set('style', want)
120 }
121 const now = style === 'gif' && !picturesDraw ? 'gif (dots: this terminal draws no pictures)' : style
122 return { text: `${now}${STYLES.includes(want) ? '' : '. Usage: /nyan gif|pixel|dots'}` }
123 })
124
125 on('turn.start', ($, e, next) => {
126 stop()
127 frame = 0
128 timer = $.clock.every(TICK_MS, () => {
129 frame += 1
130 for (const [requestId, width] of sites) {
131 // ponytail: blit refusals (site gone, resized) are ignored; the next render re-registers the site
132 const mode = look()
133 if (mode !== 'gif') {
134 void $.ui.blit({ requestId, key: 'nyan', cells: mode === 'dots' ? packDots(width, frame) : pack(width, frame) })
135 continue
136 }
137 // an unchanged source sends nothing, so the rainbow costs a command only when its wave flips
138 for (const [key, png] of [['rainbow', RAINBOW_PNG[Math.floor(frame / 3) % 2]!], ['cat', PNG_FRAMES[frame % PNG_FRAMES.length]!]]) {
139 void $.ui.blit({ requestId, key: key!, source: { png: png! } }).then(r => {
140 if (r.deny && /\balt\b/.test(r.deny) && picturesDraw) {
141 picturesDraw = false // the terminal shows the alt: fall back to braille from the next draw on
142 $.ui.log(`picture not drawn (${r.deny}); using braille`, { to: 'debug' })
143 $.ui.invalidate('ui.render')
144 }
145 })
146 }
147 }
148 // blits paint with the engine's next frame, and before the first tokens the engine draws
149 // few frames: ask for one, or the strip stutters at the start of a turn
150 $.ui.invalidate('ui.render') // also redraws a band drawn before this timer started
151 })
152 return next(e)
153 })
154
155 on('turn.complete', ($, e, next) => {
156 stop() // fires on interrupts and errors too
157 sites.clear() // not at turn.start: the band draws (and registers) before that hook runs
158 return next(e)
159 })
160
161 on('ui.render', { component: 'Spinner' }, async ($, e, next) => {
162 if (e.surface !== 'terminal') return next(e)
163 const mode = look()
164 const width = Math.min(512, Math.max(CAT_W + 4, (e.viewport?.columns ?? 80) - 2)) // full width from the start
165 sites.set(e.requestId, width)
166
167 const { Box, Raster, Image } = $.ui.resolve(e)
168 const engineLine = await next(e) // keeps the word, elapsed time and tokens
169 const strip =
170 mode === 'gif' ? (
171 <Box flexDirection="row">
172 <Image key="rainbow" source={{ png: RAINBOW_PNG[Math.floor(frame / 3) % 2]! }} columns={Math.min(IMAGE_MAX_COLS, width - IMAGE_COLS)} rows={IMAGE_ROWS} alt=" " />
173 <Image key="cat" source={{ png: PNG_FRAMES[frame % PNG_FRAMES.length]! }} columns={IMAGE_COLS} rows={IMAGE_ROWS} alt=" " />
174 </Box>
175 ) : mode === 'dots' ? (
176 <Raster key="nyan" columns={width} rows={DOT_ROWS} cells={packDots(width, frame)} />
177 ) : (
178 <Raster key="nyan" columns={width} rows={PIXEL_ROWS} cells={pack(width, frame)} />
179 )
180 return (
181 <Box flexDirection="column">
182 {strip}
183 {engineLine}
184 </Box>
185 )
186 })
187}
188hooks/cat.ts 578 lines1// Nyan Cat sprite as drawn by nyan.cat/cats/original.gif (8x pixels sampled back to 1x),
2// 12 frames at 70 ms. One char = one pixel, '.' = transparent. Nyan Cat © Chris Torres; fan project.
3export const PALETTE: Record<string, number> = {
4 k: 0x000000, // outline
5 t: 0xffcc99, // crust
6 p: 0xff99ff, // frosting
7 s: 0xff3399, // sprinkle
8 g: 0x999999, // fur
9 r: 0xff9999, // cheek
10 w: 0xffffff, // eye shine
11}
12
13export const FRAMES: readonly string[][] = [
14 [
15 '.........kkkkkkkkkkkkkkkkk........',
16 '........ktttttttttttttttttk.......',
17 '.......ktttppppppppppppptttk......',
18 '.......kttppppppsppspppppttk......',
19 '.......ktppspppppppppppppptk......',
20 '.......ktppppppppppkkppspptk.kk...',
21 '.......ktpppppppppkggkpppptkkggk..',
22 '.kkkk..ktppppppsppkgggkppptkgggk..',
23 '.kggkk.ktpppppppppkggggkkkkggggk..',
24 '.kkggkkktpppspppppkggggggggggggk..',
25 '..kkggkktpppppppskggggggggggggggk.',
26 '...kkggktpsppppppkgggwkgggggwkggk.',
27 '....kkkktppppppppkgggkkgggkgkkggk.',
28 '......kktpppppsppkgrrgggggggggrrk.',
29 '.......kttpspppppkgrrgkggkggkgrrk.',
30 '.......ktttpppppppkgggkkkkkkkggk..',
31 '......kkkttttttttttkggggggggggk...',
32 '.....kgggkkkkkkkkkkkkkkkkkkkkk....',
33 '.....kggkk.kggk.....kggk.kggk.....',
34 '.....kkkk..kkk.......kkk..kk......',
35 '..................................',
36 '..................................',
37 ],
38 [
39 '.........kkkkkkkkkkkkkkkkk........',
40 '........ktttttttttttttttttk.......',
41 '.......ktttppppppppppppptttk......',
42 '.......kttppppppsppspppppttk......',
43 '.......ktppspppppppppppppptk......',
44 '.......ktpppppppppppkkpspptk..kk..',
45 '.......ktppppppppppkggkppptk.kggk.',
46 '.......ktppppppspppkgggkpptkkgggk.',
47 '..kk...ktppppppppppkggggkkkkggggk.',
48 '.kggk..ktpppsppppppkggggggggggggk.',
49 '.kggkkkktpppppppspkggggggggggggggk',
50 '..kggggktpspppppppkgggwkgggggwkggk',
51 '...kkggktpppppppppkgggkkgggkgkkggk',
52 '.....kkktpppppspppkgrrgggggggggrrk',
53 '.......kttpsppppppkgrrgkggkggkgrrk',
54 '.......ktttppppppppkgggkkkkkkkggk.',
55 '.......kktttttttttttkggggggggggk..',
56 '......kggkkkkkkkkkkkkkkkkkkkkkk...',
57 '......kggk.kggk......kggk.kggk....',
58 '......kkk...kkk.......kkk..kkk....',
59 '..................................',
60 '..................................',
61 ],
62 [
63 '..................................',
64 '.........kkkkkkkkkkkkkkkkk........',
65 '........ktttttttttttttttttk.......',
66 '.......ktttppppppppppppptttk......',
67 '.......kttppppppsppspppppttk......',
68 '.......ktppspppppppppppppptk......',
69 '.......ktpppppppppppkkpspptk..kk..',
70 '.......ktppppppppppkggkppptk.kggk.',
71 '.......ktppppppspppkgggkpptkkgggk.',
72 '.......ktppppppppppkggggkkkkggggk.',
73 '.......ktpppsppppppkggggggggggggk.',
74 '......kktpppppppspkggggggggggggggk',
75 '...kkkkktpspppppppkgggwkgggggwkggk',
76 '.kkggggktpppppppppkgggkkgggkgkkggk',
77 '.kgggkkktpppppspppkgrrgggggggggrrk',
78 '..kkkk.kttpsppppppkgrrgkggkggkgrrk',
79 '.......ktttppppppppkgggkkkkkkkggk.',
80 '.......kktttttttttttkggggggggggk..',
81 '.......kgkkkkkkkkkkkkkkkkkkkkkk...',
82 '.......kggk.kggk......kggk.kggk...',
83 '.......kkk...kkk.......kkk..kkk...',
84 '..................................',
85 ],
86 [
87 '..................................',
88 '.........kkkkkkkkkkkkkkkkk........',
89 '........ktttttttttttttttttk.......',
90 '.......ktttppppppppppppptttk......',
91 '.......kttppppppsppspppppttk......',
92 '.......ktppspppppppppppppptk......',
93 '.......ktpppppppppppkkpspptk..kk..',
94 '.......ktppppppppppkggkppptk.kggk.',
95 '.......ktppppppspppkgggkpptkkgggk.',
96 '.......ktppppppppppkggggkkkkggggk.',
97 '.......ktpppsppppppkggggggggggggk.',
98 '.....kkktpppppppspkggggggggggggggk',
99 '...kkggktpspppppppkgggwkgggggwkggk',
100 '..kggggktpppppppppkgggkkgggkgkkggk',
101 '.kggkkkktpppppspppkgrrgggggggggrrk',
102 '.kggk..kttpsppppppkgrrgkggkggkgrrk',
103 '..kk...ktttppppppppkgggkkkkkkkggk.',
104 '.......kktttttttttttkggggggggggk..',
105 '......kggkkkkkkkkkkkkkkkkkkkkkk...',
106 '......kggk.kggk......kggk.kggk....',
107 '......kkk...kkk.......kkk..kkk....',
108 '..................................',
109 ],
110 [
111 '..................................',
112 '.........kkkkkkkkkkkkkkkkk........',
113 '........ktttttttttttttttttk.......',
114 '.......ktttppppppppppppptttk......',
115 '.......kttppppppsppspppppttk......',
116 '.......ktppspppppppppppppptk......',
117 '.......ktppppppppppkkppspptk.kk...',
118 '.......ktpppppppppkggkpppptkkggk..',
119 '.......ktppppppsppkgggkppptkgggk..',
120 '.kkkk..ktpppppppppkggggkkkkggggk..',
121 'kgggkkkktpppspppppkggggggggggggk..',
122 'kkggggkktpppppppskggggggggggggggk.',
123 '..kkkkgktpsppppppkgggwkgggggwkggk.',
124 '.....kkktppppppppkgggkkgggkgkkggk.',
125 '.......ktpppppsppkgrrgggggggggrrk.',
126 '.......kttpspppppkgrrgkggkggkgrrk.',
127 '......kktttpppppppkgggkkkkkkkggk..',
128 '.....kkkkttttttttttkggggggggggk...',
129 '....kgggkkkkkkkkkkkkkkkkkkkkkk....',
130 '....kggk.kggk......kggk.kggk......',
131 '....kkk...kkk.......kkk..kkk......',
132 '..................................',
133 ],
134 [
135 '..................................',
136 '.........kkkkkkkkkkkkkkkkk........',
137 '........ktttttttttttttttttk.......',
138 '.......ktttppppppppppppptttk......',
139 '.......kttppppppsppspppppttk......',
140 '.......ktppspppppppkkppppptk.kk...',
141 '.......ktpppppppppkggkpspptkkggk..',
142 '.......ktpppppppppkgggkppptkgggk..',
143 '..kk...ktppppppsppkggggkkkkggggk..',
144 '.kggk..ktpppppppppkggggggggggggk..',
145 '.kggkkkktpppsppppkggggggggggggggk.',
146 '..kggggktpppppppskgggwkgggggwkggk.',
147 '...kkggktpsppppppkgggkkgggkgkkggk.',
148 '.....kkktppppppppkgrrgggggggggrrk.',
149 '.......ktpppppsppkgrrgkggkggkgrrk.',
150 '.......kttpsppppppkgggkkkkkkkggk..',
151 '......kktttppppppppkggggggggggk...',
152 '.....kgkktttttttttttkkkkkkkkkk....',
153 '....kgggkkkkkkkkkkkkkkkkkkgk......',
154 '....kggk.kggk......kggk.kggk......',
155 '....kkk..kkk.......kkk...kkk......',
156 '..................................',
157 ],
158 [
159 '.........kkkkkkkkkkkkkkkkk........',
160 '........ktttttttttttttttttk.......',
161 '.......ktttppppppppppppptttk......',
162 '.......kttppppppsppspppppttk......',
163 '.......ktppspppppppppppppptk......',
164 '.......ktppppppppppkkppspptk.kk...',
165 '.......ktpppppppppkggkpppptkkggk..',
166 '.kkkk..ktppppppsppkgggkppptkgggk..',
167 '.kggkk.ktpppppppppkggggkkkkggggk..',
168 '.kkggkkktpppspppppkggggggggggggk..',
169 '..kkggkktpppppppskggggggggggggggk.',
170 '...kkggktpsppppppkgggwkgggggwkggk.',
171 '....kkkktppppppppkgggkkgggkgkkggk.',
172 '......kktpppppsppkgrrgggggggggrrk.',
173 '.......kttpspppppkgrrgkggkggkgrrk.',
174 '.......ktttpppppppkgggkkkkkkkggk..',
175 '......kkkttttttttttkggggggggggk...',
176 '.....kgggkkkkkkkkkkkkkkkkkkkkk....',
177 '.....kggkk.kggk.....kggk.kggk.....',
178 '.....kkkk..kkk.......kkk..kk......',
179 '..................................',
180 '..................................',
181 ],
182 [
183 '.........kkkkkkkkkkkkkkkkk........',
184 '........ktttttttttttttttttk.......',
185 '.......ktttppppppppppppptttk......',
186 '.......kttppppppsppspppppttk......',
187 '.......ktppspppppppppppppptk......',
188 '.......ktpppppppppppkkpspptk..kk..',
189 '.......ktppppppppppkggkppptk.kggk.',
190 '.......ktppppppspppkgggkpptkkgggk.',
191 '..kk...ktppppppppppkggggkkkkggggk.',
192 '.kggk..ktpppsppppppkggggggggggggk.',
193 '.kggkkkktpppppppspkggggggggggggggk',
194 '..kggggktpspppppppkgggwkgggggwkggk',
195 '...kkggktpppppppppkgggkkgggkgkkggk',
196 '.....kkktpppppspppkgrrgggggggggrrk',
197 '.......kttpsppppppkgrrgkggkggkgrrk',
198 '.......ktttppppppppkgggkkkkkkkggk.',
199 '.......kktttttttttttkggggggggggk..',
200 '......kggkkkkkkkkkkkkkkkkkkkkkk...',
201 '......kggk.kggk......kggk.kggk....',
202 '......kkk...kkk.......kkk..kkk....',
203 '..................................',
204 '..................................',
205 ],
206 [
207 '..................................',
208 '.........kkkkkkkkkkkkkkkkk........',
209 '........ktttttttttttttttttk.......',
210 '.......ktttppppppppppppptttk......',
211 '.......kttppppppsppspppppttk......',
212 '.......ktppspppppppppppppptk......',
213 '.......ktpppppppppppkkpspptk..kk..',
214 '.......ktppppppppppkggkppptk.kggk.',
215 '.......ktppppppspppkgggkpptkkgggk.',
216 '.......ktppppppppppkggggkkkkggggk.',
217 '.......ktpppsppppppkggggggggggggk.',
218 '......kktpppppppspkggggggggggggggk',
219 '...kkkkktpspppppppkgggwkgggggwkggk',
220 '.kkggggktpppppppppkgggkkgggkgkkggk',
221 '.kgggkkktpppppspppkgrrgggggggggrrk',
222 '..kkkk.kttpsppppppkgrrgkggkggkgrrk',
223 '.......ktttppppppppkgggkkkkkkkggk.',
224 '.......kktttttttttttkggggggggggk..',
225 '.......kgkkkkkkkkkkkkkkkkkkkkkk...',
226 '.......kggk.kggk......kggk.kggk...',
227 '.......kkk...kkk.......kkk..kkk...',
228 '..................................',
229 ],
230 [
231 '..................................',
232 '.........kkkkkkkkkkkkkkkkk........',
233 '........ktttttttttttttttttk.......',
234 '.......ktttppppppppppppptttk......',
235 '.......kttppppppsppspppppttk......',
236 '.......ktppspppppppppppppptk......',
237 '.......ktpppppppppppkkpspptk..kk..',
238 '.......ktppppppppppkggkppptk.kggk.',
239 '.......ktppppppspppkgggkpptkkgggk.',
240 '.......ktppppppppppkggggkkkkggggk.',
241 '.......ktpppsppppppkggggggggggggk.',
242 '.....kkktpppppppspkggggggggggggggk',
243 '...kkggktpspppppppkgggwkgggggwkggk',
244 '..kggggktpppppppppkgggkkgggkgkkggk',
245 '.kggkkkktpppppspppkgrrgggggggggrrk',
246 '.kggk..kttpsppppppkgrrgkggkggkgrrk',
247 '..kk...ktttppppppppkgggkkkkkkkggk.',
248 '.......kktttttttttttkggggggggggk..',
249 '......kggkkkkkkkkkkkkkkkkkkkkkk...',
250 '......kggk.kggk......kggk.kggk....',
251 '......kkk...kkk.......kkk..kkk....',
252 '..................................',
253 ],
254 [
255 '..................................',
256 '.........kkkkkkkkkkkkkkkkk........',
257 '........ktttttttttttttttttk.......',
258 '.......ktttppppppppppppptttk......',
259 '.......kttppppppsppspppppttk......',
260 '.......ktppspppppppppppppptk......',
261 '.......ktppppppppppkkppspptk.kk...',
262 '.......ktpppppppppkggkpppptkkggk..',
263 '.......ktppppppsppkgggkppptkgggk..',
264 '.kkkk..ktpppppppppkggggkkkkggggk..',
265 'kgggkkkktpppspppppkggggggggggggk..',
266 'kkggggkktpppppppskggggggggggggggk.',
267 '..kkkkgktpsppppppkgggwkgggggwkggk.',
268 '.....kkktppppppppkgggkkgggkgkkggk.',
269 '.......ktpppppsppkgrrgggggggggrrk.',
270 '.......kttpspppppkgrrgkggkggkgrrk.',
271 '......kktttpppppppkgggkkkkkkkggk..',
272 '.....kkkkttttttttttkggggggggggk...',
273 '....kgggkkkkkkkkkkkkkkkkkkkkkk....',
274 '....kggk.kggk......kggk.kggk......',
275 '....kkk...kkk.......kkk..kkk......',
276 '..................................',
277 ],
278 [
279 '..................................',
280 '.........kkkkkkkkkkkkkkkkk........',
281 '........ktttttttttttttttttk.......',
282 '.......ktttppppppppppppptttk......',
283 '.......kttppppppsppspppppttk......',
284 '.......ktppspppppppkkppppptk.kk...',
285 '.......ktpppppppppkggkpspptkkggk..',
286 '.......ktpppppppppkgggkppptkgggk..',
287 '..kk...ktppppppsppkggggkkkkggggk..',
288 '.kggk..ktpppppppppkggggggggggggk..',
289 '.kggkkkktpppsppppkggggggggggggggk.',
290 '..kggggktpppppppskgggwkgggggwkggk.',
291 '...kkggktpsppppppkgggkkgggkgkkggk.',
292 '.....kkktppppppppkgrrgggggggggrrk.',
293 '.......ktpppppsppkgrrgkggkggkgrrk.',
294 '.......kttpsppppppkgggkkkkkkkggk..',
295 '......kktttppppppppkggggggggggk...',
296 '.....kgkktttttttttttkkkkkkkkkk....',
297 '....kgggkkkkkkkkkkkkkkkkkkgk......',
298 '....kggk.kggk......kggk.kggk......',
299 '....kkk..kkk.......kkk...kkk......',
300 '..................................',
301 ],
302]
303export const CAT_W = 34
304export const CAT_H = 22 // pixels = 11 terminal rows of half-blocks (21 + 1 blank)
305export const FRAME_MS = 70
306export const TART_LEFT = 7 // first column of the tart: the rainbow runs under the tail up to it
307
308// The outline for the braille look: the sprite with one row and two tart columns dropped by one
309// mask for all frames, so it fits 5 rows of braille cells (4 dots tall). Only 'k' and 's' kept.
310export const DOT_FRAMES: readonly string[][] = [
311 [
312 '.........kkkkkkkkkkkkkkk........',
313 '........k...............k.......',
314 '.......k.................k......',
315 '.......k.................k......',
316 '.......k.........kk..s...k.kk...',
317 '.......k........k..k.....kk..k..',
318 '.kkkk..k........k...k....k...k..',
319 '.k..kk.k........k....kkkk....k..',
320 '.kk..kkk...s....k............k..',
321 '..kk..kk......sk..............k.',
322 '...kk..k..s....k....k......k..k.',
323 '....kkkk.......k...kk...k.kk..k.',
324 '......kk.....s.k..............k.',
325 '.......k.......k....k..k..k...k.',
326 '.......k........k...kkkkkkk..k..',
327 '......kkk........k..........k...',
328 '.....k...kkkkkkkkkkkkkkkkkkk....',
329 '.....k..kk...k....k..k.k..k.....',
330 '.....kkkk..kk......kkk..kk......',
331 '................................',
332 ],
333 [
334 '.........kkkkkkkkkkkkkkk........',
335 '........k...............k.......',
336 '.......k.................k......',
337 '.......k.................k......',
338 '.......k.........kk..s...k.kk...',
339 '.......k........k..k.....kk..k..',
340 '.......k........k...k....k...k..',
341 '..kk...k........k....kkkk....k..',
342 '.k..k..k...s....k............k..',
343 '.k..kkkk......sk..............k.',
344 '..k....k..s....k....k......k..k.',
345 '...kk..k.......k...kk...k.kk..k.',
346 '.....kkk.....s.k..............k.',
347 '.......k.......k....k..k..k...k.',
348 '.......k........k...kkkkkkk..k..',
349 '.......kk........k..........k...',
350 '......k..kkkkkkkkkkkkkkkkkkkk...',
351 '......k..k...k.....k..k.k..k....',
352 '......kkk..kkk......kkk..kkk....',
353 '................................',
354 ],
355 [
356 '................................',
357 '.........kkkkkkkkkkkkkkk........',
358 '........k...............k.......',
359 '.......k.................k......',
360 '.......k.................k......',
361 '.......k.........kk..s...k.kk...',
362 '.......k........k..k.....kk..k..',
363 '.......k........k...k....k...k..',
364 '.......k........k....kkkk....k..',
365 '.......k...s....k............k..',
366 '......kk......sk..............k.',
367 '...kkkkk..s....k....k......k..k.',
368 '.kk....k.......k...kk...k.kk..k.',
369 '.k...kkk.....s.k..............k.',
370 '..kkkk.k.......k....k..k..k...k.',
371 '.......k........k...kkkkkkk..k..',
372 '.......kk........k..........k...',
373 '.......k.kkkkkkkkkkkkkkkkkkkk...',
374 '.......k..kk........k..k.k..k...',
375 '.......kkk..kk.......kkk..kkk...',
376 ],
377 [
378 '................................',
379 '.........kkkkkkkkkkkkkkk........',
380 '........k...............k.......',
381 '.......k.................k......',
382 '.......k.................k......',
383 '.......k.........kk..s...k.kk...',
384 '.......k........k..k.....kk..k..',
385 '.......k........k...k....k...k..',
386 '.......k........k....kkkk....k..',
387 '.......k...s....k............k..',
388 '.....kkk......sk..............k.',
389 '...kk..k..s....k....k......k..k.',
390 '..k....k.......k...kk...k.kk..k.',
391 '.k..kkkk.....s.k..............k.',
392 '.k..k..k.......k....k..k..k...k.',
393 '..kk...k........k...kkkkkkk..k..',
394 '.......kk........k..........k...',
395 '......k..kkkkkkkkkkkkkkkkkkkk...',
396 '......k..k...k.....k..k.k..k....',
397 '......kkk..kkk......kkk..kkk....',
398 ],
399 [
400 '................................',
401 '.........kkkkkkkkkkkkkkk........',
402 '........k...............k.......',
403 '.......k.................k......',
404 '.......k.................k......',
405 '.......k.........kk..s...k.kk...',
406 '.......k........k..k.....kk..k..',
407 '.......k........k...k....k...k..',
408 '.kkkk..k........k....kkkk....k..',
409 'k...kkkk...s....k............k..',
410 'kk....kk......sk..............k.',
411 '..kkkk.k..s....k....k......k..k.',
412 '.....kkk.......k...kk...k.kk..k.',
413 '.......k.....s.k..............k.',
414 '.......k.......k....k..k..k...k.',
415 '......kk........k...kkkkkkk..k..',
416 '.....kkkk........k..........k...',
417 '....k...kkkkkkkkkkkkkkkkkkkk....',
418 '....k..k.k.k.....k..k.k..k......',
419 '....kkk...kk......kkk..kkk......',
420 ],
421 [
422 '................................',
423 '.........kkkkkkkkkkkkkkk........',
424 '........k...............k.......',
425 '.......k.................k......',
426 '.......k.................k......',
427 '.......k.........kk..s...k.kk...',
428 '.......k........k..k.....kk..k..',
429 '..kk...k........k...k....k...k..',
430 '.k..k..k........k....kkkk....k..',
431 '.k..kkkk...s....k............k..',
432 '..k....k......sk..............k.',
433 '...kk..k..s....k....k......k..k.',
434 '.....kkk.......k...kk...k.kk..k.',
435 '.......k.....s.k..............k.',
436 '.......k.......k....k..k..k...k.',
437 '......kk........k...kkkkkkk..k..',
438 '.....k.kk........k..........k...',
439 '....k...kkkkkkkkkkkkkkkk.k......',
440 '....k..k.k.k.....k..k.k..k......',
441 '....kkk..kk......kkk...kkk......',
442 ],
443 [
444 '.........kkkkkkkkkkkkkkk........',
445 '........k...............k.......',
446 '.......k.................k......',
447 '.......k.................k......',
448 '.......k.........kk..s...k.kk...',
449 '.......k........k..k.....kk..k..',
450 '.kkkk..k........k...k....k...k..',
451 '.k..kk.k........k....kkkk....k..',
452 '.kk..kkk...s....k............k..',
453 '..kk..kk......sk..............k.',
454 '...kk..k..s....k....k......k..k.',
455 '....kkkk.......k...kk...k.kk..k.',
456 '......kk.....s.k..............k.',
457 '.......k.......k....k..k..k...k.',
458 '.......k........k...kkkkkkk..k..',
459 '......kkk........k..........k...',
460 '.....k...kkkkkkkkkkkkkkkkkkk....',
461 '.....k..kk...k....k..k.k..k.....',
462 '.....kkkk..kk......kkk..kk......',
463 '................................',
464 ],
465 [
466 '.........kkkkkkkkkkkkkkk........',
467 '........k...............k.......',
468 '.......k.................k......',
469 '.......k.................k......',
470 '.......k.........kk..s...k.kk...',
471 '.......k........k..k.....kk..k..',
472 '.......k........k...k....k...k..',
473 '..kk...k........k....kkkk....k..',
474 '.k..k..k...s....k............k..',
475 '.k..kkkk......sk..............k.',
476 '..k....k..s....k....k......k..k.',
477 '...kk..k.......k...kk...k.kk..k.',
478 '.....kkk.....s.k..............k.',
479 '.......k.......k....k..k..k...k.',
480 '.......k........k...kkkkkkk..k..',
481 '.......kk........k..........k...',
482 '......k..kkkkkkkkkkkkkkkkkkkk...',
483 '......k..k...k.....k..k.k..k....',
484 '......kkk..kkk......kkk..kkk....',
485 '................................',
486 ],
487 [
488 '................................',
489 '.........kkkkkkkkkkkkkkk........',
490 '........k...............k.......',
491 '.......k.................k......',
492 '.......k.................k......',
493 '.......k.........kk..s...k.kk...',
494 '.......k........k..k.....kk..k..',
495 '.......k........k...k....k...k..',
496 '.......k........k....kkkk....k..',
497 '.......k...s....k............k..',
498 '......kk......sk..............k.',
499 '...kkkkk..s....k....k......k..k.',
500 '.kk....k.......k...kk...k.kk..k.',
501 '.k...kkk.....s.k..............k.',
502 '..kkkk.k.......k....k..k..k...k.',
503 '.......k........k...kkkkkkk..k..',
504 '.......kk........k..........k...',
505 '.......k.kkkkkkkkkkkkkkkkkkkk...',
506 '.......k..kk........k..k.k..k...',
507 '.......kkk..kk.......kkk..kkk...',
508 ],
509 [
510 '................................',
511 '.........kkkkkkkkkkkkkkk........',
512 '........k...............k.......',
513 '.......k.................k......',
514 '.......k.................k......',
515 '.......k.........kk..s...k.kk...',
516 '.......k........k..k.....kk..k..',
517 '.......k........k...k....k...k..',
518 '.......k........k....kkkk....k..',
519 '.......k...s....k............k..',
520 '.....kkk......sk..............k.',
521 '...kk..k..s....k....k......k..k.',
522 '..k....k.......k...kk...k.kk..k.',
523 '.k..kkkk.....s.k..............k.',
524 '.k..k..k.......k....k..k..k...k.',
525 '..kk...k........k...kkkkkkk..k..',
526 '.......kk........k..........k...',
527 '......k..kkkkkkkkkkkkkkkkkkkk...',
528 '......k..k...k.....k..k.k..k....',
529 '......kkk..kkk......kkk..kkk....',
530 ],
531 [
532 '................................',
533 '.........kkkkkkkkkkkkkkk........',
534 '........k...............k.......',
535 '.......k.................k......',
536 '.......k.................k......',
537 '.......k.........kk..s...k.kk...',
538 '.......k........k..k.....kk..k..',
539 '.......k........k...k....k...k..',
540 '.kkkk..k........k....kkkk....k..',
541 'k...kkkk...s....k............k..',
542 'kk....kk......sk..............k.',
543 '..kkkk.k..s....k....k......k..k.',
544 '.....kkk.......k...kk...k.kk..k.',
545 '.......k.....s.k..............k.',
546 '.......k.......k....k..k..k...k.',
547 '......kk........k...kkkkkkk..k..',
548 '.....kkkk........k..........k...',
549 '....k...kkkkkkkkkkkkkkkkkkkk....',
550 '....k..k.k.k.....k..k.k..k......',
551 '....kkk...kk......kkk..kkk......',
552 ],
553 [
554 '................................',
555 '.........kkkkkkkkkkkkkkk........',
556 '........k...............k.......',
557 '.......k.................k......',
558 '.......k.................k......',
559 '.......k.........kk..s...k.kk...',
560 '.......k........k..k.....kk..k..',
561 '..kk...k........k...k....k...k..',
562 '.k..k..k........k....kkkk....k..',
563 '.k..kkkk...s....k............k..',
564 '..k....k......sk..............k.',
565 '...kk..k..s....k....k......k..k.',
566 '.....kkk.......k...kk...k.kk..k.',
567 '.......k.....s.k..............k.',
568 '.......k.......k....k..k..k...k.',
569 '......kk........k...kkkkkkk..k..',
570 '.....k.kk........k..........k...',
571 '....k...kkkkkkkkkkkkkkkk.k......',
572 '....k..k.k.k.....k..k.k..k......',
573 '....kkk..kk......kkk...kkk......',
574 ],
575]
576export const DOT_W = 32
577export const DOT_H = 20 // dots = 5 rows of braille cells
578hooks/cat-png.ts 23 lines1// The 12 frames of nyan.cat/cats/original.gif (272x168, 8x pixels) as base64 PNG, for the Image path.
2// Nyan Cat © Chris Torres; fan project.
3export const PNG_FRAMES: readonly string[] = [
4 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADgUlEQVR42u3dTW7bMBCA0WGRGyVnks7knMk6E7vtJmHQCc0fvbct6sSy84GGB6NSaw2+VkpxgfhSrbXc+fn/8RYABAQQEEBAAAEBEBBAQICZvIU5j2/nPOrz4V3C/79/Np8TcQIBBAQQEEBAAAEBEBBAQICplN33gQyf87gO77KZvX/2ff99nLHznIgTCCAggIAAAgIICICAAAIChH0gO1l9zuOzMQdxHHM/fu/Xr/OciBMIICAAAgIICCAggIAACAgQ9oG8bh/ItfkcBNFzn4h9IAACAggIICCAgAACAiAgQNgHso+bz3mUMzfmUB/11nM4rTmm5vXrPGfiBAIICCAggIAAAgIgIICAAGEOhLjLnMfj8ej6+M05kcXnPNLXr7UPJzkn4gQCCAggIICAAAICICCAgACx1BxIdh9B1ur3zRhu8X0YrTmI9JzI5M/PCQTwEQZAQAABAQQEEBBAQADihftAst9jn+cZI/cZhPvSLC07J2LOwwkEEBBAQAABARAQQEAAAQHCHEj8dI6j9T1469+zcyJhX8et7T6H4QQCCAggIAACAggIICCAgAD8o9SaG6PIzmH03ifSUp+Nn38dt75vTLlOcxYba/39tPbtOIEAPsIAAgIICCAgAAICCAgQW+0DaX1P3JoTGb1PJO6+z6P1+/W+fs1f72jNIcXKcyqrPz8nEEBAAAEBBAQQEAABAQQEiK3mQGLwnEjMPkdBJPfNxMr7NFpzGrM/PycQQEAAAQEEBEBAAAEBBAQIcyDxe3Mi0fm+NLH5fV1Gz6mkf/rk+zyy+ziy/z97fU8nEMBHGEBAAAEBEBBAQAABAcIcyDyy+0aa3htzFtcxdk7j5vtIsvs4dn98JxBAQAABARAQQEAAAQEEBLiVUmvd/b4i3z7B+uz8Pfu195xGOcvQOYbp7xsUY/eNtK5Pdh+PEwggIICAAAICCAiAgAACAoQ5kBfOeWR1nxPZ/Q32sfa+i1h8H0p2zsMJBBAQQEAAAQEQEEBAAAEBwhzIC+c87JvgznrPeTiBAAICCAggIAACAggIICDAUt7CPoXo+T187zmW0fsgYvI5n+z18fo5gQACAggIICAAAgIICCAgQNgHssx9X6LzvoXu962ZfE5g+vv+DH59V3/9nEAAAQEEBBAQQEAABAQQECDMgQBOIICAAAgIICCAgAACAiAgwG/7C0ndD099km6jAAAAAElFTkSuQmCC',
5 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADTUlEQVR42u3dTW7bMBSF0csiO0rWJK1JWVO8JnbQccygCi2SOmdew3/9QCMPj6XWGr5XSvEG8a1aa7nz6//jKwAICCAggIAAAgIgIICAACN5izmPp3Me9evwLeH/vz+Lz4k4gQACAggIICCAgAAICCAgwFDK6vtALp/zeGy+ZSN7/+z7/fvYs/KciBMIICCAgAACAggIgIAAAgLEPpCVzD7n8dmYg9i2sR+/9+fXeU7ECQQQEAABAQQEEBBAQAAEBIh9IK/bB/JYfA6C9NwnYh8IgIAAAgIICCAggIAACAgQ+0DWYc7jqbKfG4OoR731HE5rzqn5/p2cQ3ECAQQEEBBAQAABARAQQECAmAMh5jz+OY6j6+M350Qmn/M4/f619uU05kScQAA/YQABAQQEEBAAAQEEBIg5EF5n8X0YrTmI0edEes95OIEAAgIICICAAAICCAggIEDMgWSeeymIe2nSb07k6ufnBAL4CQMgIICAAAICCAggIAD5xTmQ0e+liH0d5L5zGE4ggIAAAgIgIICAAAICCAhAJroX5uy+kdjXkZ5zKK19GuYsMve+lMb/PycQwE8YQEAAAQEEBEBAAAEBMtUcSGsfx9l9Ib3nBPZ9j30eWXbfyNaaUylzz6mM/vqcQAABAQQEEBBAQAAEBBAQIEvtAzk7J5LZ7+1wb0su3hcz9PNrzSH9YB+HEwjgJwyAgAACAggIICCAgABklHthWnMiufu9MLn3PpLt/MUmmfneld7//uz7uzuBAH7CAAICCAiAgAACAggIEHMgWWeO5L0xZ/HYrp3TsI8kPfdxrP74TiCAgAACAggIgIAAAgIICLCUUmtd/d6Qpy+wfnX+O/rj3nMaZS+XzjG05ihm13vOpDWH5QQC+AkDCAggIICAAAgIICBAzIEMNAfS0n1O5O5fwI+x911k8X0oZ/ftOIEAAgIICCAggIAACAggIEDMgbxwzqP3vgTIwvcqOYEAAgIICCAgAAICCAggIMBU3rwF6fp39qvnVHrPAWTxOR+frxMIICCAgAACAiAggIAAAgLEPpBp7n3JxfsUZn/+Pv97f75OIICAAAICCAggIAACAggIEHMggBMIICAAAgIICCAggIAACAjw2/4CJXP7dF1pbYQAAAAASUVORK5CYII=',
6 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADSUlEQVR42u3dQU7kMBCG0fKIG8GZkjOFM9FnMotZ04WI3LEr7+0HQej55Ba/3K33HgB/8c8jAAQEEBBAQAABARAQQECAmbx5BM+11gxl+FHvvTmBAAgIICCAgAACAiAggIAAYQcSK+w8+tfhVcLfXz/FdyJOIICAAAICCAggIAACAggIMJVW/XNhLt95PDavspm9f459/X3sUXkn4gQCCAggIICAAAICICCAgADhPpBKVt95fCY7iG2b++uP/v0N3ok4gQACAiAggIAAAgIICICAAOE+kNfdB/IovoMgRt4n4j4QAAEBBAQQEEBAAAEBEBAg3AdSh53HU20/N4PoR7/1DifbOaXP7+QOxQkEEBBAQAABAQQEQEAAAQHCDoSw8/jvOI6hXz/diSy+8zj9/LL7cpKdiBMI4C0MICCAgAACAiAggIAAYQfC6xS/DyPbQcy+Exm983ACAQQEEBAAAQEEBBAQQECAsAMhfC5NDWd3Ild/f04ggLcwAAICCAggIICAAAICEHYg4b4O4gY7DCcQQEAAAQEQEEBAAAEBBAQgCu1Ass/VCPd1xMgdSnafhp1FrH1fSvL/ywkE8BYGEBBAQAABARAQQECAuNUOZPmdRhS/z2Px+0a2bKfS1t6pzP7zOYEAAgIICCAggIAACAggIEAstQM5u+O4+u/s+76HHUVd2Q7iatnr7xf3cTiBAN7CAAgIICCAgAACAggIQLzqPpDRO4/hO45wH8mVtvMvwFj5c1dG//uzz3d3AgG8hQEEBBAQAAEBBAQQECAq7UB6723mz30Z/v29JzuLx3btTsN9JDHyPo7qX98JBBAQQEAAAQEQEEBAAAEBSmm99+qfG/L0B+xfg/+O/rj3TqPtzX0yMe99I9nzyXZWTiCAtzCAgAACAggIgIAAAgKEHchEO5DM8J3I3V+AH3PfdxHF70PJdh5OIIC3MICAAAICICCAgAACAoQdyEI7kGxnUP0+CWo7u/NwAgEEBBAQQEAABAQQEEBAgKW8eQQRI3ci2d/hz+5U4uL7IGLxnc/o53f19+cEAngLAwgIgIAAAgIICCAgQLgPxOfCxCz3Laz+/fv91/79OoEAAgIICCAggIAACAggIMBUvgG4iecdbhmW2wAAAABJRU5ErkJggg==',
7 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADSUlEQVR42u3dwW0bMRRF0c/AHdk1zdQ0rkmqiVlkbTMwTZH8c84+hiMpFxTywCm11gD4iT9eAkBAAAEBBAQQEAABAQQEWMmbl+B7pRRDGb5Uay1OIAACAggIICCAgAAICCAgQNiBxA47j/q4fEr4+ecn+U7ECQQQEEBAAAEBBARAQAABAZZSsj8XZvrO43n4lK3s/XPs5+/jjMw7EScQQEAAAQEEBBAQAAEBBAQI94FksvvO47OxgziOtX/+6Pdv8E7ECQQQEAABAQQEEBBAQAAEBAj3gbzuPpBn8h0EMfI+EfeBAAgIICCAgAACAggIgIAA4T6QPOw8vlXOvhlEveqtdzitnVPz9evcoTiBAAICCAggIICAAAgIICBA2IEQdh7/XNc19Oc3dyKb7zy6X7/WfTmNnYgTCOArDCAggIAAAgIgIICAAGEHwuskvw+jtYNYfScyeufhBAIICCAgAAICCAggIICAAGEHQnguTQ69O5HZv58TCOArDICAAAICCAggIICAAIQdSLivg7jBDsMJBBAQQEAABAQQEEBAAAEBiI12IK3nZoT7OmLmDqV1n4adRex9X0rj358TCOArDCAggIAAAgIgIICAAHGrHUjvjqN3R3CeZ7jPI9LeN3K0dipl753K6n8/JxBAQAABAQQEEBAAAQEEBIhUO5DWziP9fRCe2xKT74tZ+vdr7ZD+4z4OJxDAVxgAAQEEBBAQQEAAAQGI39qBjN55DL+vI7vN7yM5+h9sEjs/d2X0n+99fU8nEMBXGEBAAAEBEBBAQAABAcJzYX5PrbXMfC5NvDd2Fs9j7k7DfSQx8j6O7D/fCQQQEEBAAAEBEBBAQAABAVIptdaYubPo3Xn0/n71Mfj/0Z/33mmUs0zdMWS/b2b0zqT179MJBPAVBhAQQEAAAQEQEEBAgEi1A1n+L9i7U3lcPiUj35+Pte+7iOT3ofTusJxAAAEBBAQQEEBAAAQEEBAg7EBeuPMYfV8CROLnKjmBAAICCAggIAACAggIICDAVt68BDH0/9ln71RG7wAi+c7H++sEAggIICCAgAAICCAggIAA4T6QbZ77EpPvU9j99/f+3/v9dQIBBAQQEEBAAAEBEBBAQICl/AXwIunopYE0YQAAAABJRU5ErkJggg==',
8 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADYElEQVR42u3d7W3bMBCA4WOhjZKZpJmcmayZ2AlaArkw/NDz/K9hK+4LBjkcS601AL7jj0cACAggIICAAAICICCAgAAzOTyC/yulGJThn2qtxQkEQEAAAQEEBBAQAAEBBAQIcyCxwpxHfb98S/j+92fzOREnEEBAAAEBBAQQEAABAQQEmErZ/V6Y4XMe9+lbNrOPr77fv88rdp4TcQIBBAQQEEBAAAEBEBBAQICwD2Qnq895fDXmIM5z7tfv/fPrPCfiBAIICICAAAICCAggIAACAoR9IL+3D+TefA6C6LlPxD4QAAEBBAQQEEBAAAEBEBAg7APZx8PnPMqVG3Oor/roOZzWHFPz+XWeM3ECAQQEEBBAQAABARAQQECAMAdCPGXO4/V6dX395pzI4nMe6efX2oeTnBNxAgEEBBAQQEAAAQEQEEBAgDAHwu9ZfB9Gaw4iPScy+edzAgH8CgMgIICAAAICCAggIADxg3Mg2XspsnrfaxHupVladk7EnIcTCCAggIAAAgIgIICAAAICbOTofS9Fy3VdMfMcStjXETvPieAEAggIICCAgAAICCAggIAAGykRUVf+O3trjqSlvhvv/z4ffW9MuS9zFhtr/f9p7eNxAgH8CgMICCAggIAACAggIMBUjuy9K6P3dbTmELJzIrH7Po/W++v9/Jpv72x9/5aeU1n98zmBAAICCAggIICAAAgIICDAVI7sC2TnSCI5Z3INnlNwb0tfrTmImHyfRmtOY/bP5wQCCAggIICAAAgIICCAgADxqDmQ3lbfVxKD73UZPady5he+TP34s/s4sv8++3wvJxDArzCAgAACAiAggIAAAgKEOZAH+WjMWdzn2DmNh+8jye7j2P31nUAAAQEEBEBAAAEBBAQQEOBRSq119XtDUh+gvjv/nf3ee06jXGXoHMPwe4Fi7n0jreeT3bfjBAIICCAggIAAAgIgIICAAGEOZKF7XbrPiez+Bftce99FLL4PJTvn4QQCCAggIICAAAgIICCAgABhDuQH5zzsk4AYNufhBAIICCAggIAACAggIICAAEs5wr6EMnJOZfQ+h1h8zsfP1wkEEBBAQAAEBBAQQEAAAQGIZfaBxOT7ElZ//7vf+5N9fn6+TiCAgAACAggIgIAAAgIICLCQv5Ym+Ujguq3FAAAAAElFTkSuQmCC',
9 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADXklEQVR42u3djW3bMBCA0VORjZKZpJnkmeKZmAnaC8zS/HtvgKBW1A80cjgepZQAeMUfjwAQEEBAAAEBBARAQAABAUby4RH823EcBmX4q1LK4QQCICCAgAACAggIgIAAAgKEOZCYYc6jfN/eEl5/fxafE3ECAQQEEBBAQAABARAQQECAoRyr3wvTfc7jeXrLRvb5aPv+fV2x8pyIEwggIICAAAICCAiAgAACAoR9ICuZfc7jkcxBnOfYP7/176/xnIgTCCAgAAICCAggIICAAAgIEPaBvG8fyHPxOYjWz/+qW3dR7jL1PpHafSDZ+5s+v8b7RpxAAAEBBAQQEEBAAAQEEBAg7APZyeZzHvd9N/356ZzI4HM42ZxH9fPL5qAq50ScQAABAQQEEBBAQAAEBBAQIMyBwC9lcxDVcyKDfz4nEMBXGAABAQQEEBBAQAABAYg3zoGMfm/F9ha/l6Z2TsSchxMIICCAgAACAiAggIAAAgLERnMgs99bEe6lCftEcAIBBAQQEAABAQQEEBBAQIAwBzKA2n0jYV9H3fNP9mmYs4i596VUzmE5gQC+wgACAggIICAAAgIICBBTzYFkfweu3RfSeo7guq6wryNen0Pp/njObI4hZp5Tmf3zOYEAAgIICCAggIAACAggIEAstQ+kdk4kZr/XY/B9HlE7h9J5jiabg+gtmzP6xT4OJxDAVxgAAQEEBBAQQEAABAT4X45Sytb3wpTvZM7kee79glTeC1P79B7+jzZ9vkcyx+JeGMBXGEBAAAEBEBBAQAABAWKrfSCtZX+Hjs5zJGEfScy8j2P1n+8EAggIICAAAgIICCAggIAAYR/ISh8wmQNJ94Fksn0hi89p1O4LicZzILNrPWdSO2flBAIICCAggIAAAgIgIICAAGEOZKB7Y6rnQCLcKzPwnMjqWs95OIEAAgIICCAgAAICCAggIECYA3njnEc2R1C7L6L5nMjuL+DX5SF0vDfJCQQQEEBAAAEBEBBAQAABAcIcyEBzHuFeEWLce1t67+twAgEEBBAQAAEBBAQQEEBAgK18hHszjp5zKqvPCYz+/HrPITmBAAICICCAgAACAggIgIAAsdE+kOh8b8bo/77Z50BGf35+/04ggIAAAgIICICAAAICCAgwkR8sXwnqSaNbngAAAABJRU5ErkJggg==',
10 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADgUlEQVR42u3dTW7bMBCA0WGRGyVnks7knMk6E7vtJmHQCc0fvbct6sSy84GGB6NSaw2+VkpxgfhSrbXc+fn/8RYABAQQEEBAAAEBEBBAQICZvIU5j2/nPOrz4V3C/79/Np8TcQIBBAQQEEBAAAEBEBBAQICplN33gQyf87gO77KZvX/2ff99nLHznIgTCCAggIAAAgIICICAAAIChH0gO1l9zuOzMQdxHHM/fu/Xr/OciBMIICAAAgIICCAggIAACAgQ9oG8bh/ItfkcBNFzn4h9IAACAggIICCAgAACAiAgQNgHso+bz3mUMzfmUB/11nM4rTmm5vXrPGfiBAIICCAggIAAAgIgIICAAGEOhLjLnMfj8ej6+M05kcXnPNLXr7UPJzkn4gQCCAggIICAAAICICCAgACx1BxIdh9B1ur3zRhu8X0YrTmI9JzI5M/PCQTwEQZAQAABAQQEEBBAQADihftAst9jn+cZI/cZhPvSLC07J2LOwwkEEBBAQAABARAQQEAAAQHCHEj8dI6j9T1469+zcyJhX8et7T6H4QQCCAggIAACAggIICCAgAD8o9SaG6PIzmH03ifSUp+Nn38dt75vTLlOcxYba/39tPbtOIEAPsIAAgIICCAgAAICCAgQW+0DaX1P3JoTGb1PJO6+z6P1+/W+fs1f72jNIcXKcyqrPz8nEEBAAAEBBAQQEAABAQQEiK3mQGLwnEjMPkdBJPfNxMr7NFpzGrM/PycQQEAAAQEEBEBAAAEBBAQIcyDxe3Mi0fm+NLH5fV1Gz6mkf/rk+zyy+ziy/z97fU8nEMBHGEBAAAEBEBBAQAABAcIcyDyy+0aa3htzFtcxdk7j5vtIsvs4dn98JxBAQAABARAQQEAAAQEEBLiVUmvd/b4i3z7B+uz8Pfu195xGOcvQOYbp7xsUY/eNtK5Pdh+PEwggIICAAAICCAiAgAACAoQ5kBfOeWR1nxPZ/Q32sfa+i1h8H0p2zsMJBBAQQEAAAQEQEEBAAAEBwhzIC+c87JvgznrPeTiBAAICCAggIAACAggIICDAUt7CPoXo+T187zmW0fsgYvI5n+z18fo5gQACAggIICAAAgIICCAgQNgHssx9X6LzvoXu962ZfE5g+vv+DH59V3/9nEAAAQEEBBAQQEAABAQQECDMgQBOIICAAAgIICCAgAACAiAgwG/7C0ndD099km6jAAAAAElFTkSuQmCC',
11 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADTUlEQVR42u3dTW7bMBSF0csiO0rWJK1JWVO8JnbQccygCi2SOmdew3/9QCMPj6XWGr5XSvEG8a1aa7nz6//jKwAICCAggIAAAgIgIICAACN5izmPp3Me9evwLeH/vz+Lz4k4gQACAggIICCAgAAICCAgwFDK6vtALp/zeGy+ZSN7/+z7/fvYs/KciBMIICCAgAACAggIgIAAAgLEPpCVzD7n8dmYg9i2sR+/9+fXeU7ECQQQEAABAQQEEBBAQAAEBIh9IK/bB/JYfA6C9NwnYh8IgIAAAgIICCAggIAACAgQ+0DWYc7jqbKfG4OoR731HE5rzqn5/p2cQ3ECAQQEEBBAQAABARAQQECAmAMh5jz+OY6j6+M350Qmn/M4/f619uU05kScQAA/YQABAQQEEBAAAQEEBIg5EF5n8X0YrTmI0edEes95OIEAAgIICICAAAICCAggIEDMgWSeeymIe2nSb07k6ufnBAL4CQMgIICAAAICCAggIAD5xTmQ0e+liH0d5L5zGE4ggIAAAgIgIICAAAICCAhAJroX5uy+kdjXkZ5zKK19GuYsMve+lMb/PycQwE8YQEAAAQEEBEBAAAEBMtUcSGsfx9l9Ib3nBPZ9j30eWXbfyNaaUylzz6mM/vqcQAABAQQEEBBAQAAEBBAQIEvtAzk7J5LZ7+1wb0su3hcz9PNrzSH9YB+HEwjgJwyAgAACAggIICCAgABklHthWnMiufu9MLn3PpLt/MUmmfneld7//uz7uzuBAH7CAAICCAiAgAACAggIEHMgWWeO5L0xZ/HYrp3TsI8kPfdxrP74TiCAgAACAggIgIAAAgIICLCUUmtd/d6Qpy+wfnX+O/rj3nMaZS+XzjG05ihm13vOpDWH5QQC+AkDCAggIICAAAgIICBAzIEMNAfS0n1O5O5fwI+x911k8X0oZ/ftOIEAAgIICCAggIAACAggIEDMgbxwzqP3vgTIwvcqOYEAAgIICCAgAAICCAggIMBU3rwF6fp39qvnVHrPAWTxOR+frxMIICCAgAACAiAggIAAAgLEPpBp7n3JxfsUZn/+Pv97f75OIICAAAICCAggIAACAggIEHMggBMIICAAAgIICCAggIAACAjw2/4CJXP7dF1pbYQAAAAASUVORK5CYII=',
12 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADSUlEQVR42u3dQU7kMBCG0fKIG8GZkjOFM9FnMotZ04WI3LEr7+0HQej55Ba/3K33HgB/8c8jAAQEEBBAQAABARAQQECAmbx5BM+11gxl+FHvvTmBAAgIICCAgAACAiAggIAAYQcSK+w8+tfhVcLfXz/FdyJOIICAAAICCAggIAACAggIMJVW/XNhLt95PDavspm9f459/X3sUXkn4gQCCAggIICAAAICICCAgADhPpBKVt95fCY7iG2b++uP/v0N3ok4gQACAiAggIAAAgIICICAAOE+kNfdB/IovoMgRt4n4j4QAAEBBAQQEEBAAAEBEBAg3AdSh53HU20/N4PoR7/1DifbOaXP7+QOxQkEEBBAQAABAQQEQEAAAQHCDoSw8/jvOI6hXz/diSy+8zj9/LL7cpKdiBMI4C0MICCAgAACAiAggIAAYQfC6xS/DyPbQcy+Exm983ACAQQEEBAAAQEEBBAQQECAsAMhfC5NDWd3Ild/f04ggLcwAAICCAggIICAAAICEHYg4b4O4gY7DCcQQEAAAQEQEEBAAAEBBAQgCu1Ass/VCPd1xMgdSnafhp1FrH1fSvL/ywkE8BYGEBBAQAABARAQQECAuNUOZPmdRhS/z2Px+0a2bKfS1t6pzP7zOYEAAgIICCAggIAACAggIEAstQM5u+O4+u/s+76HHUVd2Q7iatnr7xf3cTiBAN7CAAgIICCAgAACAggIQLzqPpDRO4/hO45wH8mVtvMvwFj5c1dG//uzz3d3AgG8hQEEBBAQAAEBBAQQECAq7UB6723mz30Z/v29JzuLx3btTsN9JDHyPo7qX98JBBAQQEAAAQEQEEBAAAEBSmm99+qfG/L0B+xfg/+O/rj3TqPtzX0yMe99I9nzyXZWTiCAtzCAgAACAggIgIAAAgKEHchEO5DM8J3I3V+AH3PfdxHF70PJdh5OIIC3MICAAAICICCAgAACAoQdyEI7kGxnUP0+CWo7u/NwAgEEBBAQQEAABAQQEEBAgKW8eQQRI3ci2d/hz+5U4uL7IGLxnc/o53f19+cEAngLAwgIgIAAAgIICCAgQLgPxOfCxCz3Laz+/fv91/79OoEAAgIICCAggIAACAggIMBUvgG4iecdbhmW2wAAAABJRU5ErkJggg==',
13 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADSUlEQVR42u3dwW0bMRRF0c/AHdk1zdQ0rkmqiVlkbTMwTZH8c84+hiMpFxTywCm11gD4iT9eAkBAAAEBBAQQEAABAQQEWMmbl+B7pRRDGb5Uay1OIAACAggIICCAgAAICCAgQNiBxA47j/q4fEr4+ecn+U7ECQQQEEBAAAEBBARAQAABAZZSsj8XZvrO43n4lK3s/XPs5+/jjMw7EScQQEAAAQEEBBAQAAEBBAQI94FksvvO47OxgziOtX/+6Pdv8E7ECQQQEAABAQQEEBBAQAAEBAj3gbzuPpBn8h0EMfI+EfeBAAgIICCAgAACAggIgIAA4T6QPOw8vlXOvhlEveqtdzitnVPz9evcoTiBAAICCAggIICAAAgIICBA2IEQdh7/XNc19Oc3dyKb7zy6X7/WfTmNnYgTCOArDCAggIAAAgIgIICAAGEHwuskvw+jtYNYfScyeufhBAIICCAgAAICCAggIICAAGEHQnguTQ69O5HZv58TCOArDICAAAICCAggIICAAIQdSLivg7jBDsMJBBAQQEAABAQQEEBAAAEBiI12IK3nZoT7OmLmDqV1n4adRex9X0rj358TCOArDCAggIAAAgIgIICAAHGrHUjvjqN3R3CeZ7jPI9LeN3K0dipl753K6n8/JxBAQAABAQQEEBAAAQEEBIhUO5DWziP9fRCe2xKT74tZ+vdr7ZD+4z4OJxDAVxgAAQEEBBAQQEAAAQGI39qBjN55DL+vI7vN7yM5+h9sEjs/d2X0n+99fU8nEMBXGEBAAAEBEBBAQAABAcJzYX5PrbXMfC5NvDd2Fs9j7k7DfSQx8j6O7D/fCQQQEEBAAAEBEBBAQAABAVIptdaYubPo3Xn0/n71Mfj/0Z/33mmUs0zdMWS/b2b0zqT179MJBPAVBhAQQEAAAQEQEEBAgEi1A1n+L9i7U3lcPiUj35+Pte+7iOT3ofTusJxAAAEBBAQQEEBAAAQEEBAg7EBeuPMYfV8CROLnKjmBAAICCAggIAACAggIICDAVt68BDH0/9ln71RG7wAi+c7H++sEAggIICCAgAAICCAggIAA4T6QbZ77EpPvU9j99/f+3/v9dQIBBAQQEEBAAAEBEBBAQICl/AXwIunopYE0YQAAAABJRU5ErkJggg==',
14 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADYElEQVR42u3d7W3bMBCA4WOhjZKZpJmcmayZ2AlaArkw/NDz/K9hK+4LBjkcS601AL7jj0cACAggIICAAAICICCAgAAzOTyC/yulGJThn2qtxQkEQEAAAQEEBBAQAAEBBAQIcyCxwpxHfb98S/j+92fzOREnEEBAAAEBBAQQEAABAQQEmErZ/V6Y4XMe9+lbNrOPr77fv88rdp4TcQIBBAQQEEBAAAEBEBBAQICwD2Qnq895fDXmIM5z7tfv/fPrPCfiBAIICICAAAICCAggIAACAoR9IL+3D+TefA6C6LlPxD4QAAEBBAQQEEBAAAEBEBAg7APZx8PnPMqVG3Oor/roOZzWHFPz+XWeM3ECAQQEEBBAQAABARAQQECAMAdCPGXO4/V6dX395pzI4nMe6efX2oeTnBNxAgEEBBAQQEAAAQEQEEBAgDAHwu9ZfB9Gaw4iPScy+edzAgH8CgMgIICAAAICCAggIADxg3Mg2XspsnrfaxHupVladk7EnIcTCCAggIAAAgIgIICAAAICbOTofS9Fy3VdMfMcStjXETvPieAEAggIICCAgAAICCAggIAAGykRUVf+O3trjqSlvhvv/z4ffW9MuS9zFhtr/f9p7eNxAgH8CgMICCAggIAACAggIMBUjuy9K6P3dbTmELJzIrH7Po/W++v9/Jpv72x9/5aeU1n98zmBAAICCAggIICAAAgIICDAVI7sC2TnSCI5Z3INnlNwb0tfrTmImHyfRmtOY/bP5wQCCAggIICAAAgIICCAgADxqDmQ3lbfVxKD73UZPady5he+TP34s/s4sv8++3wvJxDArzCAgAACAiAggIAAAgKEOZAH+WjMWdzn2DmNh+8jye7j2P31nUAAAQEEBEBAAAEBBAQQEOBRSq119XtDUh+gvjv/nf3ee06jXGXoHMPwe4Fi7n0jreeT3bfjBAIICCAggIAAAgIgIICAAGEOZKF7XbrPiez+Bftce99FLL4PJTvn4QQCCAggIICAAAgIICCAgABhDuQH5zzsk4AYNufhBAIICCAggIAACAggIICAAEs5wr6EMnJOZfQ+h1h8zsfP1wkEEBBAQAAEBBAQQEAAAQGIZfaBxOT7ElZ//7vf+5N9fn6+TiCAgAACAggIgIAAAgIICLCQv5Ym+Ujguq3FAAAAAElFTkSuQmCC',
15 'iVBORw0KGgoAAAANSUhEUgAAARAAAACoCAYAAAAo5LG5AAADXklEQVR42u3djW3bMBCA0VORjZKZpJnkmeKZmAnaC8zS/HtvgKBW1A80cjgepZQAeMUfjwAQEEBAAAEBBARAQAABAUby4RH823EcBmX4q1LK4QQCICCAgAACAggIgIAAAgKEOZCYYc6jfN/eEl5/fxafE3ECAQQEEBBAQAABARAQQECAoRyr3wvTfc7jeXrLRvb5aPv+fV2x8pyIEwggIICAAAICCAiAgAACAoR9ICuZfc7jkcxBnOfYP7/176/xnIgTCCAgAAICCAggIICAAAgIEPaBvG8fyHPxOYjWz/+qW3dR7jL1PpHafSDZ+5s+v8b7RpxAAAEBBAQQEEBAAAQEEBAg7APZyeZzHvd9N/356ZzI4HM42ZxH9fPL5qAq50ScQAABAQQEEBBAQAAEBBAQIMyBwC9lcxDVcyKDfz4nEMBXGAABAQQEEBBAQAABAYg3zoGMfm/F9ha/l6Z2TsSchxMIICCAgAACAiAggIAAAgLERnMgs99bEe6lCftEcAIBBAQQEAABAQQEEBBAQIAwBzKA2n0jYV9H3fNP9mmYs4i596VUzmE5gQC+wgACAggIICAAAgIICBBTzYFkfweu3RfSeo7guq6wryNen0Pp/njObI4hZp5Tmf3zOYEAAgIICCAggIAACAggIEAstQ+kdk4kZr/XY/B9HlE7h9J5jiabg+gtmzP6xT4OJxDAVxgAAQEEBBAQQEAABAT4X45Sytb3wpTvZM7kee79glTeC1P79B7+jzZ9vkcyx+JeGMBXGEBAAAEBEBBAQAABAWKrfSCtZX+Hjs5zJGEfScy8j2P1n+8EAggIICAAAgIICCAggIAAYR/ISh8wmQNJ94Fksn0hi89p1O4LicZzILNrPWdSO2flBAIICCAggIAAAgIgIICAAGEOZKB7Y6rnQCLcKzPwnMjqWs95OIEAAgIICCAgAAICCAggIECYA3njnEc2R1C7L6L5nMjuL+DX5SF0vDfJCQQQEEBAAAEBEBBAQAABAcIcyEBzHuFeEWLce1t67+twAgEEBBAQAAEBBAQQEEBAgK18hHszjp5zKqvPCYz+/HrPITmBAAICICCAgAACAggIgIAAsdE+kOh8b8bo/77Z50BGf35+/04ggIAAAgIICICAAAICCAgwkR8sXwnqSaNbngAAAABJRU5ErkJggg==',
16]
17
18// Two phases of the rainbow's wave at the cat's scale (4x), stretched by the terminal to the strip's width.
19export const RAINBOW_PNG: readonly string[] = [
20 'iVBORw0KGgoAAAANSUhEUgAABAAAAABUCAYAAAAcTUVxAAACi0lEQVR42u3cwa3CMBBF0TeIjkJN/jXFNUFNpgSy+COQdU4ByYXlk+MEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAB+S61ktb4gqc7n69evX79+/fr169evX79+/fo/u9lAAAAAYH8GAAAAADAAAAAAAHEHAAAAABAnAAAAAAADAAAAAGAAAAAAAP7HPWfzG/6an69fv379+vXr169fv379+vXrjxMAAAAAgAEAAAAADAAAAADAFmqdWf4GAAAAiBMAAAAAgAEAAAAAMAAAAAAA+fodAKv5DoDZ/AtG8/P169evX79+/fr169evX7/+DfqdAAAAAID4BAAAAAAwAAAAAABxBwAAAAAQJwAAAAAAAwAAAABgAAAAAACuuT+aX/Bsfr5+/fr169evX79+/fr169evP04AAAAAAAYAAAAAMAAAAAAAe6hjZfkbAAAAIE4AAAAAAAYAAAAAwAAAAAAAfFvlXK13AByjWn/Aa/ZeYaBfv379+vXr169fv379+vXv0O8EAAAAAMQnAAAAAIABAAAAAIg7AAAAAIA4AQAAAAAYAAAAAAADAAAAAHBNjaP3DoA5en/AmL3P169fv379+vXr169fv379+nfodwIAAAAA4hMAAAAAwAAAAAAAxB0AAAAAQJwAAAAAAAwAAAAAgAEAAAAAuKa6X9B9x8B8VenXr1+/fv369evXr1+/fv364wQAAAAAxCcAAAAAgAEAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAIA2b4sGQFgZHdAYAAAAAElFTkSuQmCC',
21 'iVBORw0KGgoAAAANSUhEUgAABAAAAABUCAYAAAAcTUVxAAAChklEQVR42u3c0U3EQBBEwR60GZmYTEx2TFxMQwYICY0Mq6oAvO/82VpfAgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAf0tNH9BJD/+A0q9fv379+vXr169fv379+vV/780GAgAAAPszAAAAAIABAAAAANhBTX+jAAAAAMQNAAAAAMAAAAAAABgAAAAAgJ9Y4ydcw8//0K9fv379+vXr169fv379+vXHDQAAAADAAAAAAAAGAAAAAGAH1VfaawAAAIC4AQAAAAAYAAAAAAADAAAAAPC0NX7COfz8W79+/fr169evX79+/fr169cfNwAAAAAAAwAAAAAYAAAAAIAdVHfaawAAAIC4AQAAAAAYAAAAAAADAAAAAPC0NX3A+/DzP/Xr169fv379+vXr169fv379cQMAAAAAMAAAAACAAQAAAADYQh2d9hoAAAAgbgAAAAAABgAAAADAAAAAAAA8bU0f8Lpn/2LgOEu/fv369evXr1+/fv369evXHzcAAAAAID4BAAAAAAwAAAAAwP9Xubq9BgAAAIgbAAAAAIABAAAAADAAAAAAAE9b0wec9+zz71O/fv369evXr1+/fv369evXHzcAAAAAAAMAAAAAGAAAAACAHdR5dHsNAAAAEDcAAAAAAAMAAAAAYAAAAAAAnramD7hfVZPPn/4PA/369evXr1+/fv369evXr3+HfjcAAAAAID4BAAAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD8xhfMBDVuuMB4TQAAAABJRU5ErkJggg==',
22]
23