-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
+
-
-
-
st7789py Reference
+
+
+st7789py Reference
Copyright (c) 2020, 2021 Russ Hughes
This file incorporates work covered by the following copyright and
permission notice and is licensed under the same terms:
@@ -214,13 +136,13 @@ BIOS text mode fonts.
-
-st7789py.color565(red, green=0, blue=0)[source]
+st7789py.color565(red, green=0, blue=0)[source]
Convert red, green and blue values (0-255) into a 16-bit 565 encoding.
-
-class st7789py.ST7789(spi, width, height, reset=None, dc=None, cs=None, backlight=None, rotation=0)[source]
+class st7789py.ST7789(spi, width, height, reset=None, dc=None, cs=None, backlight=None, rotation=0)[source]
ST7789 driver class
- Parameters
@@ -242,19 +164,19 @@ BIOS text mode fonts.
-
-hard_reset()[source]
+hard_reset()[source]
Hard reset display.
-
-soft_reset()[source]
+soft_reset()[source]
Soft reset display.
-
-sleep_mode(value)[source]
+sleep_mode(value)[source]
Enable or disable display sleep mode.
- Parameters
@@ -268,7 +190,7 @@ BIOS text mode fonts.
-
-inversion_mode(value)[source]
+inversion_mode(value)[source]
Enable or disable display inversion mode.
- Parameters
@@ -282,7 +204,7 @@ BIOS text mode fonts.
-
-rotation(rotation)[source]
+rotation(rotation)[source]
Set display rotation.
- Parameters
@@ -299,7 +221,7 @@ BIOS text mode fonts.
-
-vline(x, y, length, color)[source]
+vline(x, y, length, color)[source]
Draw vertical line at the given location and color.
- Parameters
@@ -315,7 +237,7 @@ BIOS text mode fonts.
-
-hline(x, y, length, color)[source]
+hline(x, y, length, color)[source]
Draw horizontal line at the given location and color.
- Parameters
@@ -331,7 +253,7 @@ BIOS text mode fonts.
-
-pixel(x, y, color)[source]
+pixel(x, y, color)[source]
Draw a pixel at the given location and color.
- Parameters
@@ -346,7 +268,7 @@ BIOS text mode fonts.
-
-blit_buffer(buffer, x, y, width, height)[source]
+blit_buffer(buffer, x, y, width, height)[source]
Copy buffer to display at the given location.
- Parameters
@@ -363,7 +285,7 @@ BIOS text mode fonts.
-
-rect(x, y, w, h, color)[source]
+rect(x, y, w, h, color)[source]
Draw a rectangle at the given location, size and color.
- Parameters
@@ -380,7 +302,7 @@ BIOS text mode fonts.
-
-fill_rect(x, y, width, height, color)[source]
+fill_rect(x, y, width, height, color)[source]
Draw a rectangle at the given location, size and filled with color.
- Parameters
@@ -397,7 +319,7 @@ BIOS text mode fonts.
-
-fill(color)[source]
+fill(color)[source]
Fill the entire FrameBuffer with the specified color.
- Parameters
@@ -408,7 +330,7 @@ BIOS text mode fonts.
-
-line(x0, y0, x1, y1, color)[source]
+line(x0, y0, x1, y1, color)[source]
Draw a single pixel wide line starting at x0, y0 and ending at x1, y1.
- Parameters
@@ -425,7 +347,7 @@ BIOS text mode fonts.
-
-vscrdef(tfa, vsa, bfa)[source]
+vscrdef(tfa, vsa, bfa)[source]
Set Vertical Scrolling Definition.
To scroll a 135x240 display these values should be 40, 240, 40.
There are 40 lines above the display that are not shown followed by
@@ -445,7 +367,7 @@ changing the TFA, VSA and BFA values.
-
-vscsad(vssa)[source]
+vscsad(vssa)[source]
Set Vertical Scroll Start Address of RAM.
Defines which line in the Frame Memory will be written as the first
line after the last line of the Top Fixed Area on the display
@@ -464,7 +386,7 @@ utime.sleep(0.01)
-
-text(font, text, x0, y0, color=micropython.const, background=micropython.const)[source]
+text(font, text, x0, y0, color=micropython.const, background=micropython.const)[source]
Draw text on display in specified font and colors. 8 and 16 bit wide
fonts are supported.
@@ -483,7 +405,7 @@ fonts are supported.
-
-bitmap(bitmap, x, y, index=0)[source]
+bitmap(bitmap, x, y, index=0)[source]
Draw a bitmap on display at the specified column and row
- Parameters
@@ -500,7 +422,7 @@ module
-
-write(font, string, x, y, fg=micropython.const, bg=micropython.const)[source]
+write(font, string, x, y, fg=micropython.const, bg=micropython.const)[source]
Write a string using a converted true-type font on the display starting
at the specified column and row
@@ -519,7 +441,7 @@ at the specified column and row
-
-write_width(font, string)[source]
+write_width(font, string)[source]
Returns the width in pixels of the string if it was written with the
specified font
@@ -534,53 +456,37 @@ specified font
-
+
-
-
-
-
-
-
-
-
-
-
-
-
+
\ No newline at end of file
diff --git a/examples/esp32_320x240/feathers.py b/examples/esp32_320x240/feathers.py
index 8ebc6e5..b10cb8a 100644
--- a/examples/esp32_320x240/feathers.py
+++ b/examples/esp32_320x240/feathers.py
@@ -8,7 +8,7 @@ feathers.py
import random
import math
import utime
-from machine import Pin, SoftSPI
+from machine import Pin, SPI
import st7789py as st7789
@@ -39,13 +39,7 @@ def main():
'''
#enable display and clear screen
- spi = SoftSPI(
- baudrate=20000000,
- polarity=1,
- phase=0,
- sck=Pin(18),
- mosi=Pin(19),
- miso=Pin(13))
+ spi = SPI(1, baudrate=31250000, sck=Pin(18), mosi=Pin(19))
tft = st7789.ST7789(
spi,
diff --git a/examples/esp32_320x240/fonts.py b/examples/esp32_320x240/fonts.py
index 310ea74..7c31f60 100644
--- a/examples/esp32_320x240/fonts.py
+++ b/examples/esp32_320x240/fonts.py
@@ -5,7 +5,7 @@ fonts.py
"""
import utime
-from machine import Pin, SoftSPI
+from machine import Pin, SPI
import st7789py as st7789
# Choose fonts
@@ -25,13 +25,7 @@ from romfonts import vga2_bold_16x32 as font4
def main():
- spi = SoftSPI(
- baudrate=20000000,
- polarity=1,
- phase=0,
- sck=Pin(18),
- mosi=Pin(19),
- miso=Pin(13))
+ spi = SPI(1, baudrate=31250000, sck=Pin(18), mosi=Pin(19))
tft = st7789.ST7789(
spi,
diff --git a/examples/esp32_320x240/hello.py b/examples/esp32_320x240/hello.py
index 4aceee9..c3f4485 100644
--- a/examples/esp32_320x240/hello.py
+++ b/examples/esp32_320x240/hello.py
@@ -5,7 +5,7 @@ hello.py
"""
import random
-from machine import Pin, SoftSPI
+from machine import Pin, SPI
import st7789py as st7789
# Choose a font
@@ -25,13 +25,7 @@ from romfonts import vga2_bold_16x32 as font
def main():
- spi = SoftSPI(
- baudrate=20000000,
- polarity=1,
- phase=0,
- sck=Pin(18),
- mosi=Pin(19),
- miso=Pin(13))
+ spi = SPI(1, baudrate=31250000, sck=Pin(18), mosi=Pin(19))
tft = st7789.ST7789(
spi,
diff --git a/examples/esp32_320x240/lines.py b/examples/esp32_320x240/lines.py
index fdda78a..17c4406 100644
--- a/examples/esp32_320x240/lines.py
+++ b/examples/esp32_320x240/lines.py
@@ -6,20 +6,14 @@ lines.py
"""
import random
-from machine import Pin, SoftSPI
+from machine import Pin, SPI
import st7789py as st7789
def main():
# configure display
- spi = SoftSPI(
- baudrate=20000000,
- polarity=1,
- phase=0,
- sck=Pin(18),
- mosi=Pin(19),
- miso=Pin(13))
+ spi = SPI(1, baudrate=31250000, sck=Pin(18), mosi=Pin(19))
tft = st7789.ST7789(
spi,
diff --git a/examples/esp32_320x240/scroll.py b/examples/esp32_320x240/scroll.py
index 8761b11..f6ba69e 100644
--- a/examples/esp32_320x240/scroll.py
+++ b/examples/esp32_320x240/scroll.py
@@ -8,7 +8,7 @@ fonts.py
"""
import utime
import random
-from machine import Pin, SoftSPI
+from machine import Pin, SPI
import st7789py as st7789
# choose a font
@@ -24,13 +24,7 @@ from romfonts import vga2_bold_16x16 as font
def main():
- spi = SoftSPI(
- baudrate=20000000,
- polarity=1,
- phase=0,
- sck=Pin(18),
- mosi=Pin(19),
- miso=Pin(13))
+ spi = SPI(1, baudrate=31250000, sck=Pin(18), mosi=Pin(19))
tft = st7789.ST7789(
spi,
diff --git a/examples/esp32_320x240/toasters/maketoast.sh b/examples/esp32_320x240/toasters/maketoast.sh
new file mode 100644
index 0000000..a6662ee
--- /dev/null
+++ b/examples/esp32_320x240/toasters/maketoast.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+sprites2bitmap.py toasters.bmp 64 64 4 >toast_bitmaps.py
diff --git a/examples/esp32_320x240/toasters/toast_bitmaps.py b/examples/esp32_320x240/toasters/toast_bitmaps.py
new file mode 100644
index 0000000..5ca247e
--- /dev/null
+++ b/examples/esp32_320x240/toasters/toast_bitmaps.py
@@ -0,0 +1,649 @@
+BITMAPS = 5
+HEIGHT = 64
+WIDTH = 64
+COLORS = 16
+BITS = 81920
+BPP = 4
+PALETTE = [0x0000,0x00f8,0x4082,0xe0ff,0x609b,0x4049,0xff07,0xffff,0xdbde,0xb6b5,0x9294,0x6d6b,0x494a,0x2421,0x00d8,0x00b0]
+_bitmap =\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x00\x00\x77\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x00\x00\x77\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x00\x00\x77\x77\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x00\x00\x77\x77\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x77\x77\x00\x77\x77\x77\x00\x00\x77\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x77\x77\x00\x77\x77\x77\x00\x00\x77\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x77\x77\x77\x77\x77\x00\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x77\x77\x77\x77\x77\x00\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x77\x77\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x77\x77\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x00\x00\x00\x00\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x00\x00\x00\x00\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x00\x00\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x00\x00\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\x00\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\x00\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\x77\x77\x77\x77\x77\x00\xbb\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\x77\x77\x77\x77\x77\x00\xbb\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x00\x00\x00\x00\xbb\xbb\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x00\x00\x00\x00\xbb\xbb\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x00\x77\x77\x77\x77\x00\xbb\xbb\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x00\x77\x77\x77\x77\x00\xbb\xbb\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x00\x00\xbb\xbb\xbb\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x00\x00\xbb\xbb\xbb\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x00\x00\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x00\x00\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x99\x99\x99\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x99\x99\x99\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x99\x99\x00\x00\x00\x00\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x99\x99\x00\x00\x00\x00\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\xbb\x00\x00\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\xbb\x00\x00\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\xbb\x00\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\xbb\x00\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x00\x77\x77\x00'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x00\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x00\x77\x00\x77\x77\x77\x77\x77\x00\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x00\x77\x00\x77\x77\x77\x77\x77\x00\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x99\x99\x99\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x99\x99\x99\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x99\xbb\x00\x00\x00\x00\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x99\xbb\x00\x00\x00\x00\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\xbb\x00\x00\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\xbb\x00\x00\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\xbb\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\xbb\x00\x00\x00'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x77\x77\x00'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x77\x00\x77\x77\x00\x77\x77\x00\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\x00\x77\x77\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\x00\x77\x77\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x00\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x00\x77\x77\x77\x77\x77\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x77\x77\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x77\x77\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x00\x00\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x00\x00\x00'\
+b'\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x77\x77\x77\x77\x00\x99\x99\x99'\
+b'\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x77\x77\x00\x99\x99\x99\x99\x00\x00'\
+b'\x00\xff\xff\xff\xff\x99\x99\x99\x99\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x77\x77\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\xff\x99\x99\x99\x99\x99\x99\x99\x99\x99\x99\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x77\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\x99\x00\x00\x00\xff\xff\xff\xff\x99\x99\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x99\x99\x99\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x00\x99\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00'\
+b'\x00\x00\xff\xff\xff\x99\x99\x99\x99\x99\x99\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x99\xbb\x00\x00\x00\x00\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x00\x99\x99\x00\x00\x00\xff\xff\x99\x99\x99\x00\x00\x00'\
+b'\xff\xff\x99\x99\x99\x99\xbb\x00\x00\x00\x00\xbb\xbb\x00\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\xbb\x00\x00\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\x00\x00\x99\x99\x00\x00\x00\xff\x99\x99\x99\x00\x00\x00\xff\xff'\
+b'\x99\x99\x99\xbb\xbb\x00\x00\xbb\xbb\xbb\xbb\x00\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x00\x00\x00\xff\x99\x99\x00\x00\x00\xff\xff\x99\x99'\
+b'\x99\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00'\
+b'\x00\x99\x99\x99\x99\xff\x99\x99\x00\x00\x00\xff\x99\x99\x99\xbb'\
+b'\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\xbb\x00\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x99\x99\x99\x99\x00\x00\x00\xff\x99\x99\xcc\xbb\xbb'\
+b'\xbb\xbb\xbb\x00\x00\x77\x77\x77\x77\x77\x77\x77\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x22\x22\x22\x99\x99\x99\x99\xff\x99\x99\xcc\xbb\xbb\xbb'\
+b'\xbb\xbb\x00\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00'\
+b'\xbb\x22\x99\x99\x22\x22\x22\x99\x99\x99\x99\xcc\xbb\xbb\xbb\xbb'\
+b'\xbb\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x77\x00\x00'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x99\xcc\x99\x99\x22\x22\x22\xbb\xbb\xcc\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x77\x77'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x00\x77\x77\x00'\
+b'\xbb\x22\x99\xcc\xcc\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x77\x77\x77\x77\x77\x77\x00\x77\x00\x00\x77\x77\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\xcc\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x77\x77\x77\x77\x00\x77\x77\x77\x77\x77\x77\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x00\x77\x00\x77\x77\x77\x00\x77\x00\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x99\x99\x22\xbb\x22\xbb\xbb\xbb\xbb\x00'\
+b'\x77\x77\x00\x77\x00\x77\x77\x77\x00\x77\x00\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\x00'\
+b'\x77\x77\x77\x77\x00\x00\x00\x00\x00\x00\x00\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\xbb\xbb\xbb\xbb'\
+b'\x00\x77\x77\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\xbb\x00\xbb\xbb'\
+b'\xbb\x00\x00\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\xbb\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\xbb\x00\x00'\
+b'\xbb\xbb\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\xbb\xbb'\
+b'\xbb\xbb\xbb\xbb\x22\x22\x22\x22\x22\x22\xbb\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x99\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\xbb\x22\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\xbb\x22\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\xbb\x22\x22\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\xbb\xbb\x22\x22\x22\x22\xbb\x22\x22\x22\x22\x22\xbb'\
+b'\xbb\xbb\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\xbb\xbb\x22\x22\xbb\x22\x22\xbb\xbb\xbb\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\xbb\xbb\xbb\xbb\xbb\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55'\
+b'\x55\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55'\
+b'\x55\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44'\
+b'\x44\x44\x44\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44'\
+b'\x44\x44\x44\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44'\
+b'\x44\x44\x44\x22\x44\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44'\
+b'\x44\x44\x44\x22\x44\x55\x55\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44\x44\x22'\
+b'\x44\x44\x44\x44\x44\x44\x44\x55\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44\x44\x22'\
+b'\x44\x44\x44\x44\x44\x44\x44\x55\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44\x22\x44\x44\x44'\
+b'\x44\x44\x44\x44\x22\x44\x44\x44\x55\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44\x22\x44\x44\x44'\
+b'\x44\x44\x44\x44\x22\x44\x44\x44\x55\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44\x44\x22\x44\x44\x44\x44'\
+b'\x44\x44\x22\x44\x44\x44\x44\x44\x44\x55\x55\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x55\x55\x44\x44\x44\x44\x44\x22\x44\x44\x44\x44'\
+b'\x44\x44\x22\x44\x44\x44\x44\x44\x44\x55\x55\x00\x00\x00\x00\x00'\
+b'\x00\x00\x55\x55\x44\x44\x44\x44\x44\x44\x22\x22\x44\x44\x44\x22'\
+b'\x44\x33\x44\x22\x33\x44\x44\x44\x44\x44\x44\x55\x00\x00\x00\x00'\
+b'\x00\x00\x55\x55\x44\x44\x44\x44\x44\x44\x22\x22\x44\x44\x44\x22'\
+b'\x44\x33\x44\x22\x33\x44\x44\x44\x44\x44\x44\x55\x00\x00\x00\x00'\
+b'\x00\x55\x44\x44\x44\x44\x44\x44\x44\x44\x33\x44\x33\x44\x33\x22'\
+b'\x44\x44\x44\x44\x22\x44\x44\x44\x44\x44\x44\x44\x55\x00\x00\x00'\
+b'\x00\x55\x44\x44\x44\x44\x44\x44\x44\x44\x33\x44\x33\x44\x33\x22'\
+b'\x44\x44\x44\x44\x22\x44\x44\x44\x44\x44\x44\x44\x55\x00\x00\x00'\
+b'\x22\x55\x44\x22\x44\x44\x22\x44\x44\x44\x44\x44\x44\x22\x44\x33'\
+b'\x44\x22\x44\x44\x44\x22\x44\x44\x44\x44\x44\x44\x44\x55\x00\x00'\
+b'\x22\x55\x44\x22\x44\x44\x22\x44\x44\x44\x44\x44\x44\x22\x44\x33'\
+b'\x44\x22\x44\x44\x44\x22\x44\x44\x44\x44\x44\x44\x44\x55\x00\x00'\
+b'\x22\x22\x55\x44\x44\x44\x44\x44\x44\x22\x44\x44\x44\x44\x44\x22'\
+b'\x44\x22\x44\x44\x44\x22\x44\x44\x44\x44\x44\x44\x44\x44\x55\x00'\
+b'\x22\x22\x55\x44\x44\x44\x44\x44\x44\x22\x44\x44\x44\x44\x44\x22'\
+b'\x44\x22\x44\x44\x44\x22\x44\x44\x44\x44\x44\x44\x44\x44\x55\x00'\
+b'\x22\x22\x22\x55\x55\x44\x44\x44\x22\x44\x22\x44\x44\x44\x44\x22'\
+b'\x22\x44\x44\x44\x44\x22\x22\x44\x44\x44\x44\x44\x44\x44\x55\x55'\
+b'\x22\x22\x22\x55\x55\x44\x44\x44\x22\x44\x22\x44\x44\x44\x44\x22'\
+b'\x22\x44\x44\x44\x44\x22\x22\x44\x44\x44\x44\x44\x44\x44\x55\x55'\
+b'\x22\x22\x22\x22\x22\x55\x22\x44\x44\x44\x44\x44\x44\x44\x33\x44'\
+b'\x22\x22\x44\x33\x44\x44\x44\x44\x44\x22\x44\x44\x55\x55\x22\x22'\
+b'\x22\x22\x22\x22\x22\x55\x22\x44\x44\x44\x44\x44\x44\x44\x33\x44'\
+b'\x22\x22\x44\x33\x44\x44\x44\x44\x44\x22\x44\x44\x55\x55\x22\x22'\
+b'\x00\x22\x22\x22\x22\x22\x22\x55\x55\x44\x44\x44\x44\x44\x44\x44'\
+b'\x44\x22\x44\x44\x44\x44\x44\x44\x44\x44\x44\x55\x22\x22\x22\x22'\
+b'\x00\x22\x22\x22\x22\x22\x22\x55\x55\x44\x44\x44\x44\x44\x44\x44'\
+b'\x44\x22\x44\x44\x44\x44\x44\x44\x44\x44\x44\x55\x22\x22\x22\x22'\
+b'\x00\x00\x22\x22\x22\x22\x22\x22\x22\x55\x55\x44\x44\x44\x44\x44'\
+b'\x44\x44\x44\x44\x44\x44\x44\x44\x55\x55\x55\x22\x22\x22\x22\x22'\
+b'\x00\x00\x22\x22\x22\x22\x22\x22\x22\x55\x55\x44\x44\x44\x44\x44'\
+b'\x44\x44\x44\x44\x44\x44\x44\x44\x55\x55\x55\x22\x22\x22\x22\x22'\
+b'\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22\x22\x55\x55\x44\x22\x44'\
+b'\x44\x44\x44\x44\x44\x22\x55\x55\x22\x22\x22\x22\x22\x22\x22\x22'\
+b'\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22\x22\x55\x55\x44\x22\x44'\
+b'\x44\x44\x44\x44\x44\x22\x55\x55\x22\x22\x22\x22\x22\x22\x22\x22'\
+b'\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22\x22\x55\x44\x44'\
+b'\x44\x44\x44\x55\x55\x55\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00'\
+b'\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22\x22\x55\x44\x44'\
+b'\x44\x44\x44\x55\x55\x55\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22\x55\x55'\
+b'\x55\x55\x55\x22\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22\x55\x55'\
+b'\x55\x55\x55\x22\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22\x22\x22'\
+b'\x22\x22\x22\x22\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22'\
+b'\x22\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x22\x22'\
+b'\x22\x22\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'\
+b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
+BITMAP = memoryview(_bitmap)
diff --git a/examples/esp32_320x240/toasters/toasters.bmp b/examples/esp32_320x240/toasters/toasters.bmp
new file mode 100644
index 0000000..37e4857
Binary files /dev/null and b/examples/esp32_320x240/toasters/toasters.bmp differ
diff --git a/examples/esp32_320x240/toasters/toasters.py b/examples/esp32_320x240/toasters/toasters.py
new file mode 100644
index 0000000..983cdb9
--- /dev/null
+++ b/examples/esp32_320x240/toasters/toasters.py
@@ -0,0 +1,177 @@
+'''
+toasters.py - Flying Toasters(ish) an ESP-32 and ST7789 240x320 display.
+
+ Uses spritesheet from CircuitPython_Flying_Toasters pendant project
+ https://learn.adafruit.com/circuitpython-sprite-animation-pendant-mario-clouds-flying-toasters
+
+ Convert spritesheet bmp to tft.bitmap() method compatible python module using:
+ python3 ./sprites2bitmap.py toasters.bmp 64 64 4 > toast_bitmaps.py
+
+'''
+
+import gc
+import time
+import random
+from machine import Pin, SPI
+import st7789
+import toast_bitmaps
+
+TOASTER_FRAMES = [0, 1, 2, 3]
+TOAST_FRAMES = [4]
+
+def collide(a_col, a_row, a_width, a_height, b_col, b_row, b_width, b_height):
+ '''return true if two rectangles overlap'''
+ return (a_col + a_width >= b_col and a_col <= b_col + b_width
+ and a_row + a_height >= b_row and a_row <= b_row + b_height)
+
+def random_start(tft, sprites, bitmaps, num):
+ '''
+ Return a random location along the top or right of the screen, if that location would overlaps
+ with another sprite return (0,0). This allows the other sprites to keep moving giving the next
+ random_start a better chance to avoid a collision.
+
+ '''
+ # 50/50 chance to try along the top/right half or along the right/top half of the screen
+ if random.getrandbits(1):
+ row = 1
+ col = random.randint(bitmaps.WIDTH//2, tft.width()-bitmaps.WIDTH)
+ else:
+ col = tft.width() - bitmaps.WIDTH
+ row = random.randint(1, tft.height() // 2)
+
+ if any(collide(
+ col, row, bitmaps.WIDTH, bitmaps.HEIGHT,
+ sprite.col, sprite.row, sprite.width, sprite.height)
+ for sprite in sprites if num != sprite.num):
+
+ col = 0
+ row = 0
+
+ return (col, row)
+
+def main():
+
+ class Toast():
+ '''
+ Toast class to keep track of toaster and toast sprites
+ '''
+ def __init__(self, sprites, bitmaps, frames):
+ '''create new sprite in random location that does not overlap other sprites'''
+ self.num = len(sprites)
+ self.bitmaps = bitmaps
+ self.frames = frames
+ self.steps = len(frames)
+ self.col, self.row = random_start(tft, sprites, bitmaps, self.num)
+ self.width = bitmaps.WIDTH
+ self.height = bitmaps.HEIGHT
+ self.last_col = self.col
+ self.last_row = self.row
+ self.step = random.randint(0, self.steps)
+ self.dir_col = -random.randint(2, 5)
+ self.dir_row = 2
+ self.prev_dir_col = self.dir_col
+ self.prev_dir_row = self.dir_row
+ self.iceberg = 0
+
+ def clear(self):
+ '''clear above and behind sprite'''
+ tft.fill_rect(
+ self.col, self.row-1, self.width, self.dir_row+1,
+ st7789.BLACK)
+
+ tft.fill_rect(
+ self.col+self.width+self.dir_col, self.row,
+ -self.dir_col, self.height, st7789.BLACK)
+
+ def erase(self):
+ '''erase last postion of sprite'''
+ tft.fill_rect(
+ self.last_col, self.last_row, self.width, self.height, st7789.BLACK)
+
+ def move(self, sprites):
+ '''step frame and move sprite'''
+
+ if self.steps:
+ self.step = (self.step + 1) % self.steps
+
+ self.last_col = self.col
+ self.last_row = self.row
+ new_col = self.col + self.dir_col
+ new_row = self.row + self.dir_row
+
+ # if new location collides with another sprite, change direction for 32 frames
+
+ for sprite in sprites:
+ if (
+ self.num != sprite.num
+ and collide(
+ new_col, new_row, self.width, self.height,
+ sprite.col, sprite.row, sprite.width, sprite.height,
+ )
+ and (self.col > sprite.col)):
+
+ self.iceberg = 32
+ self.dir_col = -1
+ self.dir_row = 3
+ new_col = self.col + self.dir_col
+ new_row = self.row + self.dir_row
+
+ self.col = new_col
+ self.row = new_row
+
+ # if new location touches edge of screen, erase then set new start location
+ if self.col <= 0 or self.row > tft.height() - self.height:
+ self.erase()
+ self.dir_col = -random.randint(2, 5)
+ self.dir_row = 2
+ self.col, self.row = random_start(tft, sprites, self.bitmaps, self.num)
+
+ # Track post collision direction change
+ if self.iceberg:
+ self.iceberg -= 1
+ if self.iceberg == 1:
+ self.dir_col = self.prev_dir_col
+ self.dir_row = self.prev_dir_row
+
+ def draw(self):
+ '''if the location is not 0,0 draw current frame of sprite at it's location'''
+ if self.col and self.row:
+ tft.bitmap(self.bitmaps, self.col, self.row, self.frames[self.step])
+
+ # configure spi interface
+ spi = SPI(1, baudrate=31250000, sck=Pin(18), mosi=Pin(19))
+
+ # configure display
+ tft = st7789.ST7789(
+ spi,
+ 240,
+ 320,
+ reset=Pin(4, Pin.OUT),
+ cs=Pin(13, Pin.OUT),
+ dc=Pin(12, Pin.OUT),
+ backlight=Pin(15, Pin.OUT),
+ rotation=1,
+ buffer_size=64*62*2)
+
+ # init and clear screen
+ tft.init()
+ tft.fill(st7789.BLACK)
+
+ # create toast spites and set animation frames
+ sprites = []
+ sprites.append(Toast(sprites, toast_bitmaps, TOAST_FRAMES))
+ sprites.append(Toast(sprites, toast_bitmaps, TOASTER_FRAMES))
+ sprites.append(Toast(sprites, toast_bitmaps, TOASTER_FRAMES))
+
+ # move and draw sprites
+
+ while True:
+ for sprite in sprites:
+ sprite.clear()
+ sprite.move(sprites)
+ sprite.draw()
+
+ gc.collect()
+ time.sleep(0.01)
+
+main()
diff --git a/sphinx/Makefile b/sphinx/Makefile
index 85b43a1..17ece03 100644
--- a/sphinx/Makefile
+++ b/sphinx/Makefile
@@ -19,8 +19,7 @@ help:
@$(SPHINXBUILD) -M $@ "$(SOURCEDIR)" "$(BUILDDIR)" $(SPHINXOPTS) $(O)
update:
- # Update documentation on my webserver using rsync over ssh
+ # Update documentation on my webserver using rsync over ssh
# /usr/bin/rsync --progress --delete -e 'ssh -i ~/.ssh/id_rsa' -avz build/html/ penfold.owt.com:/htdocs/st7789py/
# update docs directory of this repo using rsync
/usr/bin/rsync --progress --delete -avz build/html/ ../docs/
-
\ No newline at end of file
diff --git a/sphinx/requires.txt b/sphinx/requires.txt
index d5b9a8e..a77fc8b 100644
--- a/sphinx/requires.txt
+++ b/sphinx/requires.txt
@@ -1,4 +1,5 @@
# additional sphinx plug-ins, install using pip3
+sphinx
sphinx-prompt
sphinxcontrib.napoleon
sphinxcontrib.napoleon
diff --git a/sphinx/source/examples.rst b/sphinx/source/examples.rst
index 49461bf..eb5d4cb 100644
--- a/sphinx/source/examples.rst
+++ b/sphinx/source/examples.rst
@@ -1,39 +1,109 @@
+****************
Example Programs
-================
+****************
+
+320x240 Example Programs
+========================
+
+These examples run on a ESP32 board with a 320x240 display. They are were tested using a SparkFun
+ESP32 Thing and a Waveshare 2 inch LCD ST7789 Module. You may need to modify the pin use for your
+device.
+
+320x240 lines.py
+----------------
+
+.. literalinclude:: ../../examples/esp32_320x240/lines.py
+ :linenos:
+ :language: python
+
+
+320x240 hello.py
+-----------------
+
+.. literalinclude:: ../../examples/esp32_320x240/hello.py
+ :linenos:
+ :language: python
+
+
+320x240 feathers.py
+-------------------
+
+.. literalinclude:: ../../examples/esp32_320x240/feathers.py
+ :linenos:
+ :language: python
+
+320x240 fonts.py
+----------------
+
+.. literalinclude:: ../../examples/esp32_320x240/fonts.py
+ :linenos:
+ :language: python
+
+
+
+320x240 scroll.py
+-----------------
+
+.. literalinclude:: ../../examples/esp32_320x240/scroll.py
+ :linenos:
+ :language: python
+
+
+320x240 toasters.py
+-------------------
+
+Flying toasters sprite demo using bitmaps created from spritesheet using the sprites2bitmap.py
+utility. See the maketoast shell script for the command line used to create the toast_bitmaps.py from the
+toasters.bmp image.
+
+.. literalinclude:: ../../examples/esp32_320x240/toasters/toasters.py
+ :linenos:
+ :language: python
+
+
+135x240 TTGO T-Display Example Programs
+=======================================
These examples run on the LilyGo TTGO-T-Display available from the usual
locations. See https://github.com/Xinyuan-LilyGO/TTGO-T-Display for more
information.
-ttgo_lines.py
--------------
+lines.py
+--------
-.. literalinclude:: ../../examples/ttgo_lines.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/lines.py
:linenos:
:language: python
-ttgo_hello.py
--------------
+hello.py
+--------
-.. literalinclude:: ../../examples/ttgo_hello.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/hello.py
+ :linenos:
+ :language: python
+
+feathers.py
+-----------
+
+.. literalinclude:: ../../examples/ttgo_tdisplay/feathers.py
:linenos:
:language: python
-ttgo_fonts.py
--------------
+fonts.py
+--------
-.. literalinclude:: ../../examples/ttgo_fonts.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/fonts.py
:linenos:
:language: python
-ttgo_scroll.py
---------------
+scroll.py
+---------
-.. literalinclude:: ../../examples/ttgo_scroll.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/scroll.py
:linenos:
:language: python
@@ -41,10 +111,11 @@ ttgo_scroll.py
toasters.py
-----------
-Flying toasters sprite demo using bitmaps created from spritesheet using
-ImageMagick's convert and imgtobitmap.py utility. See the maketoast script in the utils directory for details.
+Flying toasters sprite demo using bitmaps created from spritesheet using the imgtobitmap.py utility.
+See the maketoast script in the utils directory for details. See the 320x240 toasters example for
+a more advanced example that uses the sprites2bitmap utility and indexed bitmaps.
-.. literalinclude:: ../../examples/toasters/toasters.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/toasters/toasters.py
:linenos:
:language: python
@@ -55,7 +126,7 @@ chango.py
Test for font2bitmap converter for the driver.
See the font2bitmap program in the utils directory.
-.. literalinclude:: ../../examples/truetype/chango.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/truetype/chango.py
:linenos:
:language: python
@@ -66,7 +137,7 @@ noto_fonts.py
Test for font2bitmap converter for the driver.
See the font2bitmap program in the utils directory.
-.. literalinclude:: ../../examples/truetype/noto_fonts.py
+.. literalinclude:: ../../examples/ttgo_tdisplay/truetype/noto_fonts.py
:linenos:
:language: python
diff --git a/utils/sprites2bitmap.py b/utils/sprites2bitmap.py
new file mode 100755
index 0000000..0f5a20e
--- /dev/null
+++ b/utils/sprites2bitmap.py
@@ -0,0 +1,123 @@
+#!/usr/bin/env python3
+
+'''
+ Convert a sprite sheet image to python a module for use with indexed bitmap method.
+ Sprite sheet width and height should be a multiple of sprite width and height. There
+ should be no extra pixels between sprites. All sprites will share the same palette.
+
+ Usage:
+ sprites2bitmap image_file spite_width sprite_height bits_per_pixel >sprites.py
+
+ MicroPython:
+ import sprites
+ ... tft config and init code ...
+ tft.bitmap(sprites, x, y, index)
+
+'''
+
+from os import setpriority
+from PIL import Image
+import argparse
+
+def main():
+
+ parser = argparse.ArgumentParser(
+ prog='imgtobitmap',
+ description='Convert image file to python module for use with bitmap method.')
+
+ parser.add_argument(
+ 'image_file',
+ help='Name of file containing image to convert')
+
+ parser.add_argument(
+ 'sprite_width',
+ type=int,
+ help='width of sprites in pixels')
+
+ parser.add_argument(
+ 'sprite_height',
+ type=int,
+ help='height of sprites in pixels')
+
+ parser.add_argument(
+ 'bits_per_pixel',
+ type=int,
+ choices=range(1, 9),
+ default=1,
+ metavar='bits_per_pixel',
+ help='The number of bits to use per pixel (1..8)')
+
+ args = parser.parse_args()
+
+ bits = args.bits_per_pixel
+ img = Image.open(args.image_file)
+ img = img.convert("P", palette=Image.ADAPTIVE, colors=2**bits)
+ palette = img.getpalette() # Make copy of palette colors
+
+ # For all the colors in the palette
+ colors = []
+ for color in range(1 << bits):
+
+ # get rgb values and convert to 565
+ color565 = (
+ ((palette[color*3] & 0xF8) << 8) |
+ ((palette[color*3+1] & 0xFC) << 3) |
+ ((palette[color*3+2] & 0xF8) >> 3))
+
+ # swap bytes in 565
+ color = ((color565 & 0xff) << 8) + ((color565 & 0xff00) >> 8)
+
+ # append byte swapped 565 color to colors
+ colors.append(f'{color:04x}')
+
+ image_bitstring = ''
+ max_colors = 1 << bits
+ bitmaps = 0
+ # Run through the image and create a string with the ascii binary
+ # representation of the color of each pixel.
+ for y in range(0, img.height, args.sprite_height):
+ for x in range(0, img.width, args.sprite_width):
+ bitmaps += 1
+ for yy in range(y, y + args.sprite_height):
+ for xx in range(x, x + args.sprite_width):
+ pixel = img.getpixel((xx, yy))
+ color = pixel
+ image_bitstring += ''.join(
+ '1' if (color & (1 << bit - 1)) else '0' for bit in range(bits, 0, -1))
+
+ bitmap_bits = len(image_bitstring)
+
+ # Create python source with image parameters
+ print(f'BITMAPS = {bitmaps}')
+ print(f'HEIGHT = {args.sprite_height}')
+ print(f'WIDTH = {args.sprite_width}')
+ print(f'COLORS = {max_colors}')
+ print(f'BITS = {bitmap_bits}')
+ print(f'BPP = {bits}')
+ print('PALETTE = [', sep='', end='')
+
+ for color, rgb in enumerate(colors):
+ if color:
+ print(',', sep='', end='')
+ print(f'0x{rgb}', sep='', end='')
+ print("]")
+
+ # Run though image bit string 8 bits at a time
+ # and create python array source for memoryview
+
+ print("_bitmap =\\", sep='')
+ print("b'", sep='', end='')
+
+ for i in range(0, bitmap_bits, 8):
+
+ if i and i % (16*8) == 0:
+ print("'\\\nb'", end='', sep='')
+
+ value = image_bitstring[i:i+8]
+ color = int(value, 2)
+ print(f'\\x{color:02x}', sep='', end='')
+
+ print("'\nBITMAP = memoryview(_bitmap)")
+
+
+main()