SLOPSHOPPER

nyan-progress

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…

newspinnercommandtimer
A shopper browsing a rack in a slop shop
Preview · a replayed session in a sandbox
claude · ~/work/app · nyan-progress
› fix the failing auth test and add an audit log call ⏺ Read(src/auth.ts) ⎿ Read 6 lines ⏺ Update(src/auth.ts) ⎿ Added 2 lines, removed 1 line ⏺ Bash(bun test) ⎿ 3 pass, 1 fail ● Done. refresh now rejects expired claims and logs an audit event. ✻ Worked for 42s · done 4:20 PM › /nyan ⎿ nyan-progress: gif. Usage: /nyan gif|pixel|dots ▣ ▣ ✻ Thinking… ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── › ? for shortcuts

Draws

Spinner
▣ ▣ ✻ Thinking…
README

nyan-progress

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

What's New in 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).

What's New in 0.1.0

  • The first release. It has three looks (gif, pixel, dots), and /nyan switches between them.

Installation

/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.

Looks

/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.

gif

  • pixel: the 34×21 sprite in half-block colour cells, 11 rows. It works in any truecolor terminal.

pixel

  • 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.

dots

Pictures inside a multiplexer

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

How it works

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.
  • The timer ticks every 100 ms. This matches the engine's repaint cap for the spinner row. A faster timer drops frames unevenly, so the strip stutters, mostly before the first tokens.
  • 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.

Credits

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.

Testing

claude plugin test plugins/nyan
Source 3 files
hooks/register.tsx 188 lines
1import 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}
188
hooks/cat.ts 578 lines
1// 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
578
hooks/cat-png.ts 23 lines
1// 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