A one-line band above the prompt with model, cost and bars for context, the 5-hour session, the week and per-model limits, plus a native settings window on…

<img src="arte/mascote-animado.svg" width="108" height="63" alt="Animated pixel crab mascot">
A Claude Code mod that keeps your limits in sight: context window, 5-hour session, week and per-model usage, in one line above the prompt.
Install · What it shows · Meet the mascot · What leaves your machine · Settings window
<img src="docs/band-terminal.svg" width="100%" alt="Claude Code in a terminal. Above the prompt box, one line reads: a small orange crab face, Opus 5.5, $34.63, Context 56%, 5h 25%, 7d 4%, Fable 2%, each with a solid bar">
<sub>In the terminal: the band line is the mod's real output at 110 columns with sample numbers, drawn cell by cell in Claude Code's dark theme colors; the window around it is an illustration.</sub>
<img src="docs/band-desktop.png" width="100%" alt="The band in the Claude desktop app: pixel crab mascot, Opus 5.5, cost R$ 372,71, and bars for Contexto 32%, 5h 36%, 7d 48% and Fable 13%, then the settings gear and the close mark">
<sub>In the Claude desktop app.</sub>
Status: early release (0.4.4), maintained by one person. In daily use on macOS 26.6, in the terminal and in the desktop app. On 2026-10-22, a clean install from GitHub loaded on Claude Code 2.1.295 (which some desktop apps still bundle), 2.1.299, 2.1.304 and 2.1.306, and CI checks the oldest and the newest on every push. On Windows, the first user (Windows 11, x64) ran it in the desktop app and in the claude CLI: the band showed up, and the settings window opened, but behind the Claude window; 0.4.2 fixes that. The fix and the window were checked on Windows Server 2022 and 2025 and Windows 11 ARM runners, not yet on that PC. The settings window needs macOS 26 or Windows 10/11 with .NET Framework 4.8.
↻ 2h 10m), and the tokens used next to the context bar (112k/200k), when the line has room.A pixel crab sits at the start of the band and runs through 13 gestures in a 56-second loop. Pick animated, still or hidden; it stays still when your system asks for reduced motion. In the terminal, which has no pictures, it is a one-line face: arms, an orange body and two black eyes.
| | | | | | |:-:|:-:|:-:|:-:|:-:| | <img src="docs/gestures/laptop.svg" width="96" alt="Typing on a laptop"><br><sub>Laptop</sub> | <img src="docs/gestures/cafe.svg" width="96" alt="Sipping coffee"><br><sub>Coffee</sub> | <img src="docs/gestures/danca.svg" width="96" alt="Dancing with music notes"><br><sub>Dance</sub> | <img src="docs/gestures/oculos.svg" width="96" alt="Sunglasses drop down and shine"><br><sub>Shades</sub> | <img src="docs/gestures/festa.svg" width="96" alt="Party hat and confetti"><br><sub>Party</sub> | | <img src="docs/gestures/dormir.svg" width="96" alt="Napping with Zzz, then waking up"><br><sub>Nap</sub> | <img src="docs/gestures/caranguejo.svg" width="96" alt="Walking sideways"><br><sub>Crab walk</sub> | <img src="docs/gestures/coracao.svg" width="96" alt="A heart floats up"><br><sub>Heart</sub> | <img src="docs/gestures/ideia.svg" width="96" alt="A star blinks: an idea"><br><sub>Idea</sub> | <img src="docs/gestures/esconde.svg" width="96" alt="Hides below the edge, peeks and jumps back"><br><sub>Peekaboo</sub> | | <img src="docs/gestures/acenar.svg" width="96" alt="Waving"><br><sub>Wave</sub> | <img src="docs/gestures/pulinho.svg" width="96" alt="Two little hops"><br><sub>Hop</sub> | <img src="docs/gestures/olhar.svg" width="96" alt="Looking around"><br><sub>Look around</sub> | | |
In Claude Code, in a terminal:
/plugin install usage-band-mod --marketplace jonathanlocks/usage-band-mod
In the Claude desktop app, where /plugin is not available: click + next to the prompt box, then Plugins, Add marketplace with jonathanlocks/usage-band-mod, then Add plugin.
From a shell:
claude plugin install usage-band-mod --marketplace jonathanlocks/usage-band-mod
The install screen asks for the options below. Change them later in /config, under usage-band-mod, or in the settings window on macOS and Windows.
Step-by-step guides, written so an agent can follow them: INSTALL-MACOS.md · INSTALL-WINDOWS.md.
| Command | What it does |
|---|---|
/usage-band | Shows or hides the band. The × on the band hides it too. |
/usage-settings | Opens the settings window (macOS 26; Windows 10/11 as a preview, see Status). In the desktop app, the ⚙ on the band does the same. |
With the language set to Portuguese, the commands are /uso-barra and /uso-ajustes.
| Option | Values | Default |
|---|---|---|
| Language | en, pt | en |
| Currency | USD, BRL, EUR | USD |
| Mascot | animado (animated), parado (still), oculto (hidden) | animado |
| Per-model weekly limit | on, off | on |
| Where | When | What |
|---|---|---|
api.anthropic.com/api/oauth/usage | At most every 10 minutes, only with the per-model limit on | A GET with your subscription login. Claude Code attaches the token; the mod never sees it. |
api.coinbase.com/v2/exchange-rates | At most every 6 hours, only when the currency is not USD | A GET with no login. After a failure it waits 5 minutes, then 30 minutes, then 2 hours. A rate older than 3 days is not used. |
Nothing about your conversations, projects or files is sent. With CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC set, the mod makes no requests at all.
[!NOTE] The per-model limit reads an internal Anthropic endpoint with no public documentation. It can change or stop working without notice; if it does, that bar disappears. Turn the option off if you would rather not use it.
/usage is enough.| | | |:-:|:-:| | <img src="docs/ajustes-en.png" width="100%" alt="Settings window on macOS 26: a preview of the band, then language, cost currency, mascot style and the per-model weekly limit switch, on Liquid Glass"> | <img src="docs/ajustes-windows-en.png" width="100%" alt="Settings window on Windows in the dark theme, rendered by the app: the same preview of the band and the same four settings"> | | <sub>macOS 26, Liquid Glass</sub> | <sub>Windows, dark theme: the window's content rendered at 2× by the app's --print on a CI runner (Windows Server 2025). The title bar strip is drawn by the app; the real one belongs to Windows.</sub> |
macos/PainelDeUso.app is a small SwiftUI app built from macos/Sources/PainelDeUso.swift. It does not use the network. It talks to the mod only through standard output, one JSON line per change, and changes apply to the band right away. Its only file output is a PNG, and only when you run it by hand with the developer flag --print.
The repository ships the app already built (universal, ad-hoc signed), so you do not need Xcode. To check that the shipped app matches this source, build it yourself. The script builds in a temporary folder, compares the result with the published SHA-256 in macos/PainelDeUso.sha256 and prints OK or FAILED; the shipped app is left as it is:
./macos/build.sh
The published hash comes from Swift 6.4 (Xcode command line tools with the macOS 26 SDK). Another Swift version can produce a different binary, and then the check fails even though the source is the same.
windows/PainelDeUso.exe is a small WPF app built from windows/Sources on .NET Framework 4.8, which Windows 10 (1903 and later) and Windows 11 already include; nothing to install. It follows the system theme, high contrast and reduced motion, works with the keyboard, and gives every control a name for screen readers such as Narrator; all of that was checked on CI runners, not on a person's PC. On Windows 11 it asks the system for the Mica background: the runners accepted the request but drew a solid color, so Mica has not been seen on screen yet. Windows 10 gets a solid background (rendered sample). It does not use the network and talks to the mod only through standard output, the same JSON lines as on the Mac. Its only file output is a PNG with the developer flag --print.
Not code-signed. The executable has no digital signature and has not been tested against SmartScreen, Smart App Control or antivirus software. On Windows 11 with Smart App Control on, Windows may refuse to run it, and Smart App Control has no per-app exception. If the window does not open, /usage-settings says so and points to /config, which has the same options; INSTALL-WINDOWS.md shows how to tell whether Smart App Control is the cause.
To check the shipped executable against the source, install the .NET SDK pinned in windows/global.json and run one of these, in PowerShell 7 or in the Windows PowerShell 5.1 that comes with Windows:
pwsh windows/build.ps1
powershell -ExecutionPolicy Bypass -File windows\build.ps1
The build is deterministic: CI compiles it on two Windows images and compares both with windows/PainelDeUso.sha256.
On Linux, in WSL, or on macOS before 26, use /config. The options are the same.
claude plugin validate .
claude plugin test .
claude --plugin-dir .
pwsh windows/build.ps1 # on Windows, with the .NET SDK from windows/global.json (or powershell -File, see above)
The mascot is drawn frame by frame in arte/gerar_mascote.py:
python3 arte/gerar_mascote.py # writes hooks/mascote.ts and arte/mascote-animado.svg
python3 arte/gerar_mascote.py --docs # also writes docs/gestures/<gesture>.svg for this README
python3 arte/gerar_mascote.py --previa # also writes arte/previa.html with every gesture
python3 arte/gerar_mascote.py --check # fails if any of those files is out of date
tsconfig.json extends .claude-plugin/types/tsconfig.json, which Claude Code writes when it loads the mod from a watched plugin folder. On a fresh clone, write the types once and then run tsc (the first command may answer Not logged in; the types are written anyway):
CLAUDE_CODE_PLUGIN_DIR_WATCH=1 claude --plugin-dir . -p ok
npx -y -p typescript@5.9.3 tsc -p .
GitHub Actions runs ci.yml on every push: validate, test and type-check on Linux, macOS and Windows, and again on engine 2.1.295 (the one some desktop apps bundle); check both published hashes, the mascot files and that no file has CRLF line endings; rebuild PainelDeUso.exe on two Windows images and compare it with the published hash; on the exe just built, talk to it the way the mod does, check that it opens in front of the window that asked for it, and scan its accessibility tree; and install the mod from PowerShell. capturas.yml runs by hand and produces PNGs of the Windows window in light and dark, English and Portuguese, with the Windows 11 and the Windows 10 path, real screenshots (light, dark, high contrast, keyboard focus), a glyph check of the band's characters in the legacy console and in Windows Terminal (a script prints them; it is not a Claude Code session), and an accessibility scan. The scripts in windows/ci/ that change system settings refuse to run outside GitHub Actions. In a fork: gh workflow run capturas.yml, then download the artifacts with gh run download.
Changes are listed in CHANGELOG.md.
<a href="https://star-history.com/#jonathanlocks/usage-band-mod&Date"> <img alt="Star history chart for jonathanlocks/usage-band-mod" src="https://api.star-history.com/svg?repos=jonathanlocks/usage-band-mod&type=Date"> </a>
The code is MIT. The mascot drawings are fan art of Clawd, the Claude Code mascot, and are not covered by the MIT License.
This is an independent project, not made, endorsed or supported by Anthropic. Claude, Claude Code and Clawd are trademarks of Anthropic.
hooks/register.tsx 447 lines1// usage-band-mod: banda de uma linha acima do prompt com modelo, custo e barras de contexto,
2// sessão de 5 horas, semana e limite por modelo; no Mac e no Windows, uma janela de ajustes.
3// Tudo o que chama $ mora neste arquivo: motores mais antigos do Claude Code (o 2.1.295 que vem no
4// app desktop) recusam o módulo inteiro quando $ é passado a uma função importada de outro arquivo.
5// ./fontes, ./janela e ./prefs trazem só a parte pura; os desenhos vêm de ./ui.
6import { atom, read, update } from 'claude-code'
7import type { EngineInterface, Register } from 'claude-code'
8
9import type { Cambio, Leitura, LeituraModelos, Moeda, Preferencias } from '../types'
10import {
11 CAMBIO_URL,
12 CHAVE_CAMBIO,
13 CHAVE_MODELOS,
14 INTERVALO_MODELOS,
15 TRAVA,
16 USO_URL,
17 VALIDADE_CAMBIO,
18 cambioValido,
19 lerCambio,
20 lerModelos,
21 modelosValidos,
22 montarLeitura,
23 proximaTentativa,
24 silencio,
25} from './fontes'
26import type { Uso } from './fontes'
27import { CAMPOS, CHAVE_AJUSTE, PRAZO_PRONTO, amostra, caminhoDoApp, lerLinha, pendenteValido, situacao, temDotNet48 } from './janela'
28import type { Abertura, Pendente, Plataforma } from './janela'
29import { deOpcoes, iguais } from './prefs'
30import { textos } from './textos'
31import { banda } from './ui'
32import type { Contexto } from './ui'
33
34const leitura = atom({ plugin: 'usage-band-mod', key: 'leitura' } as const, null)
35const modelos = atom({ plugin: 'usage-band-mod', key: 'modelos' } as const, null)
36const cambio = atom({ plugin: 'usage-band-mod', key: 'cambio' } as const, null)
37const ajuste = atom({ plugin: 'usage-band-mod', key: 'ajuste' } as const, null)
38const oculta = atom({ plugin: 'usage-band-mod', key: 'oculta' } as const, false)
39const relogio = atom({ plugin: 'usage-band-mod', key: 'relogio' } as const, 0)
40const sistema = atom({ plugin: 'usage-band-mod', key: 'sistema' } as const, null)
41const CHAVE_OCULTA = 'oculta'
42
43async function silencioDeRede($: EngineInterface): Promise<boolean> {
44 return silencio(await $.env.get('CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC'))
45}
46
47// ---------- uso da sessão ----------
48
49// Grava só quando algo mudou: cada gravação redesenha a banda.
50async function guardarLeitura($: EngineInterface, nova: Leitura): Promise<void> {
51 const atual = await read($, leitura)
52 if (atual !== null && JSON.stringify(atual) === JSON.stringify(nova)) return
53 await update($, leitura, () => nova)
54}
55
56async function medir($: EngineInterface, uso?: Uso): Promise<void> {
57 try {
58 const u = uso ?? (await $.session.usage())
59 const nova = montarLeitura(u, await $.session.model())
60 await guardarLeitura($, nova)
61 } catch {
62 // Sem leitura agora; mantém a última.
63 }
64}
65
66// ---------- limite por modelo ----------
67
68async function buscarModelos($: EngineInterface, agora: number): Promise<LeituraModelos> {
69 const falha = (estado: LeituraModelos['estado'], detalhe: string): LeituraModelos => ({ em: agora, lidoEm: null, estado, detalhe, limites: [] })
70 try {
71 const cred = await $.session.authorize()
72 if (cred === null || cred.kind !== 'bearer') return falha('sem-credencial', '')
73 const r = await $.http.fetch(USO_URL, { auth: cred.handle, headers: { 'anthropic-beta': 'oauth-2025-04-20' } })
74 if (!r.ok) return falha('recusado', String(r.status))
75 return { em: agora, lidoEm: agora, estado: 'ok', detalhe: '', limites: lerModelos(r.text) }
76 } catch (erro) {
77 return falha('erro', erro instanceof Error ? erro.message.slice(0, 120) : '')
78 }
79}
80
81let buscandoDesde = 0
82
83// No máximo uma leitura por INTERVALO_MODELOS, contando todas as sessões abertas (a leitura fica no $.store).
84async function medirModelos($: EngineInterface): Promise<void> {
85 const agora = await $.clock.now()
86 if (agora - buscandoDesde < TRAVA) return
87 buscandoDesde = agora
88 try {
89 const recente = (m: LeituraModelos | null): boolean => m !== null && agora - m.em < INTERVALO_MODELOS
90 const naMemoria = await read($, modelos)
91 if (recente(naMemoria) && naMemoria?.estado === 'ok') return
92 // Depois de uma falha desta sessão, o store ainda pode trazer a leitura que outra sessão acabou de fazer.
93 const guardada = modelosValidos(await $.store.get(CHAVE_MODELOS))
94 if (guardada !== null && recente(guardada)) {
95 if (JSON.stringify(guardada) !== JSON.stringify(naMemoria)) await update($, modelos, () => guardada)
96 return
97 }
98 // A falha recente desta sessão segura a próxima tentativa, mesmo sem nada no store.
99 if (recente(naMemoria)) return
100 if (await silencioDeRede($)) return
101 const nova = await buscarModelos($, agora)
102 // Uma falha guarda o motivo, mas não apaga os últimos números lidos.
103 const final = nova.estado === 'ok' || guardada === null ? nova : { ...nova, lidoEm: guardada.lidoEm, limites: guardada.limites }
104 await $.store.set(CHAVE_MODELOS, final)
105 await update($, modelos, () => final)
106 } catch {
107 // Sem leitura agora; mantém a última.
108 } finally {
109 buscandoDesde = 0
110 }
111}
112
113// ---------- câmbio ----------
114
115let cotandoDesde = 0
116
117async function medirCambio($: EngineInterface, moeda: Moeda): Promise<void> {
118 if (moeda === 'USD') return
119 const agora = await $.clock.now()
120 if (agora - cotandoDesde < TRAVA) return
121 cotandoDesde = agora
122 try {
123 const naMemoria = await read($, cambio)
124 if (naMemoria !== null && agora < proximaTentativa(naMemoria)) return
125 const guardado = cambioValido(await $.store.get(CHAVE_CAMBIO))
126 if (guardado !== null && agora < proximaTentativa(guardado)) {
127 await update($, cambio, () => guardado)
128 return
129 }
130 if (await silencioDeRede($)) return
131 let taxas: Partial<Record<Moeda, number>> = {}
132 try {
133 const r = await $.http.fetch(CAMBIO_URL)
134 taxas = r.ok ? lerCambio(r.text) : {}
135 } catch {
136 taxas = {}
137 }
138 const deuCerto = Object.keys(taxas).length > 0
139 // A falha também é gravada, com a hora da tentativa: é ela que segura a próxima.
140 const final: Cambio = deuCerto
141 ? { em: agora, lidoEm: agora, falhas: 0, taxas }
142 : { em: agora, lidoEm: guardado?.lidoEm ?? null, falhas: (guardado?.falhas ?? 0) + 1, taxas: guardado?.taxas ?? {} }
143 await $.store.set(CHAVE_CAMBIO, final)
144 await update($, cambio, () => final)
145 } catch {
146 // Sem câmbio agora; mantém o último.
147 } finally {
148 cotandoDesde = 0
149 }
150}
151
152// ---------- preferências e janela de ajustes ----------
153
154// Preferências em vigor: o ajuste da janela, se houver, senão o userConfig.
155async function emVigor($: EngineInterface, opcoes: Preferencias): Promise<Preferencias> {
156 return (await read($, ajuste)) ?? opcoes
157}
158
159async function aplicar($: EngineInterface, p: Pendente, opcoes: Preferencias): Promise<void> {
160 for (const campo of CAMPOS) {
161 if (p.prefs[campo] === opcoes[campo]) continue
162 let recusado = false
163 try {
164 const r = await $.config.set({ key: `usage-band-mod.${campo}`, value: p.prefs[campo] })
165 recusado = r.deny !== undefined
166 } catch {
167 recusado = true
168 }
169 if (recusado) {
170 await $.store.set(CHAVE_AJUSTE, { ...p, recusado: true })
171 return
172 }
173 }
174 // Chegou aqui sem recarga: tudo gravado. O pedido fica marcado para a próxima carga só limpar.
175 await $.store.set(CHAVE_AJUSTE, { ...p, aplicado: true })
176}
177
178// Ao carregar: conclui, retoma ou descarta o pedido guardado.
179async function conciliar($: EngineInterface, opcoes: Preferencias): Promise<void> {
180 const p = pendenteValido(await $.store.get(CHAVE_AJUSTE))
181 if (p === null) {
182 const atual = await read($, ajuste)
183 if (atual !== null && iguais(atual, opcoes)) await update($, ajuste, () => null)
184 return
185 }
186 const s = situacao(p, opcoes)
187 if (s !== 'continuar') {
188 await $.store.delete(CHAVE_AJUSTE)
189 await update($, ajuste, () => null)
190 return
191 }
192 await update($, ajuste, () => p.prefs)
193 if (!p.recusado) await aplicar($, p, opcoes)
194}
195
196async function gravar($: EngineInterface, prefs: Preferencias, opcoes: Preferencias): Promise<void> {
197 if (iguais(prefs, opcoes)) {
198 // Voltou tudo ao que o /config já tem (por exemplo, desfez uma mudança recusada): nada pendente.
199 await $.store.delete(CHAVE_AJUSTE)
200 await update($, ajuste, () => null)
201 return
202 }
203 const p: Pendente = { prefs, base: opcoes, recusado: false, aplicado: false }
204 await $.store.set(CHAVE_AJUSTE, p)
205 await aplicar($, p, opcoes)
206}
207
208// A janela precisa do macOS 26, ou do Windows com .NET Framework 4.8. Descoberto uma vez por sessão e
209// guardado no átomo `sistema`: a banda o lê, e o ⚙ aparece assim que a resposta chega. A API não diz
210// o sistema; a variável OS é fixa no Windows.
211type Sistema = { plataforma: Plataforma; disponivel: boolean }
212
213async function sistemaDaJanela($: EngineInterface): Promise<Sistema> {
214 const salvo = await read($, sistema)
215 if (salvo !== null) return salvo
216 let s: Sistema = { plataforma: 'macos', disponivel: false }
217 try {
218 if ((await $.env.get('OS')) === 'Windows_NT') {
219 s = { plataforma: 'windows', disponivel: false }
220 const r = await $.process.run(
221 ['reg.exe', 'query', 'HKLM\\SOFTWARE\\Microsoft\\NET Framework Setup\\NDP\\v4\\Full', '/v', 'Release'],
222 { timeoutMs: 5_000 },
223 )
224 s.disponivel = r.exitCode === 0 && temDotNet48(r.stdout)
225 } else {
226 const r = await $.process.run(['/usr/bin/sw_vers', '-productVersion'], { timeoutMs: 5_000 })
227 s.disponivel = r.exitCode === 0 && Number(r.stdout.trim().split('.')[0]) >= 26
228 }
229 } catch {
230 // Sem resposta do sistema: a janela não é oferecida.
231 }
232 await update($, sistema, () => s)
233 return s
234}
235
236// No início da sessão, sem segurá-la: descobre a janela em segundo plano.
237async function descobrirJanela($: EngineInterface): Promise<void> {
238 try {
239 await sistemaDaJanela($)
240 } catch {
241 // A sessão acabou (ou o mod recarregou) antes da resposta: não há banda para redesenhar.
242 }
243}
244
245let aberta = false
246
247// Abre a janela e fica escutando até o app sair. Só diz "aberta" depois do {"pronto":true} do app.
248async function abrirJanela($: EngineInterface, opcoes: Preferencias): Promise<{ resultado: Abertura; detalhe: string }> {
249 if (aberta) return { resultado: 'ja-aberta', detalhe: '' }
250 // A trava liga antes de qualquer espera: um clique duplo no ⚙ não abre duas janelas.
251 aberta = true
252 try {
253 return await abrir($, opcoes)
254 } catch (erro) {
255 aberta = false
256 return { resultado: 'falhou', detalhe: erro instanceof Error ? erro.message.slice(0, 120) : '' }
257 }
258}
259
260async function abrir($: EngineInterface, opcoes: Preferencias): Promise<{ resultado: Abertura; detalhe: string }> {
261 const s = await sistemaDaJanela($)
262 if (!s.disponivel) {
263 aberta = false
264 return { resultado: 'falhou', detalhe: '' }
265 }
266 const prefs = await emVigor($, opcoes)
267 const estado = { prefs, amostra: amostra(await read($, leitura), await read($, modelos), await read($, cambio)) }
268 const argv = [caminhoDoApp($.plugin.root, s.plataforma), '--estado', JSON.stringify(estado)]
269 const iterador = $.process.spawn({ argv })
270
271 let resto = ''
272 let erros = ''
273 let ultima: Preferencias = prefs
274 // Depois de desistir de um app que não respondeu, nada do que ele mandar vale mais.
275 let desistiu = false
276 // Trata um pedaço da saída; devolve true quando chega o "pronto".
277 const tratar = async (pedaco: { stream: string; text: string }): Promise<boolean> => {
278 if (desistiu) return false
279 if (pedaco.stream !== 'stdout') {
280 erros = (erros + pedaco.text).slice(-200)
281 return false
282 }
283 resto += pedaco.text
284 const linhas = resto.split('\n')
285 resto = linhas.pop() ?? ''
286 let pronto = false
287 for (const linha of linhas) {
288 const lida = lerLinha(linha, ultima)
289 if (lida.pronto === true) pronto = true
290 if (lida.prefs !== undefined) {
291 ultima = lida.prefs
292 await update($, ajuste, () => lida.prefs ?? null)
293 }
294 }
295 return pronto
296 }
297
298 const esperarPronto = async (): Promise<'pronto' | string> => {
299 for (;;) {
300 const r = await iterador.next()
301 if (r.done === true) return (erros.trim().split('\n').pop() ?? '') || 'o app fechou antes de abrir a janela'
302 if (await tratar(r.value)) return 'pronto'
303 }
304 }
305 let resposta: string
306 try {
307 resposta = await Promise.race([esperarPronto(), $.clock.sleep(PRAZO_PRONTO).then(() => 'o app não respondeu')])
308 } catch (erro) {
309 resposta = erro instanceof Error ? erro.message.slice(0, 120) : ''
310 }
311 if (resposta !== 'pronto') {
312 desistiu = true
313 // Encerrar o laço encerra o app, se ele ainda estiver de pé. Sem esperar: ele pode estar travado.
314 void iterador.return({ code: null, signal: null })
315 aberta = false
316 return { resultado: 'falhou', detalhe: resposta }
317 }
318
319 void (async () => {
320 try {
321 for (let r = await iterador.next(); r.done !== true; r = await iterador.next()) await tratar(r.value)
322 } catch {
323 // O app caiu: o que ele já mandou continua valendo.
324 } finally {
325 aberta = false
326 try {
327 await gravar($, ultima, opcoes)
328 } catch {
329 // Não deu para gravar agora: o ajuste da janela continua valendo nesta sessão.
330 }
331 }
332 })()
333 return { resultado: 'aberta', detalhe: '' }
334}
335
336// ---------- banda e comandos ----------
337
338async function contexto($: EngineInterface, opcoes: Preferencias): Promise<Contexto | null> {
339 const l = await read($, leitura)
340 if (l === null) return null
341 const prefs = await emVigor($, opcoes)
342 const c = await read($, cambio)
343 const agora = await $.clock.now()
344 const recente = c !== null && c.lidoEm !== null && agora - c.lidoEm < VALIDADE_CAMBIO
345 const taxa = prefs.moeda === 'USD' || !recente ? null : (c.taxas[prefs.moeda] ?? null)
346 return { l, prefs, modelos: await read($, modelos), taxa, agora }
347}
348
349async function buscar($: EngineInterface, opcoes: Preferencias): Promise<void> {
350 const prefs = await emVigor($, opcoes)
351 if (prefs.limitePorModelo) void medirModelos($)
352 void medirCambio($, prefs.moeda)
353}
354
355async function ocultar($: EngineInterface, valor: boolean): Promise<void> {
356 await update($, oculta, () => valor)
357 await $.store.set(CHAVE_OCULTA, valor)
358}
359
360// O que dizer quando a janela não abriu. No Windows, um app que não sobe costuma ser o exe barrado
361// (sem assinatura digital): a mensagem diz isso e aponta o /config.
362async function falha($: EngineInterface, opcoes: Preferencias, detalhe: string): Promise<string> {
363 const t = textos((await emVigor($, opcoes)).idioma)
364 if (detalhe === '') return t.janelaIndisponivel
365 return (await sistemaDaJanela($)).plataforma === 'windows' ? t.janelaBloqueada(detalhe) : t.janelaFalhou(detalhe)
366}
367
368async function ajustes($: EngineInterface, opcoes: Preferencias): Promise<{ text: string }> {
369 const r = await abrirJanela($, opcoes)
370 if (r.resultado === 'falhou') return { text: await falha($, opcoes, r.detalhe) }
371 return { text: textos((await emVigor($, opcoes)).idioma).janelaAberta }
372}
373
374// O ⚙ da banda não tem onde responder como um comando: se a janela não abrir, o motivo vai num aviso.
375async function ajustesPeloBotao($: EngineInterface, opcoes: Preferencias): Promise<void> {
376 const r = await abrirJanela($, opcoes)
377 if (r.resultado === 'falhou') $.ui.toast(await falha($, opcoes, r.detalhe), { timeoutMs: 12_000 })
378}
379
380async function alternarBanda($: EngineInterface, opcoes: Preferencias): Promise<{ text: string }> {
381 const t = textos((await emVigor($, opcoes)).idioma)
382 const escondida = !(await read($, oculta))
383 await ocultar($, escondida)
384 return { text: escondida ? t.bandaOculta : t.bandaVisivel }
385}
386
387async function iniciar($: EngineInterface, opcoes: Preferencias): Promise<void> {
388 await conciliar($, opcoes)
389 const prefs = await emVigor($, opcoes)
390 const t = textos(prefs.idioma)
391 // Nomes escritos por extenso: o validador reconhece assim que cada comando é deste mod.
392 if (prefs.idioma === 'pt') {
393 await $.command.register({ name: 'uso-barra', description: t.cmdBanda })
394 await $.command.register({ name: 'uso-ajustes', description: t.cmdAjustes })
395 } else {
396 await $.command.register({ name: 'usage-band', description: t.cmdBanda })
397 await $.command.register({ name: 'usage-settings', description: t.cmdAjustes })
398 }
399 if ((await $.store.get(CHAVE_OCULTA)) === true) await update($, oculta, () => true)
400 await medir($)
401 await buscar($, opcoes)
402 void descobrirJanela($)
403}
404
405// A cada minuto: os relógios de "reinicia em" andam, e as fontes conferem se já é hora de ler.
406async function aCadaMinuto($: EngineInterface, opcoes: Preferencias): Promise<void> {
407 await update($, relogio, n => (n ?? 0) + 1)
408 await medir($)
409 await buscar($, opcoes)
410}
411
412export const register: Register = (on, options) => {
413 const opcoes = deOpcoes(options)
414
415 on('session.start', async ($, e, next) => {
416 const ran = await next(e)
417 await iniciar($, opcoes)
418 $.clock.every(60_000, () => aCadaMinuto($, opcoes))
419 return ran
420 })
421
422 // O evento já traz os números: nada de pedir de novo.
423 on('session.measure', async ($, e, next) => {
424 const ran = await next(e)
425 await medir($, e)
426 return ran
427 })
428
429 on('command.run', { command: 'uso-barra' }, async $ => alternarBanda($, opcoes))
430 on('command.run', { command: 'usage-band' }, async $ => alternarBanda($, opcoes))
431 on('command.run', { command: 'uso-ajustes' }, async $ => ajustes($, opcoes))
432 on('command.run', { command: 'usage-settings' }, async $ => ajustes($, opcoes))
433
434 on('ui.render', { component: 'AbovePrompt' }, async ($, e, next) => {
435 const c = await contexto($, opcoes)
436 if (e.props.hasSurvey || c === null || (await read($, oculta))) return next(e)
437 await read($, relogio)
438 const s = await read($, sistema)
439 const ui = $.ui.resolve(e)
440 const outros = await next(e)
441 return banda(ui, e.surface, e.props.bodyColumns, c, {
442 ocultar: () => ocultar($, true),
443 ajustes: e.surface === 'desktop' && s?.disponivel === true ? () => ajustesPeloBotao($, opcoes) : undefined,
444 }, outros)
445 })
446}
447hooks/fontes.ts 119 lines1// De onde vêm os números.
2// - Uso da sessão: $.session.usage() e o evento session.measure (os mesmos da status line, grátis).
3// - Limite semanal por modelo (ex.: Fable): endpoint interno da Anthropic, sem documentação pública.
4// Só é lido com a opção ligada; o host anexa o login e o mod nunca vê o token.
5// - Câmbio: taxas públicas da Coinbase a partir do dólar, só quando a moeda não é USD.
6// Nenhuma consulta sai com CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC ligada.
7// Aqui só a parte pura (endereços, prazos e leitura dos corpos); o que chama $ fica em ./register:
8// motores mais antigos do Claude Code (o 2.1.295 do app desktop) não aceitam $ passado entre arquivos.
9import type { SessionUsage } from 'claude-code'
10
11import type { Cambio, Leitura, LeituraModelos, LimiteModelo, Moeda } from '../types'
12import { nomeBonito } from './formato'
13
14export const USO_URL = 'https://api.anthropic.com/api/oauth/usage'
15export const CAMBIO_URL = 'https://api.coinbase.com/v2/exchange-rates?currency=USD'
16export const CHAVE_MODELOS = 'modelos'
17export const CHAVE_CAMBIO = 'cambio'
18export const INTERVALO_MODELOS = 600_000
19export const VALIDADE_MODELOS = 3_600_000
20export const INTERVALO_CAMBIO = 21_600_000
21// Uma cotação mais velha que isso não é usada: o custo volta a aparecer em dólar.
22export const VALIDADE_CAMBIO = 259_200_000
23// Espera depois de falhas seguidas: 5 min, 30 min, 2 h e daí em diante.
24export const ESPERAS = [300_000, 1_800_000, 7_200_000]
25// Uma consulta presa há mais que isso não segura a próxima.
26export const TRAVA = 60_000
27
28const objeto = (v: unknown): Record<string, unknown> | null =>
29 typeof v === 'object' && v !== null ? (v as Record<string, unknown>) : null
30
31// Valor de CLAUDE_CODE_DISABLE_NONESSENTIAL_TRAFFIC: ligada, nenhuma consulta sai.
32export function silencio(v: string | undefined): boolean {
33 return v !== undefined && v !== '' && v !== '0' && v.toLowerCase() !== 'false'
34}
35
36// ---------- uso da sessão ----------
37
38export type Uso = Pick<SessionUsage, 'context' | 'rateLimits' | 'cost'>
39
40export function montarLeitura(uso: Uso, modelo: string): Leitura {
41 return {
42 modelo: nomeBonito(modelo),
43 pct: uso.context.percent ?? null,
44 tokens: uso.context.tokens ?? null,
45 janela: uso.context.window,
46 usd: uso.cost?.usd ?? null,
47 limites: uso.rateLimits.map(r => ({ tipo: r.kind, pct: r.percentUsed ?? null, reinicia: r.resetsAt ?? null })),
48 }
49}
50
51// ---------- limite por modelo ----------
52
53// Linhas `weekly_scoped` com modelo, do corpo do endpoint. Lança se o corpo não é JSON.
54export function lerModelos(texto: string): LimiteModelo[] {
55 const linhas = objeto(JSON.parse(texto))?.limits
56 if (!Array.isArray(linhas)) return []
57 const saida: LimiteModelo[] = []
58 for (const bruta of linhas) {
59 const linha = objeto(bruta)
60 const nome = objeto(objeto(linha?.scope)?.model)?.display_name
61 if (linha === null || linha.kind !== 'weekly_scoped' || typeof nome !== 'string') continue
62 const r = linha.resets_at
63 saida.push({
64 modelo: nome,
65 pct: typeof linha.percent === 'number' ? linha.percent : null,
66 reinicia: typeof r === 'number' ? new Date(r * 1000).toISOString() : typeof r === 'string' ? r : null,
67 })
68 }
69 return saida
70}
71
72export function modelosValidos(v: unknown): LeituraModelos | null {
73 const o = objeto(v)
74 if (o === null || typeof o.em !== 'number' || typeof o.estado !== 'string' || typeof o.detalhe !== 'string' || !Array.isArray(o.limites)) return null
75 if (!['ok', 'sem-credencial', 'recusado', 'erro'].includes(o.estado)) return null
76 const limites: LimiteModelo[] = []
77 for (const l of o.limites) {
78 const x = objeto(l)
79 if (x === null || typeof x.modelo !== 'string') continue
80 limites.push({ modelo: x.modelo, pct: typeof x.pct === 'number' ? x.pct : null, reinicia: typeof x.reinicia === 'string' ? x.reinicia : null })
81 }
82 return { em: o.em, lidoEm: typeof o.lidoEm === 'number' ? o.lidoEm : null, estado: o.estado as LeituraModelos['estado'], detalhe: o.detalhe, limites }
83}
84
85// ---------- câmbio ----------
86
87const MOEDAS_CAMBIO: readonly Moeda[] = ['BRL', 'EUR']
88
89// Taxas a partir do dólar no corpo da Coinbase ({ data: { rates: { BRL: "5.41", ... } } }).
90// Lança se o corpo não é JSON; objeto vazio se não acha nenhuma.
91export function lerCambio(texto: string): Partial<Record<Moeda, number>> {
92 const taxas = objeto(objeto(objeto(JSON.parse(texto))?.data)?.rates)
93 const saida: Partial<Record<Moeda, number>> = {}
94 if (taxas === null) return saida
95 for (const m of MOEDAS_CAMBIO) {
96 const v = Number(taxas[m])
97 if (Number.isFinite(v) && v > 0) saida[m] = v
98 }
99 return saida
100}
101
102export function cambioValido(v: unknown): Cambio | null {
103 const o = objeto(v)
104 if (o === null || typeof o.em !== 'number' || typeof o.falhas !== 'number') return null
105 const taxas: Partial<Record<Moeda, number>> = {}
106 const t = objeto(o.taxas)
107 for (const m of MOEDAS_CAMBIO) {
108 const x = t?.[m]
109 if (typeof x === 'number' && x > 0) taxas[m] = x
110 }
111 return { em: o.em, lidoEm: typeof o.lidoEm === 'number' ? o.lidoEm : null, falhas: Math.max(0, Math.floor(o.falhas)), taxas }
112}
113
114// Quando pode tentar de novo: 6 h depois de um sucesso; depois de falhas, a espera cresce.
115export function proximaTentativa(c: Cambio): number {
116 if (c.falhas === 0) return c.em + INTERVALO_CAMBIO
117 return c.em + (ESPERAS[Math.min(c.falhas, ESPERAS.length) - 1] ?? INTERVALO_CAMBIO)
118}
119hooks/janela.ts 88 lines1// Janela de ajustes: no Mac um app SwiftUI (macos/), no Windows um app WPF (windows/), que o mod
2// abre e escuta. Os dois falam o mesmo protocolo.
3// Conversa por linhas JSON: o app escreve {"pronto": true} ao aparecer, {"prefs": {...}} a cada
4// mudança e {"fim": true} ao fechar (o mod se guia pelo fim do processo, não por essa linha). As
5// mudanças valem na hora (átomo `ajuste`); quando o app sai, vão para o userConfig por $.config.set, para que o menu /config e as próximas sessões vejam o mesmo.
6// Aqui só a parte pura; abrir, escutar e gravar ficam em ./register, porque motores mais antigos do
7// Claude Code (o 2.1.295 do app desktop) não aceitam $ passado entre arquivos.
8import type { Cambio, Leitura, LeituraModelos, Preferencias } from '../types'
9import { iguais, preferencias } from './prefs'
10
11export const CHAVE_AJUSTE = 'ajuste'
12export const CAMPOS = ['idioma', 'moeda', 'mascote', 'limitePorModelo'] as const
13
14// Onde a janela mora em cada sistema.
15export type Plataforma = 'macos' | 'windows'
16
17// No Windows a raiz pode vir com `\` ou `/`: o caminho do exe usa o mesmo separador que ela.
18export function caminhoDoApp(raiz: string, p: Plataforma = 'macos'): string {
19 const pasta = raiz.replace(/[\\/]\.claude-plugin[\\/]?$/, '').replace(/[\\/]$/, '')
20 if (p === 'windows') {
21 const sep = pasta.includes('\\') ? '\\' : '/'
22 return [pasta, 'windows', 'PainelDeUso.exe'].join(sep)
23 }
24 return `${pasta}/macos/PainelDeUso.app/Contents/MacOS/PainelDeUso`
25}
26
27// Saída de `reg.exe query ...\NDP\v4\Full /v Release`: tem .NET Framework 4.8 (528040) ou mais novo?
28export function temDotNet48(saidaDoReg: string): boolean {
29 const m = /\bRelease\s+REG_DWORD\s+0x([0-9a-f]+)/i.exec(saidaDoReg)
30 return m !== null && parseInt(m[1] ?? '', 16) >= 528040
31}
32
33// Uma linha do app: só aceita preferências válidas; o resto é ignorado.
34export function lerLinha(linha: string, base: Preferencias): { prefs?: Preferencias; pronto?: true } {
35 try {
36 // trim: no Windows a linha pode chegar com um \r sobrando.
37 const o = JSON.parse(linha.trim()) as Record<string, unknown>
38 if (o.pronto === true) return { pronto: true }
39 if (typeof o.prefs === 'object' && o.prefs !== null) return { prefs: preferencias(o.prefs, base) }
40 } catch {
41 // Linha que não é JSON (log do app): ignora.
42 }
43 return {}
44}
45
46// Gravação no userConfig. Cada $.config.set pode recarregar o mod no meio do caminho, então o
47// pedido inteiro fica antes no $.store ({ prefs, base }) e cada carga aplica o que falta.
48// `aplicado`: tudo já foi gravado sem recarga; daí em diante, uma mudança no /config vence.
49export type Pendente = { prefs: Preferencias; base: Preferencias; recusado: boolean; aplicado: boolean }
50
51export function pendenteValido(v: unknown): Pendente | null {
52 if (typeof v !== 'object' || v === null) return null
53 const g = v as { prefs?: unknown; base?: unknown; recusado?: unknown; aplicado?: unknown }
54 if (typeof g.prefs !== 'object' || typeof g.base !== 'object') return null
55 return { prefs: preferencias(g.prefs), base: preferencias(g.base), recusado: g.recusado === true, aplicado: g.aplicado === true }
56}
57
58// O que fazer com um pedido pendente diante do userConfig atual:
59// - 'pronto': tudo já está gravado;
60// - 'descartar': alguém mexeu no /config por fora, e o menu vence;
61// - 'continuar': ainda há campos a gravar (ou o /config recusou, e o ajuste fica valendo).
62export function situacao(p: Pendente, opcoes: Preferencias): 'pronto' | 'descartar' | 'continuar' {
63 if (iguais(p.prefs, opcoes)) return 'pronto'
64 for (const campo of CAMPOS) {
65 if (opcoes[campo] !== p.base[campo] && opcoes[campo] !== p.prefs[campo]) return 'descartar'
66 }
67 // Já gravado e o /config voltou um campo ao valor antigo: foi a pessoa, e o menu vence.
68 return p.aplicado ? 'descartar' : 'continuar'
69}
70
71// Quanto esperar o app dizer {"pronto":true} antes de desistir.
72export const PRAZO_PRONTO = 15_000
73
74export type Abertura = 'aberta' | 'ja-aberta' | 'falhou'
75
76// O que a janela mostra na prévia: os números da sessão, ou exemplos enquanto não há leitura.
77export function amostra(l: Leitura | null, m: LeituraModelos | null, c: Cambio | null) {
78 return {
79 modelo: l?.modelo ?? 'Opus 5.5',
80 usd: l?.usd ?? 3.26,
81 contexto: l?.pct ?? 24,
82 cincoHoras: l?.limites.find(x => x.tipo === 'five_hour')?.pct ?? 5,
83 semana: l?.limites.find(x => x.tipo === 'seven_day')?.pct ?? 1,
84 porModelo: (m?.limites ?? []).map(x => ({ modelo: x.modelo, pct: x.pct ?? 0 })),
85 taxas: c?.taxas ?? {},
86 }
87}
88hooks/prefs.ts 32 lines1// Preferências do mod. A fonte é o `userConfig` do plugin.json (o menu de configurações do
2// Claude Code e a tela de instalação). A janela de ajustes (Mac e Windows) grava por cima, ao vivo,
3// e no fim passa tudo para o `userConfig` por `$.config.set`.
4import type { PluginOptions } from 'claude-code'
5
6import type { Idioma, Mascote, Moeda, Preferencias } from '../types'
7
8const IDIOMAS: readonly Idioma[] = ['en', 'pt']
9const MOEDAS: readonly Moeda[] = ['USD', 'BRL', 'EUR']
10const MASCOTES: readonly Mascote[] = ['animado', 'parado', 'oculto']
11
12export const PADRAO: Preferencias = { idioma: 'en', moeda: 'USD', mascote: 'animado', limitePorModelo: true }
13
14const entre = <T extends string>(lista: readonly T[], v: unknown, padrao: T): T =>
15 typeof v === 'string' && (lista as readonly string[]).includes(v) ? (v as T) : padrao
16
17// Lê qualquer objeto (options do engine, $.store, linha da janela) e devolve preferências válidas.
18export function preferencias(v: unknown, base: Preferencias = PADRAO): Preferencias {
19 const o = typeof v === 'object' && v !== null ? (v as Record<string, unknown>) : {}
20 return {
21 idioma: entre(IDIOMAS, o.idioma, base.idioma),
22 moeda: entre(MOEDAS, o.moeda, base.moeda),
23 mascote: entre(MASCOTES, o.mascote, base.mascote),
24 limitePorModelo: typeof o.limitePorModelo === 'boolean' ? o.limitePorModelo : base.limitePorModelo,
25 }
26}
27
28export const deOpcoes = (options: PluginOptions | undefined): Preferencias => preferencias(options ?? {})
29
30export const iguais = (a: Preferencias, b: Preferencias): boolean =>
31 a.idioma === b.idioma && a.moeda === b.moeda && a.mascote === b.mascote && a.limitePorModelo === b.limitePorModelo
32hooks/textos.ts 35 lines1// Todos os textos que o mod mostra, em inglês e português.
2import type { Idioma } from '../types'
3
4const EN = {
5 contexto: 'Context',
6 bandaOculta: 'Usage band hidden.',
7 bandaVisivel: 'Usage band visible.',
8 janelaAberta: 'Settings window open.',
9 janelaIndisponivel: 'The settings window needs macOS 26 or Windows 10/11 (1903 or later, with .NET Framework 4.8). Use /config instead: the options are under usage-band-mod.',
10 janelaFalhou: (d: string) => `Could not open the settings window (${d}). Use /config instead.`,
11 // No Windows o exe não tem assinatura digital: o Smart App Control ou um antivírus podem barrá-lo.
12 janelaBloqueada: (d: string) =>
13 `Could not open the settings window (${d}). On Windows, Smart App Control or an antivirus may have blocked PainelDeUso.exe, which is not code-signed. Use /config instead: the options are under usage-band-mod.`,
14 cmdBanda: 'Shows or hides the usage band above the prompt',
15 cmdAjustes: 'Opens the settings window (macOS, Windows)',
16 alt: 'Pixel crab mascot',
17}
18
19const PT: typeof EN = {
20 contexto: 'Contexto',
21 bandaOculta: 'Barra de uso escondida.',
22 bandaVisivel: 'Barra de uso visível.',
23 janelaAberta: 'Janela de ajustes aberta.',
24 janelaIndisponivel: 'A janela de ajustes precisa do macOS 26 ou do Windows 10/11 (1903 ou mais novo, com .NET Framework 4.8). Use o /config: as opções estão em usage-band-mod.',
25 janelaFalhou: (d: string) => `Não deu para abrir a janela de ajustes (${d}). Use o /config.`,
26 janelaBloqueada: (d: string) =>
27 `Não deu para abrir a janela de ajustes (${d}). No Windows, o Controle Inteligente de Aplicativos ou um antivírus pode ter bloqueado o PainelDeUso.exe, que não tem assinatura digital. Use o /config: as opções estão em usage-band-mod.`,
28 cmdBanda: 'Mostra ou esconde a barra de uso acima do prompt',
29 cmdAjustes: 'Abre a janela de ajustes (macOS, Windows)',
30 alt: 'Mascote caranguejo em pixel',
31}
32
33type Textos = typeof EN
34export const textos = (idioma: Idioma): Textos => (idioma === 'pt' ? PT : EN)
35hooks/ui.tsx 190 lines1// O desenho da banda de uma linha acima do prompt, no terminal e no app desktop.
2import type { EngineInterface, RenderElement } from 'claude-code'
3
4import type { Leitura, LeituraModelos, Limite, Preferencias } from '../types'
5import { PCT_COLUNAS, SEP_BARRAS, SEP_COMPACTO, barra, corDe, curto, dinheiro, encaixe, faltam, pctTexto } from './formato'
6import type { Trecho } from './formato'
7import { MASCOTE_ALTURA, MASCOTE_ANIMADO, MASCOTE_LARGURA, MASCOTE_PARADO } from './mascote'
8import { textos } from './textos'
9import { VALIDADE_MODELOS } from './fontes'
10
11// Trilho das barras no desktop: cinza translúcido, escuro no tema escuro e claro no claro,
12// para o preenchimento verde se destacar (o tom "subtle" ficava quase do brilho do verde).
13const TRILHO = '#80808059'
14const OLHO = '#000000'
15
16// No terminal, o Clawd numa linha: braço, corpo laranja com dois olhos pretos e altos, braço.
17// O corpo é fundo pintado (sem as emendas que o Terminal.app deixa entre blocos vizinhos) e os
18// olhos são pretos nos dois temas, como no Clawd do próprio Claude Code. Os braços são traços na
19// meia altura (╺ ╸), para fora do corpo; nos quadrantes de baixo (▗ ▖) o conjunto lia como focinho.
20// A primeira linha do logo dele (▐▛███▜▌), que a banda usava antes, lia como um bloco cortado.
21const MASCOTE_PARTES = [
22 { t: '╺', cor: 'claude' },
23 { t: '▮', cor: OLHO, fundo: 'claude' },
24 { t: ' ', fundo: 'claude' },
25 { t: '▮', cor: OLHO, fundo: 'claude' },
26 { t: '╸', cor: 'claude' },
27] as const
28
29// Sem leitura, no lugar da barra vai uma linha pontilhada apagada: "sem dado" não pode parecer
30// "0% usado" (um trilho cinza cheio). O · existe em toda fonte, inclusive no console antigo do Windows.
31const SEM_LEITURA = '·'
32export const MASCOTE_TEXTO = MASCOTE_PARTES.map(p => p.t).join('')
33
34const limite = (l: Limite[], tipo: string): Limite | null => l.find(x => x.tipo === tipo) ?? null
35
36export type Contexto = {
37 l: Leitura
38 prefs: Preferencias
39 modelos: LeituraModelos | null
40 taxa: number | null
41 agora: number
42}
43
44// "↻ 2h 10m": o ↻ diz "reinicia em" e só aparece num reinício (o contexto mostra tokens, sem ele).
45const reinicio = (iso: string | null, agora: number): string => {
46 const f = faltam(iso, agora)
47 return f === '' ? '' : `↻ ${f}`
48}
49
50// Os trechos da banda. 5h e 7d só entram quando a sessão tem esses limites (assinatura).
51function trechosDaBanda(c: Contexto): Trecho[] {
52 const t = textos(c.prefs.idioma)
53 const cinco = limite(c.l.limites, 'five_hour')
54 const sete = limite(c.l.limites, 'seven_day')
55 const m = c.modelos
56 const porModelo = c.prefs.limitePorModelo && m !== null && m.lidoEm !== null && c.agora - m.lidoEm < VALIDADE_MODELOS ? m.limites : []
57 return [
58 { rotulo: t.contexto, pct: c.l.pct, extra: c.l.tokens === null ? '' : `${curto(c.l.tokens)}/${curto(c.l.janela)}` },
59 ...(cinco === null ? [] : [{ rotulo: '5h', pct: cinco.pct, extra: reinicio(cinco.reinicia, c.agora) }]),
60 ...(sete === null ? [] : [{ rotulo: '7d', pct: sete.pct, extra: reinicio(sete.reinicia, c.agora) }]),
61 ...porModelo.map(x => ({ rotulo: x.modelo, pct: x.pct, extra: reinicio(x.reinicia, c.agora) })),
62 ]
63}
64
65const custoCurto = (c: Contexto): string =>
66 c.l.usd === null ? '' : ` · ${dinheiro(c.l.usd, c.prefs.moeda, c.taxa, c.prefs.idioma)}`
67
68type Ui = ReturnType<EngineInterface['ui']['resolve']>
69
70function mascoteTexto(ui: Ui): RenderElement {
71 const { Text } = ui
72 return (
73 <Text>
74 {MASCOTE_PARTES.map(p => (
75 <Text color={'cor' in p ? p.cor : undefined} backgroundColor={'fundo' in p ? p.fundo : undefined}>{p.t}</Text>
76 ))}
77 {' '}
78 </Text>
79 )
80}
81
82function mascoteGrafico(ui: Ui, prefs: Preferencias): RenderElement | null {
83 if (prefs.mascote === 'oculto' || !('Svg' in ui)) return null
84 const { Box } = ui
85 const Svg = ui.Svg
86 return (
87 <Box key="mascote" marginRight={1}>
88 <Svg
89 source={prefs.mascote === 'animado' ? MASCOTE_ANIMADO : MASCOTE_PARADO}
90 alt={textos(prefs.idioma).alt}
91 width={MASCOTE_LARGURA}
92 height={MASCOTE_ALTURA}
93 isInteractive={prefs.mascote === 'animado'}
94 />
95 </Box>
96 )
97}
98
99type Acoes = { ocultar: () => unknown; ajustes?: () => unknown }
100
101export function banda(ui: Ui, superficie: string, colunas: number, c: Contexto, acoes: Acoes, outros: RenderElement): RenderElement {
102 const { Box, Text, Button } = ui
103 const trechos = trechosDaBanda(c)
104 const custo = custoCurto(c)
105 const comMascote = c.prefs.mascote !== 'oculto'
106 const { w, resto, comExtra, cabeca, mostrar } = encaixe(colunas, { glifo: comMascote ? MASCOTE_TEXTO.length + 1 : 0, modelo: c.l.modelo.length, custo: custo.length }, trechos)
107 const comModelo = cabeca !== 'nada'
108 const comGlifo = cabeca === 'toda' || cabeca === 'sem-custo'
109 const comCusto = cabeca === 'toda'
110
111 // Fora do terminal a fonte é proporcional: contar caracteres não fecha a largura.
112 // Ali cada barra é um bloco flexível, e as barras dividem por igual o que sobra da linha.
113 // O trilho não tem conteúdo (senão barras com e sem preenchimento saem de larguras diferentes)
114 // e o preenchimento é uma fração exata dele. Meia linha de altura acompanha a altura das letras.
115 if (superficie !== 'terminal') {
116 const medidor = (x: Trecho) => {
117 const p = x.pct === null ? 0 : Math.round(Math.max(0, Math.min(100, x.pct)))
118 return (
119 <Box key={x.rotulo} flexDirection="row" flexGrow={1} alignItems="center" columnGap={1}>
120 <Text dimColor>{x.rotulo}</Text>
121 <Box flexDirection="row" flexGrow={1} height={0.5} backgroundColor={TRILHO} overflow="hidden">
122 {p > 0 && <Box key="cheio" width={`${p}%`} backgroundColor={corDe(x.pct)} />}
123 </Box>
124 <Text color={corDe(x.pct)}>{pctTexto(x.pct)}</Text>
125 {comExtra && x.extra !== '' && <Text dimColor>{x.extra}</Text>}
126 </Box>
127 )
128 }
129 const grafico = mascoteGrafico(ui, c.prefs)
130 return (
131 <Box flexDirection="column">
132 <Box flexDirection="row" alignItems="center" width={colunas} columnGap={2} paddingLeft={1}>
133 <Box flexDirection="row" alignItems="center">
134 {grafico ?? (comMascote && mascoteTexto(ui))}
135 <Text bold>{c.l.modelo}</Text>
136 {custo !== '' && <Text dimColor>{custo}</Text>}
137 </Box>
138 {trechos.map(medidor)}
139 {acoes.ajustes !== undefined && <Button key="ajustes" label="⚙" plain onPress={acoes.ajustes} />}
140 <Button key="ocultar" label="×" plain role="dismiss" onPress={acoes.ocultar} />
141 </Box>
142 {outros}
143 </Box>
144 )
145 }
146
147 const trecho = (x: Trecho, i: number) => {
148 // Sem barras, o trecho fica compacto: rótulo, um espaço e o percentual.
149 if (w === 0) {
150 return (
151 <Box key={x.rotulo} flexDirection="row">
152 <Text dimColor>{`${' '.repeat(SEP_COMPACTO)}${x.rotulo} `}</Text>
153 <Text color={x.pct === null ? undefined : corDe(x.pct)} dimColor={x.pct === null}>{pctTexto(x.pct)}</Text>
154 </Box>
155 )
156 }
157 const largura = w + (i < resto ? 1 : 0)
158 const b = barra(x.pct, largura)
159 const pct = pctTexto(x.pct)
160 // O número encosta na barra dele; o que falta das 4 colunas do percentual vai para o fim do trecho,
161 // depois do detalhe, junto do espaço que separa do próximo rótulo.
162 return (
163 <Box key={x.rotulo} flexDirection="row">
164 <Text dimColor>{`${' '.repeat(SEP_BARRAS)}${x.rotulo} `}</Text>
165 {x.pct === null && <Text dimColor>{SEM_LEITURA.repeat(largura)}</Text>}
166 {b.cheio !== '' && <Text backgroundColor={corDe(x.pct)}>{b.cheio}</Text>}
167 {b.vazio !== '' && <Text backgroundColor="subtle">{b.vazio}</Text>}
168 <Text color={x.pct === null ? undefined : corDe(x.pct)} dimColor={x.pct === null}>{` ${pct}`}</Text>
169 {comExtra && x.extra !== '' && <Text dimColor>{` ${x.extra}`}</Text>}
170 {pct.length < PCT_COLUNAS && <Text>{' '.repeat(PCT_COLUNAS - pct.length)}</Text>}
171 </Box>
172 )
173 }
174 // Alinhada à esquerda com uma coluna de margem, como o resto do Claude Code. O × fica discreto:
175 // cheio só sob o ponteiro ou o foco, ao lado do [-] que o Claude Code desenha.
176 return (
177 <Box flexDirection="column">
178 <Box flexDirection="row" width={colunas} paddingLeft={1}>
179 {comGlifo && comMascote && mascoteTexto(ui)}
180 {comModelo && <Text bold>{c.l.modelo}</Text>}
181 {comCusto && custo !== '' && <Text dimColor>{custo}</Text>}
182 {trechos.slice(0, mostrar).map(trecho)}
183 <Text> </Text>
184 <Button key="ocultar" label="×" plain dimColor role="dismiss" onPress={acoes.ocultar} />
185 </Box>
186 {outros}
187 </Box>
188 )
189}
190hooks/formato.ts 127 lines1// Funções puras: nomes de modelo, números, dinheiro, tempo, cores, barras e o encaixe da banda.
2import type { Idioma, Moeda } from '../types'
3
4// "claude-opus-5-5" → "Opus 5.5". Aceita os formatos do Bedrock (us.anthropic.claude-…-v1:0),
5// do Vertex (claude-…@20250805) e sufixos como [1m].
6export function nomeBonito(id: string): string {
7 let s = id.trim().toLowerCase()
8 const i = s.lastIndexOf('claude-')
9 if (i >= 0) s = s.slice(i + 'claude-'.length)
10 s = s.replace(/\[[^\]]*\]$/, '').replace(/@.*$/, '').replace(/-v\d+(:\d+)?$/, '')
11 const partes = s.split('-').filter(p => p !== '' && !/^\d{8}$/.test(p))
12 const nome = partes.find(p => !/^\d+$/.test(p))
13 if (nome === undefined) return id
14 const versao = partes.filter(p => /^\d+$/.test(p)).slice(0, 2).join('.')
15 const titulo = nome.charAt(0).toUpperCase() + nome.slice(1)
16 return versao === '' ? titulo : `${titulo} ${versao}`
17}
18
19export function curto(n: number): string {
20 if (n >= 1_000_000) return `${(n / 1_000_000).toFixed(1)}M`
21 if (n >= 1_000) return `${Math.round(n / 1_000)}k`
22 return String(n)
23}
24
25// Número com casas e separadores do idioma: 1.234,56 em português, 1,234.56 em inglês.
26export function numero(n: number, casas: number, idioma: Idioma): string {
27 const [inteiro = '0', fracao = ''] = Math.abs(n).toFixed(casas).split('.')
28 const mil = idioma === 'pt' ? '.' : ','
29 const dec = idioma === 'pt' ? ',' : '.'
30 const corpo = inteiro.replace(/\B(?=(\d{3})+$)/g, mil) + (casas > 0 ? dec + fracao : '')
31 return n < 0 ? `-${corpo}` : corpo
32}
33
34const SIMBOLO: Record<Moeda, Record<Idioma, string>> = {
35 USD: { en: '$', pt: 'US$ ' },
36 BRL: { en: 'R$', pt: 'R$ ' },
37 EUR: { en: '€', pt: '€ ' },
38}
39
40// Custo em dólar mostrado na moeda escolhida. Sem taxa para ela, fica em dólar em vez de inventar.
41export function dinheiro(usd: number, moeda: Moeda, taxa: number | null, idioma: Idioma): string {
42 if (moeda === 'USD' || taxa === null) return SIMBOLO.USD[idioma] + numero(usd, 2, idioma)
43 return SIMBOLO[moeda][idioma] + numero(usd * taxa, 2, idioma)
44}
45
46export function faltam(iso: string | null, agora: number): string {
47 if (iso === null) return ''
48 const ms = Date.parse(iso) - agora
49 if (!Number.isFinite(ms) || ms <= 0) return ''
50 const min = Math.round(ms / 60_000)
51 if (min >= 1_440) return `${Math.floor(min / 1_440)}d ${Math.floor((min % 1_440) / 60)}h`
52 if (min >= 60) return `${Math.floor(min / 60)}h ${String(min % 60).padStart(2, '0')}m`
53 return `${min}m`
54}
55
56export function corDe(pct: number | null): 'success' | 'warning' | 'error' | 'subtle' {
57 if (pct === null) return 'subtle'
58 if (pct >= 85) return 'error'
59 if (pct >= 60) return 'warning'
60 return 'success'
61}
62
63// Preenchimento e trilho em células inteiras, desenhados como fundo pintado (a banda pinta o fundo
64// de espaços): sem emendas entre células, sem depender de glifo da fonte, da mesma altura do mascote.
65// Célula inteira: no Terminal.app o glifo de bloco é mais baixo que a célula, e um oitavo (▍) deixaria
66// um buraco ou um degrau antes do trilho.
67// Nos extremos a célula inteira mentiria: uso acima de 0 mostra ao menos uma célula cheia, e uso
68// abaixo de 100 deixa ao menos uma vazia. Sem leitura não há barra (quem desenha põe outra coisa).
69export function barra(pct: number | null, largura: number): { cheio: string; vazio: string } {
70 if (pct === null) return { cheio: '', vazio: '' }
71 const p = Math.max(0, Math.min(100, pct))
72 let n = Math.round((p / 100) * largura)
73 if (p > 0 && n === 0) n = Math.min(1, largura)
74 if (p < 100 && n === largura && largura > 1) n = largura - 1
75 return { cheio: ' '.repeat(n), vazio: ' '.repeat(Math.max(0, largura - n)) }
76}
77
78// `extra` é o detalhe já escrito: "↻ 2h 10m" para um reinício, "112k/200k" para o contexto.
79export type Trecho = { rotulo: string; pct: number | null; extra: string }
80
81// A linha começa depois de um recuo de uma coluna (paddingLeft do Box, como o resto do Claude Code)
82// e, com barras, para uma coluna antes da borda. Toda conta de largura soma o recuo.
83export const RECUO = 1
84const MARGEM_DIREITA = 1
85// Espaço antes de cada trecho: três com barras (a barra já separa, mas o detalhe dim encostava
86// no rótulo seguinte), dois no modo compacto, onde o trecho é só "Rótulo 56%".
87export const SEP_BARRAS = 3
88export const SEP_COMPACTO = 2
89
90// Partes do cabeçalho, em colunas: o glifo do mascote (com o espaço), o modelo e o custo.
91export type Cabeca = { glifo: number; modelo: number; custo: number }
92export type NivelCabeca = 'toda' | 'sem-custo' | 'so-modelo' | 'nada'
93
94export type Encaixe = { w: number; resto: number; comExtra: boolean; cabeca: NivelCabeca; mostrar: number }
95
96// O percentual como a banda escreve: "56%", ou "—" sem leitura.
97export const pctTexto = (pct: number | null): string => (pct === null ? '—' : `${Math.round(pct)}%`)
98// O percentual ocupa sempre 4 colunas (o que falta vira espaço no fim do trecho): o número encosta
99// na barra dele e a barra não anda quando o número ganha um dígito.
100export const PCT_COLUNAS = 4
101
102const largCabeca = (c: Cabeca, nivel: NivelCabeca): number =>
103 nivel === 'toda' ? c.glifo + c.modelo + c.custo : nivel === 'sem-custo' ? c.glifo + c.modelo : nivel === 'so-modelo' ? c.modelo : 0
104
105// Banda de uma linha só no terminal. Com barras, cada trecho é " Rótulo ███░░ 56% ↻ 2h 10m" e as
106// barras dividem por igual o espaço que sobra (`resto` barras, as primeiras, levam uma coluna a mais).
107// Sem barras, o trecho fica compacto: " Rótulo 56%".
108// O que sai quando aperta, nesta ordem: o detalhe, as barras, o custo, o mascote, o modelo e,
109// por fim, os últimos trechos (`mostrar` diz quantos ficam).
110export function encaixe(colunas: number, cabeca: Cabeca, trechos: Trecho[]): Encaixe {
111 const comBarra = (t: Trecho, comExtra: boolean) => SEP_BARRAS + t.rotulo.length + 1 + 1 + PCT_COLUNAS + (comExtra && t.extra !== '' ? 1 + t.extra.length : 0)
112 const compacto = (t: Trecho) => SEP_COMPACTO + t.rotulo.length + 1 + pctTexto(t.pct).length
113 const n = trechos.length
114 const fixoBarras = (comExtra: boolean) => largCabeca(cabeca, 'toda') + 2 + trechos.reduce((s, t) => s + comBarra(t, comExtra), 0)
115 const livre = (comExtra: boolean) => colunas - RECUO - MARGEM_DIREITA - fixoBarras(comExtra)
116 const dividir = (comExtra: boolean): Encaixe => ({ w: Math.floor(livre(comExtra) / n), resto: livre(comExtra) % n, comExtra, cabeca: 'toda', mostrar: n })
117 if (n > 0 && livre(true) >= 5 * n) return dividir(true)
118 if (n > 0 && livre(false) >= 3 * n) return dividir(false)
119 const soma = (k: number) => trechos.slice(0, k).reduce((s, t) => s + compacto(t), 0)
120 for (const nivel of ['toda', 'sem-custo', 'so-modelo'] as const) {
121 if (RECUO + largCabeca(cabeca, nivel) + 2 + soma(n) <= colunas) return { w: 0, resto: 0, comExtra: false, cabeca: nivel, mostrar: n }
122 }
123 let k = n
124 while (k > 0 && RECUO + 2 + soma(k) > colunas) k--
125 return { w: 0, resto: 0, comExtra: false, cabeca: 'nada', mostrar: k }
126}
127hooks/mascote.ts 7 lines1// Gerado por arte/gerar_mascote.py; não edite à mão.
2// Fan art do Clawd: 13 gestos em SMIL, ciclo de 55.7 s, palco de 24x14 pixels de arte.
3export const MASCOTE_ANIMADO = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"21\" viewBox=\"0 0 24 14\" shape-rendering=\"crispEdges\"><style>.e{display:none}@media (prefers-reduced-motion:reduce){.a{display:none}.e{display:inline}}</style><g class=\"e\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/></g><g class=\"a\"><g opacity=\"1\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.01257;0.01527;0.02784;0.04041;0.044;0.05657;0.06017;0.06915;0.07094;0.07094;0.08351;0.08621;0.09878;0.12213;0.1347;0.13739;0.14996;0.20833;0.22091;0.2236;0.23617;0.2606;0.27317;0.27586;0.28843;0.3398;0.34249;0.34249;0.35506;0.35776;0.37033;0.4102;0.42277;0.42547;0.43804;0.48258;0.49515;0.49784;0.51042;0.56717;0.57974;0.58244;0.59501;0.64889;0.66146;0.66415;0.67672;0.73384;0.74641;0.7491;0.76167;0.81501;0.82759;0.83028;0.84285;0.92134;0.93391;0.9366;0.94917\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.01257;0.01527;0.08351;0.08621;0.1347;0.13739;0.22091;0.2236;0.27317;0.27586;0.35506;0.35776;0.42277;0.42547;0.49515;0.49784;0.57974;0.58244;0.66146;0.66415;0.74641;0.7491;0.82759;0.83028;0.84285;0.84824;0.91146;0.91595;0.93391;0.9366\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM8 4h6v1h-6zM15 4h3v1h-3zM6 5h1v1h-1zM8 5h6v1h-6zM15 5h3v1h-3zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.02784;0.04041\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h3v1h-3zM10 4h6v1h-6zM17 4h1v1h-1zM6 5h3v1h-3zM10 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.044;0.05657\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.06017;0.06915;0.43804;0.44343\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.09878;0.10004;0.10632;0.10758;0.10758;0.11045;0.11045;0.11171;0.118;0.11925;0.11925;0.12213;0.257;0.2606;0.37033;0.37482;0.40481;0.4102;0.56358;0.56717;0.80244;0.80388;0.80819;0.80963;0.80963;0.81501\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM7 4h1v1h-1zM9 4h1v1h-1zM14 4h1v1h-1zM16 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 1h12v1h-12zM6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h1v1h-1zM8 4h1v1h-1zM10 4h4v1h-4zM15 4h1v1h-1zM17 4h1v1h-1zM4 5h16v1h-16zM4 6h16v1h-16zM6 7h12v1h-12zM6 8h12v1h-12zM7 9h1v1h-1zM9 9h1v1h-1zM14 9h1v1h-1zM16 9h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.10004;0.10129;0.10506;0.10632;0.11171;0.11297;0.11674;0.118\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 2h1v1h-1zM15 2h1v1h-1zM7 3h1v1h-1zM9 3h1v1h-1zM14 3h1v1h-1zM16 3h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 0h12v1h-12zM6 1h12v1h-12zM4 2h4v1h-4zM9 2h6v1h-6zM16 2h4v1h-4zM4 3h3v1h-3zM8 3h1v1h-1zM10 3h4v1h-4zM15 3h1v1h-1zM17 3h3v1h-3zM6 4h12v1h-12zM6 5h12v1h-12zM6 6h12v1h-12zM6 7h12v1h-12zM7 8h1v1h-1zM9 8h1v1h-1zM14 8h1v1h-1zM16 8h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.10129;0.10255;0.10255;0.10381;0.10381;0.10506;0.11297;0.11422;0.11422;0.11548;0.11548;0.11674;0.80388;0.80532;0.80675;0.80819\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1zM8 6h1v1h-1zM15 6h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h4v1h-4zM9 6h6v1h-6zM16 6h4v1h-4zM4 7h3v1h-3zM17 7h3v1h-3zM6 8h1v1h-1zM17 8h1v1h-1zM6 9h1v1h-1zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.14996;0.15535\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1zM8 6h1v1h-1zM15 6h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h4v1h-4zM9 6h6v1h-6zM16 6h2v1h-2zM4 7h3v1h-3zM17 7h1v1h-1zM6 8h1v1h-1zM17 8h3v1h-3zM6 9h1v1h-1zM17 9h3v1h-3z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.15535;0.15733;0.1593;0.16128;0.16325;0.16523;0.16721;0.16918;0.17116;0.17313;0.17511;0.17708;0.18175;0.18373;0.1857;0.18768;0.18966;0.19163;0.19361;0.19558\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1zM8 6h1v1h-1zM15 6h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM6 6h2v1h-2zM9 6h6v1h-6zM16 6h4v1h-4zM6 7h1v1h-1zM17 7h3v1h-3zM4 8h3v1h-3zM17 8h1v1h-1zM4 9h3v1h-3zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.15733;0.1593;0.16128;0.16325;0.16523;0.16721;0.16918;0.17116;0.17313;0.17511;0.17708;0.17906;0.18373;0.1857;0.18768;0.18966;0.19163;0.19361;0.19558;0.19756\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h3v1h-3zM17 7h3v1h-3zM6 8h1v1h-1zM17 8h1v1h-1zM6 9h1v1h-1zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.17906;0.18175\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5E5D59\" d=\"M5 11h14v1h-14z\"/><path fill=\"#8B8B8B\" d=\"M7 7h10v1h-10zM7 8h4v1h-4zM13 8h4v1h-4zM7 9h10v1h-10zM7 10h10v1h-10z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h3v1h-3zM17 7h3v1h-3zM6 8h1v1h-1zM17 8h1v1h-1zM6 9h1v1h-1zM17 9h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 8h2v1h-2z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.19756;0.20833\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h4v1h-4zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.23617;0.23976;0.24264;0.24551;0.24838;0.25126;0.25413;0.257;0.4754;0.48258\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM19 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM19 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.23976;0.24264;0.24551;0.24838;0.25126;0.25413\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h3v1h-3zM10 4h6v1h-6zM17 4h1v1h-1zM6 5h3v1h-3zM10 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.28843;0.29041\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M10 4h1v1h-1zM17 4h1v1h-1zM10 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h3v1h-3zM11 4h6v1h-6zM18 4h1v1h-1zM7 5h3v1h-3zM11 5h6v1h-6zM18 5h1v1h-1zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29041;0.29239\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M10 4h1v1h-1zM17 4h1v1h-1zM10 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h3v1h-3zM11 4h6v1h-6zM18 4h1v1h-1zM7 5h3v1h-3zM11 5h6v1h-6zM18 5h1v1h-1zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29239;0.29436\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M11 4h1v1h-1zM18 4h1v1h-1zM11 5h1v1h-1zM18 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h3v1h-3zM12 4h6v1h-6zM19 4h1v1h-1zM8 5h3v1h-3zM12 5h6v1h-6zM19 5h1v1h-1zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM17 11h1v1h-1zM19 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29436;0.29634\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M11 4h1v1h-1zM18 4h1v1h-1zM11 5h1v1h-1zM18 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h3v1h-3zM12 4h6v1h-6zM19 4h1v1h-1zM8 5h3v1h-3zM12 5h6v1h-6zM19 5h1v1h-1zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29634;0.29831\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M12 4h1v1h-1zM19 4h1v1h-1zM12 5h1v1h-1zM19 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M9 2h12v1h-12zM9 3h12v1h-12zM9 4h3v1h-3zM13 4h6v1h-6zM20 4h1v1h-1zM9 5h3v1h-3zM13 5h6v1h-6zM20 5h1v1h-1zM7 6h16v1h-16zM7 7h16v1h-16zM9 8h12v1h-12zM9 9h12v1h-12zM10 10h1v1h-1zM12 10h1v1h-1zM17 10h1v1h-1zM19 10h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM18 11h1v1h-1zM20 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.29831;0.30029\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M12 4h1v1h-1zM19 4h1v1h-1zM12 5h1v1h-1zM19 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M9 2h12v1h-12zM9 3h12v1h-12zM9 4h3v1h-3zM13 4h6v1h-6zM20 4h1v1h-1zM9 5h3v1h-3zM13 5h6v1h-6zM20 5h1v1h-1zM7 6h16v1h-16zM7 7h16v1h-16zM9 8h12v1h-12zM9 9h12v1h-12zM10 10h1v1h-1zM12 10h1v1h-1zM17 10h1v1h-1zM19 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30029;0.30226\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M10 4h1v1h-1zM17 4h1v1h-1zM10 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M9 2h12v1h-12zM9 3h12v1h-12zM9 4h1v1h-1zM11 4h6v1h-6zM18 4h3v1h-3zM9 5h1v1h-1zM11 5h6v1h-6zM18 5h3v1h-3zM7 6h16v1h-16zM7 7h16v1h-16zM9 8h12v1h-12zM9 9h12v1h-12zM10 10h1v1h-1zM12 10h1v1h-1zM17 10h1v1h-1zM19 10h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1zM18 11h1v1h-1zM20 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30226;0.30424\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h1v1h-1zM10 4h6v1h-6zM17 4h3v1h-3zM8 5h1v1h-1zM10 5h6v1h-6zM17 5h3v1h-3zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30424;0.30621\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M8 2h12v1h-12zM8 3h12v1h-12zM8 4h1v1h-1zM10 4h6v1h-6zM17 4h3v1h-3zM8 5h1v1h-1zM10 5h6v1h-6zM17 5h3v1h-3zM6 6h16v1h-16zM6 7h16v1h-16zM8 8h12v1h-12zM8 9h12v1h-12zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1zM17 11h1v1h-1zM19 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30621;0.30819\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h1v1h-1zM9 4h6v1h-6zM16 4h3v1h-3zM7 5h1v1h-1zM9 5h6v1h-6zM16 5h3v1h-3zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.30819;0.31017\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h1v1h-1zM9 4h6v1h-6zM16 4h3v1h-3zM7 5h1v1h-1zM9 5h6v1h-6zM16 5h3v1h-3zM5 6h16v1h-16zM5 7h16v1h-16zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31017;0.31214\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM8 4h6v1h-6zM15 4h3v1h-3zM6 5h1v1h-1zM8 5h6v1h-6zM15 5h3v1h-3zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31214;0.31412\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM8 4h6v1h-6zM15 4h3v1h-3zM6 5h1v1h-1zM8 5h6v1h-6zM15 5h3v1h-3zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31412;0.31609\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M6 4h1v1h-1zM13 4h1v1h-1zM6 5h1v1h-1zM13 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h1v1h-1zM7 4h6v1h-6zM14 4h3v1h-3zM5 5h1v1h-1zM7 5h6v1h-6zM14 5h3v1h-3zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31609;0.31807\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M6 4h1v1h-1zM13 4h1v1h-1zM6 5h1v1h-1zM13 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h1v1h-1zM7 4h6v1h-6zM14 4h3v1h-3zM5 5h1v1h-1zM7 5h6v1h-6zM14 5h3v1h-3zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.31807;0.32004\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M5 4h1v1h-1zM12 4h1v1h-1zM5 5h1v1h-1zM12 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h1v1h-1zM6 4h6v1h-6zM13 4h3v1h-3zM4 5h1v1h-1zM6 5h6v1h-6zM13 5h3v1h-3zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32004;0.32202\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M5 4h1v1h-1zM12 4h1v1h-1zM5 5h1v1h-1zM12 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h1v1h-1zM6 4h6v1h-6zM13 4h3v1h-3zM4 5h1v1h-1zM6 5h6v1h-6zM13 5h3v1h-3zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32202;0.32399\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M3 2h12v1h-12zM3 3h12v1h-12zM3 4h1v1h-1zM5 4h6v1h-6zM12 4h3v1h-3zM3 5h1v1h-1zM5 5h6v1h-6zM12 5h3v1h-3zM1 6h16v1h-16zM1 7h16v1h-16zM3 8h12v1h-12zM3 9h12v1h-12zM4 10h1v1h-1zM6 10h1v1h-1zM11 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32399;0.32597\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M4 4h1v1h-1zM11 4h1v1h-1zM4 5h1v1h-1zM11 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M3 2h12v1h-12zM3 3h12v1h-12zM3 4h1v1h-1zM5 4h6v1h-6zM12 4h3v1h-3zM3 5h1v1h-1zM5 5h6v1h-6zM12 5h3v1h-3zM1 6h16v1h-16zM1 7h16v1h-16zM3 8h12v1h-12zM3 9h12v1h-12zM4 10h1v1h-1zM6 10h1v1h-1zM11 10h1v1h-1zM13 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32597;0.32795\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M6 4h1v1h-1zM13 4h1v1h-1zM6 5h1v1h-1zM13 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M3 2h12v1h-12zM3 3h12v1h-12zM3 4h3v1h-3zM7 4h6v1h-6zM14 4h1v1h-1zM3 5h3v1h-3zM7 5h6v1h-6zM14 5h1v1h-1zM1 6h16v1h-16zM1 7h16v1h-16zM3 8h12v1h-12zM3 9h12v1h-12zM4 10h1v1h-1zM6 10h1v1h-1zM11 10h1v1h-1zM13 10h1v1h-1zM3 11h1v1h-1zM5 11h1v1h-1zM10 11h1v1h-1zM12 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32795;0.32992\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h3v1h-3zM8 4h6v1h-6zM15 4h1v1h-1zM4 5h3v1h-3zM8 5h6v1h-6zM15 5h1v1h-1zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM6 11h1v1h-1zM8 11h1v1h-1zM13 11h1v1h-1zM15 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.32992;0.3319\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM7 5h1v1h-1zM14 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M4 2h12v1h-12zM4 3h12v1h-12zM4 4h3v1h-3zM8 4h6v1h-6zM15 4h1v1h-1zM4 5h3v1h-3zM8 5h6v1h-6zM15 5h1v1h-1zM2 6h16v1h-16zM2 7h16v1h-16zM4 8h12v1h-12zM4 9h12v1h-12zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1zM4 11h1v1h-1zM6 11h1v1h-1zM11 11h1v1h-1zM13 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.3319;0.33387\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h3v1h-3zM9 4h6v1h-6zM16 4h1v1h-1zM5 5h3v1h-3zM9 5h6v1h-6zM16 5h1v1h-1zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.33387;0.33585\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM5 4h3v1h-3zM9 4h6v1h-6zM16 4h1v1h-1zM5 5h3v1h-3zM9 5h6v1h-6zM16 5h1v1h-1zM3 6h16v1h-16zM3 7h16v1h-16zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.33585;0.33782\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM9 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h3v1h-3zM10 4h6v1h-6zM17 4h1v1h-1zM6 5h3v1h-3zM10 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM8 11h1v1h-1zM10 11h1v1h-1zM15 11h1v1h-1zM17 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.33782;0.3398\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 4h1v1h-1zM22 4h1v1h-1zM20 5h3v1h-3zM21 6h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.37482;0.37751\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 3h1v1h-1zM22 3h1v1h-1zM20 4h3v1h-3zM21 5h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.37751;0.38021\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 2h1v1h-1zM22 2h1v1h-1zM20 3h3v1h-3zM21 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.38021;0.3829\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 1h1v1h-1zM22 1h1v1h-1zM20 2h3v1h-3zM21 3h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.3829;0.3856\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 0h1v1h-1zM22 0h1v1h-1zM20 1h3v1h-3zM21 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.3856;0.38829;0.39296;0.39655;0.40122;0.40481\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E25C6B\" d=\"M20 0h1v1h-1zM22 0h1v1h-1zM19 1h5v1h-5zM20 2h3v1h-3zM21 3h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.38829;0.39296;0.39655;0.40122\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M21 0h1v1h-1zM20 1h3v1h-3zM21 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.44343;0.4463;0.44917;0.45205;0.45492;0.45779;0.46067;0.46354\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M20 0h1v1h-1zM22 0h1v1h-1zM21 1h1v1h-1zM20 2h1v1h-1zM22 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.4463;0.44917;0.45205;0.45492;0.45779;0.46067;0.46354;0.46642\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM15 4h2v1h-2zM7 5h2v1h-2zM15 5h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM9 4h6v1h-6zM17 4h3v1h-3zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h3v1h-3zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M21 0h1v1h-1zM20 1h3v1h-3zM21 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.46642;0.4754\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 0h10v1h-10zM7 1h4v1h-4zM13 1h4v1h-4zM8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51042;0.51293\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 1h10v1h-10zM7 2h4v1h-4zM13 2h4v1h-4zM8 3h1v1h-1zM15 3h1v1h-1zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM11 2h2v1h-2zM17 2h1v1h-1zM6 3h2v1h-2zM9 3h6v1h-6zM16 3h2v1h-2zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51293;0.51545\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 2h10v1h-10zM7 3h4v1h-4zM13 3h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM17 2h1v1h-1zM6 3h1v1h-1zM11 3h2v1h-2zM17 3h1v1h-1zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51545;0.51796\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 3h10v1h-10zM7 4h4v1h-4zM13 4h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h1v1h-1zM17 3h1v1h-1zM6 4h1v1h-1zM11 4h2v1h-2zM17 4h1v1h-1zM6 5h12v1h-12zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.51796;0.52047\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h10v1h-10zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.52047;0.52586;0.54849;0.55568\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h9v1h-9zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M7 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.52586;0.52748\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM10 4h7v1h-7zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M9 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.52748;0.52909\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h6v1h-6zM14 4h3v1h-3zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M13 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.52909;0.53071\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h8v1h-8zM16 4h1v1h-1zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h1v1h-1zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M15 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.53071;0.53233\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h10v1h-10zM7 5h4v1h-4zM13 5h4v1h-4z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM17 4h3v1h-3zM6 5h1v1h-1zM11 5h2v1h-2zM17 5h3v1h-3zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.53233;0.54849\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 3h10v1h-10zM7 4h4v1h-4zM13 4h4v1h-4zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h1v1h-1zM17 3h1v1h-1zM6 4h1v1h-1zM11 4h2v1h-2zM17 4h1v1h-1zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.55568;0.55765\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 2h10v1h-10zM7 3h4v1h-4zM13 3h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM17 2h1v1h-1zM6 3h1v1h-1zM11 3h2v1h-2zM17 3h1v1h-1zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.55765;0.55963\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 1h10v1h-10zM7 2h4v1h-4zM13 2h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h1v1h-1zM11 2h2v1h-2zM17 2h1v1h-1zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.55963;0.5616\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 0h10v1h-10zM7 1h4v1h-4zM13 1h4v1h-4zM8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.5616;0.56358\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M21 0h1v1h-1zM21 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h4v1h-4zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.59501;0.59896;0.60291;0.60686;0.61081;0.61476\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h4v1h-4zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.59896;0.60291;0.60686;0.61081;0.61476;0.61871\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h14v1h-14zM6 4h14v1h-14zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h14v1h-14zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 2h3v1h-3zM20 3h4v1h-4zM20 4h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.61871;0.63308\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M21 0h1v1h-1zM21 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.63308;0.63703;0.64098;0.64494\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM4 6h16v1h-16zM4 7h14v1h-14zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M20 4h3v1h-3zM20 5h4v1h-4zM20 6h3v1h-3z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.63703;0.64098;0.64494;0.64889\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h1v1h-1zM14 4h1v1h-1zM6 5h1v1h-1zM8 5h1v1h-1zM13 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M2 0h1v1h-1zM2 1h1v1h-1zM1 2h2v1h-2z\"/><path fill=\"#D87656\" d=\"M5 2h12v1h-12zM5 3h12v1h-12zM3 4h4v1h-4zM8 4h6v1h-6zM15 4h2v1h-2zM3 5h3v1h-3zM7 5h1v1h-1zM9 5h4v1h-4zM14 5h1v1h-1zM16 5h1v1h-1zM5 6h14v1h-14zM5 7h14v1h-14zM5 8h12v1h-12zM5 9h12v1h-12zM6 10h1v1h-1zM8 10h1v1h-1zM13 10h1v1h-1zM15 10h1v1h-1zM5 11h1v1h-1zM7 11h1v1h-1zM12 11h1v1h-1zM14 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.67672;0.67996;0.68966;0.69289;0.70259;0.70582;0.71552;0.71875\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 4h1v1h-1zM16 4h1v1h-1zM8 5h1v1h-1zM10 5h1v1h-1zM15 5h1v1h-1zM17 5h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M2 0h1v1h-1zM2 1h1v1h-1zM1 2h2v1h-2z\"/><path fill=\"#D87656\" d=\"M7 2h12v1h-12zM7 3h12v1h-12zM7 4h2v1h-2zM10 4h6v1h-6zM17 4h4v1h-4zM7 5h1v1h-1zM9 5h1v1h-1zM11 5h4v1h-4zM16 5h1v1h-1zM18 5h3v1h-3zM5 6h14v1h-14zM5 7h14v1h-14zM7 8h12v1h-12zM7 9h12v1h-12zM8 10h1v1h-1zM10 10h1v1h-1zM15 10h1v1h-1zM17 10h1v1h-1zM9 11h1v1h-1zM11 11h1v1h-1zM16 11h1v1h-1zM18 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.67996;0.68319;0.69289;0.69612;0.70582;0.70905;0.71875;0.72198\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 3h1v1h-1zM14 3h1v1h-1zM6 4h1v1h-1zM8 4h1v1h-1zM13 4h1v1h-1zM15 4h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1zM22 2h1v1h-1zM21 3h2v1h-2z\"/><path fill=\"#D87656\" d=\"M5 1h12v1h-12zM5 2h12v1h-12zM3 3h4v1h-4zM8 3h6v1h-6zM15 3h2v1h-2zM3 4h3v1h-3zM7 4h1v1h-1zM9 4h4v1h-4zM14 4h1v1h-1zM16 4h1v1h-1zM5 5h14v1h-14zM5 6h14v1h-14zM5 7h12v1h-12zM5 8h12v1h-12zM6 9h1v1h-1zM8 9h1v1h-1zM13 9h1v1h-1zM15 9h1v1h-1zM5 10h1v1h-1zM7 10h1v1h-1zM12 10h1v1h-1zM14 10h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.68319;0.68642;0.69612;0.69935;0.70905;0.71228;0.72198;0.72522\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 3h1v1h-1zM16 3h1v1h-1zM8 4h1v1h-1zM10 4h1v1h-1zM15 4h1v1h-1zM17 4h1v1h-1z\"/><path fill=\"#8B8B8B\" d=\"M22 1h1v1h-1zM22 2h1v1h-1zM21 3h2v1h-2z\"/><path fill=\"#D87656\" d=\"M7 1h12v1h-12zM7 2h12v1h-12zM7 3h2v1h-2zM10 3h6v1h-6zM17 3h4v1h-4zM7 4h1v1h-1zM9 4h1v1h-1zM11 4h4v1h-4zM16 4h1v1h-1zM18 4h3v1h-3zM5 5h14v1h-14zM5 6h14v1h-14zM7 7h12v1h-12zM7 8h12v1h-12zM8 9h1v1h-1zM10 9h1v1h-1zM15 9h1v1h-1zM17 9h1v1h-1zM9 10h1v1h-1zM11 10h1v1h-1zM16 10h1v1h-1zM18 10h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0;1;0\" keyTimes=\"0;0.68642;0.68966;0.69935;0.70259;0.71228;0.71552;0.72522;0.72845\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.72845;0.73384\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h2v1h-2zM15 5h2v1h-2zM7 6h2v1h-2zM15 6h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h1v1h-1zM6 6h1v1h-1zM9 6h6v1h-6zM17 6h1v1h-1zM4 7h16v1h-16zM4 8h16v1h-16zM6 9h12v1h-12zM6 10h12v1h-12zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1zM7 12h1v1h-1zM9 12h1v1h-1zM14 12h1v1h-1zM16 12h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76167;0.76329\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 6h2v1h-2zM15 6h2v1h-2zM7 7h2v1h-2zM15 7h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 4h12v1h-12zM6 5h12v1h-12zM6 6h1v1h-1zM9 6h6v1h-6zM17 6h1v1h-1zM6 7h1v1h-1zM9 7h6v1h-6zM17 7h1v1h-1zM4 8h16v1h-16zM4 9h16v1h-16zM6 10h12v1h-12zM6 11h12v1h-12zM7 12h1v1h-1zM9 12h1v1h-1zM14 12h1v1h-1zM16 12h1v1h-1zM7 13h1v1h-1zM9 13h1v1h-1zM14 13h1v1h-1zM16 13h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76329;0.76491\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 7h2v1h-2zM15 7h2v1h-2zM7 8h2v1h-2zM15 8h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 5h12v1h-12zM6 6h12v1h-12zM6 7h1v1h-1zM9 7h6v1h-6zM17 7h1v1h-1zM6 8h1v1h-1zM9 8h6v1h-6zM17 8h1v1h-1zM4 9h16v1h-16zM4 10h16v1h-16zM6 11h12v1h-12zM6 12h12v1h-12zM7 13h1v1h-1zM9 13h1v1h-1zM14 13h1v1h-1zM16 13h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76491;0.76652\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 8h2v1h-2zM15 8h2v1h-2zM7 9h2v1h-2zM15 9h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 6h12v1h-12zM6 7h12v1h-12zM6 8h1v1h-1zM9 8h6v1h-6zM17 8h1v1h-1zM6 9h1v1h-1zM9 9h6v1h-6zM17 9h1v1h-1zM4 10h16v1h-16zM4 11h16v1h-16zM6 12h12v1h-12zM6 13h12v1h-12z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76652;0.76814\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 9h2v1h-2zM15 9h2v1h-2zM7 10h2v1h-2zM15 10h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 7h12v1h-12zM6 8h12v1h-12zM6 9h1v1h-1zM9 9h6v1h-6zM17 9h1v1h-1zM6 10h1v1h-1zM9 10h6v1h-6zM17 10h1v1h-1zM4 11h16v1h-16zM4 12h16v1h-16zM6 13h12v1h-12z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76814;0.76976\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 10h2v1h-2zM15 10h2v1h-2zM7 11h2v1h-2zM15 11h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h1v1h-1zM9 10h6v1h-6zM17 10h1v1h-1zM6 11h1v1h-1zM9 11h6v1h-6zM17 11h1v1h-1zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.76976;0.77137\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 10h1v1h-1zM14 10h1v1h-1zM7 11h1v1h-1zM14 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h1v1h-1zM8 10h6v1h-6zM15 10h3v1h-3zM6 11h1v1h-1zM8 11h6v1h-6zM15 11h3v1h-3zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.77137;0.78215\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M9 10h1v1h-1zM16 10h1v1h-1zM9 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h3v1h-3zM10 10h6v1h-6zM17 10h1v1h-1zM6 11h3v1h-3zM10 11h6v1h-6zM17 11h1v1h-1zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.78215;0.79292\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 11h1v1h-1zM15 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h12v1h-12zM6 11h2v1h-2zM9 11h6v1h-6zM16 11h2v1h-2zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.79292;0.79562\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 10h1v1h-1zM15 10h1v1h-1zM8 11h1v1h-1zM15 11h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 8h12v1h-12zM6 9h12v1h-12zM6 10h2v1h-2zM9 10h6v1h-6zM16 10h2v1h-2zM6 11h2v1h-2zM9 11h6v1h-6zM16 11h2v1h-2zM4 12h16v1h-16zM4 13h16v1h-16z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.79562;0.80101\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 7h1v1h-1zM15 7h1v1h-1zM7 8h1v1h-1zM9 8h1v1h-1zM14 8h1v1h-1zM16 8h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 5h12v1h-12zM6 6h12v1h-12zM6 7h2v1h-2zM9 7h6v1h-6zM16 7h2v1h-2zM6 8h1v1h-1zM8 8h1v1h-1zM10 8h4v1h-4zM15 8h1v1h-1zM17 8h1v1h-1zM4 9h16v1h-16zM4 10h16v1h-16zM6 11h12v1h-12zM6 12h12v1h-12zM7 13h1v1h-1zM9 13h1v1h-1zM14 13h1v1h-1zM16 13h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.80101;0.80244\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 1h1v1h-1zM15 1h1v1h-1zM7 2h1v1h-1zM9 2h1v1h-1zM14 2h1v1h-1zM16 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 0h12v1h-12zM4 1h4v1h-4zM9 1h6v1h-6zM16 1h4v1h-4zM4 2h3v1h-3zM8 2h1v1h-1zM10 2h4v1h-4zM15 2h1v1h-1zM17 2h3v1h-3zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h12v1h-12zM6 6h12v1h-12zM7 7h1v1h-1zM9 7h1v1h-1zM14 7h1v1h-1zM16 7h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.80532;0.80675\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.84824;0.85542\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M19 3h2v1h-2zM19 4h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.85542;0.86009;0.8741;0.87877;0.89278;0.89745\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M20 2h2v1h-2zM20 3h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.86009;0.86476;0.87877;0.88344;0.89745;0.90212\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M20 1h3v1h-3zM21 2h1v1h-1zM19 3h4v1h-4zM19 4h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.86476;0.86943;0.88344;0.88811;0.90212;0.90679\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 5h3v1h-3zM14 5h3v1h-3z\"/><path fill=\"#8B8B8B\" d=\"M21 0h3v1h-3zM22 1h1v1h-1zM21 2h3v1h-3zM19 3h2v1h-2zM19 4h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h12v1h-12zM6 5h1v1h-1zM10 5h4v1h-4zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1;0\" keyTimes=\"0;0.86943;0.8741;0.88811;0.89278;0.90679;0.91146\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM15 4h2v1h-2zM7 5h2v1h-2zM15 5h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM9 4h6v1h-6zM17 4h1v1h-1zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.91595;0.92134\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M7 4h2v1h-2zM15 4h2v1h-2zM7 5h2v1h-2zM15 5h2v1h-2z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h1v1h-1zM9 4h6v1h-6zM17 4h1v1h-1zM6 5h1v1h-1zM9 5h6v1h-6zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.94917;0.95366\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0\" keyTimes=\"0;0.95366;0.956;0.95833;0.96067\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0;1;0;1\" keyTimes=\"0;0.956;0.95833;0.96067;0.963;0.99102\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M1 0h1v1h-1zM11 0h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.963;0.96534\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M1 0h1v1h-1zM10 0h1v1h-1zM12 0h2v1h-2z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 1h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.96534;0.96767\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 1h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 2h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.96767;0.97001\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M9 0h2v1h-2zM12 0h2v1h-2zM1 2h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 3h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97001;0.97234\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 3h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 4h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97234;0.97468\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 4h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM1 5h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97468;0.97701\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M3 0h1v1h-1zM11 0h1v1h-1zM1 6h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97701;0.97935\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 6h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM3 1h1v1h-1zM1 7h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.97935;0.98168\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 7h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M7 0h1v1h-1zM11 0h1v1h-1zM17 0h1v1h-1zM3 2h1v1h-1zM1 8h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98168;0.98402\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 8h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M6 0h1v1h-1zM20 0h1v1h-1zM9 1h6v1h-6z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM18 0h1v1h-1zM7 1h1v1h-1zM17 1h1v1h-1zM3 3h1v1h-1zM1 9h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98402;0.98635\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 9h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM4 4h4v1h-4zM9 4h6v1h-6zM16 4h4v1h-4zM4 5h3v1h-3zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h3v1h-3zM6 6h12v1h-12zM6 7h12v1h-12zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M6 1h1v1h-1zM9 1h6v1h-6zM20 1h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM18 1h1v1h-1zM3 4h1v1h-1zM1 10h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98635;0.98869\"/></g><g opacity=\"0\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM7 5h1v1h-1zM9 5h1v1h-1zM14 5h1v1h-1zM16 5h1v1h-1z\"/><path fill=\"#5B8DEF\" d=\"M10 0h1v1h-1zM12 0h2v1h-2zM1 10h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h1v1h-1zM8 5h1v1h-1zM10 5h4v1h-4zM15 5h1v1h-1zM17 5h1v1h-1zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/><path fill=\"#E8B93C\" d=\"M9 1h6v1h-6zM20 2h1v1h-1z\"/><path fill=\"#F9F8F4\" d=\"M11 0h1v1h-1zM18 2h1v1h-1zM3 5h1v1h-1zM1 11h1v1h-1z\"/><animate attributeName=\"opacity\" calcMode=\"discrete\" dur=\"55.68s\" repeatCount=\"indefinite\" values=\"0;1;0\" keyTimes=\"0;0.98869;0.99102\"/></g></g></svg>"
4export const MASCOTE_PARADO = "<svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"21\" viewBox=\"0 0 24 14\" shape-rendering=\"crispEdges\"><path fill=\"#141413\" d=\"M8 4h1v1h-1zM15 4h1v1h-1zM8 5h1v1h-1zM15 5h1v1h-1z\"/><path fill=\"#D87656\" d=\"M6 2h12v1h-12zM6 3h12v1h-12zM6 4h2v1h-2zM9 4h6v1h-6zM16 4h2v1h-2zM6 5h2v1h-2zM9 5h6v1h-6zM16 5h2v1h-2zM4 6h16v1h-16zM4 7h16v1h-16zM6 8h12v1h-12zM6 9h12v1h-12zM7 10h1v1h-1zM9 10h1v1h-1zM14 10h1v1h-1zM16 10h1v1h-1zM7 11h1v1h-1zM9 11h1v1h-1zM14 11h1v1h-1zM16 11h1v1h-1z\"/></svg>"
5export const MASCOTE_LARGURA = 36
6export const MASCOTE_ALTURA = 21
7types/index.d.ts 49 lines1export type Idioma = 'en' | 'pt'
2export type Moeda = 'USD' | 'BRL' | 'EUR'
3export type Mascote = 'animado' | 'parado' | 'oculto'
4
5export type Preferencias = { idioma: Idioma; moeda: Moeda; mascote: Mascote; limitePorModelo: boolean }
6
7export type Limite = { tipo: string; pct: number | null; reinicia: string | null }
8
9// O que a banda desenha. Sem carimbo de hora: só muda quando um número muda, para não redesenhar à toa.
10export type Leitura = {
11 modelo: string
12 pct: number | null
13 tokens: number | null
14 janela: number
15 usd: number | null
16 limites: Limite[]
17}
18
19export type LimiteModelo = { modelo: string; pct: number | null; reinicia: string | null }
20
21// Limite semanal por modelo (ex.: Fable). `em` é a última tentativa; `lidoEm`, a última que deu certo.
22export type LeituraModelos = {
23 em: number
24 lidoEm: number | null
25 estado: 'ok' | 'sem-credencial' | 'recusado' | 'erro'
26 detalhe: string
27 limites: LimiteModelo[]
28}
29
30// Câmbio a partir do dólar. `em` é a última tentativa; `lidoEm`, a última que deu certo;
31// `falhas` conta as tentativas seguidas que falharam (a espera cresce com elas).
32export type Cambio = { em: number; lidoEm: number | null; falhas: number; taxas: Partial<Record<Moeda, number>> }
33
34declare module 'claude-code' {
35 interface PluginState {
36 'usage-band-mod': {
37 leitura: Leitura | null
38 oculta: boolean
39 modelos: LeituraModelos | null
40 cambio: Cambio | null
41 // Preferências que a janela de ajustes mudou e ainda não foram gravadas no userConfig.
42 ajuste: Preferencias | null
43 relogio: number
44 // Onde roda e se a janela de ajustes existe nele: descoberto uma vez por sessão; o ⚙ só aparece com ela.
45 sistema: { plataforma: 'macos' | 'windows'; disponivel: boolean } | null
46 }
47 }
48}
49