├── 01_blinky └── main.go ├── 02_gpio └── main.go ├── 03_usbcdc └── main.go ├── 04_systick └── main.go ├── 05_buzzer └── main.go ├── 06_light_sensor └── main.go ├── 07_lis3dh └── main.go ├── 08_spi_ili9341 ├── graphics.go ├── main.go └── tinygo-logo.png ├── 09_webclient ├── main.go └── wioterminal.go ├── 10_webserver ├── main.go └── wioterminal.go ├── 11_spi_ili9341 ├── graphics.go ├── main.go ├── tinygo-logo-eye-closed.png └── tinygo-logo-eye.png ├── LICENSE.txt ├── README.md ├── go.mod ├── go.sum └── images ├── 01.png ├── 02.png ├── 03.png ├── 04.png ├── 05.png ├── 06.png ├── 07.png ├── 08.png ├── 09.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png └── 15.png /01_blinky/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "machine" 6 | "time" 7 | 8 | "tinygo.org/x/drivers/buzzer" 9 | ) 10 | 11 | type note struct { 12 | tone float64 13 | duration float64 14 | } 15 | 16 | func main() { 17 | //led := machine.LED 18 | led := machine.LCD_BACKLIGHT 19 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 20 | cnt := 0 21 | 22 | bzrPin := machine.WIO_BUZZER 23 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) 24 | bzr := buzzer.New(bzrPin) 25 | 26 | notes := []note{ 27 | {buzzer.C3, buzzer.Quarter}, 28 | {buzzer.D3, buzzer.Quarter}, 29 | {buzzer.E3, buzzer.Quarter}, 30 | } 31 | 32 | for { 33 | cnt++ 34 | fmt.Printf("cnt %d\r\n", cnt) 35 | led.Low() 36 | time.Sleep(time.Millisecond * 500) 37 | 38 | led.High() 39 | time.Sleep(time.Millisecond * 500) 40 | 41 | for _, n := range notes { 42 | bzr.Tone(n.tone, n.duration) 43 | time.Sleep(10 * time.Millisecond) 44 | } 45 | } 46 | } 47 | -------------------------------------------------------------------------------- /02_gpio/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "machine" 6 | "time" 7 | ) 8 | 9 | const ( 10 | led = machine.LCD_BACKLIGHT 11 | ) 12 | 13 | func main() { 14 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 15 | 16 | machine.WIO_KEY_A.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 17 | machine.WIO_KEY_B.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 18 | machine.WIO_KEY_C.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 19 | 20 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 21 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 22 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 23 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 24 | machine.WIO_5S_PRESS.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 25 | 26 | for { 27 | if !machine.WIO_KEY_A.Get() { 28 | led.Low() 29 | fmt.Printf("machine.WIO_KEY_A pressed\r\n") 30 | } else if !machine.WIO_KEY_B.Get() { 31 | led.Low() 32 | fmt.Printf("machine.WIO_KEY_B pressed\r\n") 33 | } else if !machine.WIO_KEY_C.Get() { 34 | led.Low() 35 | fmt.Printf("machine.WIO_KEY_C pressed\r\n") 36 | } else if !machine.WIO_5S_UP.Get() { 37 | led.Low() 38 | fmt.Printf("machine.WIO_5S_UP pressed\r\n") 39 | } else if !machine.WIO_5S_LEFT.Get() { 40 | led.Low() 41 | fmt.Printf("machine.WIO_5S_LEFT pressed\r\n") 42 | } else if !machine.WIO_5S_RIGHT.Get() { 43 | led.Low() 44 | fmt.Printf("machine.WIO_5S_RIGHT pressed\r\n") 45 | } else if !machine.WIO_5S_DOWN.Get() { 46 | led.Low() 47 | fmt.Printf("machine.WIO_5S_DOWN pressed\r\n") 48 | } else if !machine.WIO_5S_PRESS.Get() { 49 | led.Low() 50 | fmt.Printf("machine.WIO_5S_PRESS pressed\r\n") 51 | } else { 52 | led.High() 53 | } 54 | 55 | time.Sleep(time.Millisecond * 10) 56 | } 57 | } 58 | -------------------------------------------------------------------------------- /03_usbcdc/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "machine" 5 | "time" 6 | ) 7 | 8 | func main() { 9 | led := machine.LCD_BACKLIGHT 10 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 11 | led.High() 12 | 13 | usbcdc := machine.Serial 14 | usbcdc.Configure(machine.UARTConfig{}) 15 | 16 | input := make([]byte, 64) 17 | i := 0 18 | for { 19 | if usbcdc.Buffered() > 0 { 20 | data, _ := usbcdc.ReadByte() 21 | 22 | switch data { 23 | case 13: 24 | // return key 25 | usbcdc.Write([]byte("\r\n")) 26 | 27 | switch string(input[:i]) { 28 | case "on": 29 | led.High() 30 | case "off": 31 | led.Low() 32 | case "toggle", "t": 33 | led.Toggle() 34 | } 35 | i = 0 36 | default: 37 | // just echo the character 38 | usbcdc.WriteByte(data) 39 | input[i] = data 40 | i++ 41 | } 42 | } 43 | time.Sleep(10 * time.Millisecond) 44 | } 45 | } 46 | -------------------------------------------------------------------------------- /04_systick/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "device/arm" 5 | "machine" 6 | ) 7 | 8 | var timerCh = make(chan struct{}, 1) 9 | 10 | func main() { 11 | //led := machine.LED 12 | led := machine.LCD_BACKLIGHT 13 | 14 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 15 | 16 | // timer fires 10 times per second 17 | arm.SetupSystemTimer(machine.CPUFrequency() / 10) 18 | 19 | for { 20 | led.Low() 21 | <-timerCh 22 | led.High() 23 | <-timerCh 24 | } 25 | } 26 | 27 | //export SysTick_Handler 28 | func timer_isr() { 29 | select { 30 | case timerCh <- struct{}{}: 31 | default: 32 | // The consumer is running behind. 33 | } 34 | } 35 | -------------------------------------------------------------------------------- /05_buzzer/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "machine" 5 | "time" 6 | 7 | "tinygo.org/x/drivers/buzzer" 8 | ) 9 | 10 | type note struct { 11 | tone float64 12 | duration float64 13 | } 14 | 15 | func main() { 16 | bzrPin := machine.WIO_BUZZER 17 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) 18 | bzr := buzzer.New(bzrPin) 19 | 20 | notes := []note{ 21 | {buzzer.C3, buzzer.Quarter}, 22 | {buzzer.Rest, buzzer.Eighth}, 23 | {buzzer.D3, buzzer.Eighth}, 24 | {buzzer.E3, buzzer.Quarter}, 25 | {buzzer.Rest, buzzer.Eighth}, 26 | {buzzer.C3, buzzer.Eighth}, 27 | {buzzer.E3, buzzer.Quarter}, 28 | {buzzer.C3, buzzer.Quarter}, 29 | {buzzer.E3, buzzer.Half}, 30 | } 31 | 32 | for _, n := range notes { 33 | bzr.Tone(n.tone, n.duration) 34 | time.Sleep(10 * time.Millisecond) 35 | } 36 | 37 | for { 38 | time.Sleep(time.Hour) 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /06_light_sensor/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "machine" 6 | "time" 7 | ) 8 | 9 | func main() { 10 | machine.InitADC() 11 | 12 | led := machine.LCD_BACKLIGHT 13 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 14 | 15 | sensor := machine.ADC{Pin: machine.WIO_LIGHT} 16 | sensor.Configure(machine.ADCConfig{}) 17 | 18 | for { 19 | val := sensor.Get() 20 | fmt.Printf("%04X\r\n", val) 21 | if val < 0x8000 { 22 | led.Low() 23 | } else { 24 | led.High() 25 | } 26 | time.Sleep(time.Millisecond * 100) 27 | } 28 | } 29 | -------------------------------------------------------------------------------- /07_lis3dh/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "machine" 5 | "time" 6 | 7 | "tinygo.org/x/drivers/lis3dh" 8 | ) 9 | 10 | var i2c = machine.I2C1 11 | 12 | func main() { 13 | i2c.Configure(machine.I2CConfig{SCL: machine.SCL1_PIN, SDA: machine.SDA1_PIN}) 14 | 15 | accel := lis3dh.New(i2c) 16 | accel.Address = lis3dh.Address0 // address on the Wio Terminal 17 | accel.Configure() 18 | accel.SetRange(lis3dh.RANGE_2_G) 19 | 20 | println(accel.Connected()) 21 | 22 | for { 23 | x, y, z, _ := accel.ReadAcceleration() 24 | println("X:", x, "Y:", y, "Z:", z) 25 | 26 | //rx, ry, rz := accel.ReadRawAcceleration() 27 | //println("X (raw):", rx, "Y (raw):", ry, "Z (raw):", rz) 28 | 29 | time.Sleep(time.Millisecond * 100) 30 | } 31 | } 32 | -------------------------------------------------------------------------------- /08_spi_ili9341/graphics.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | const tinygo_logo_s_png = "" + 4 | "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x96\x00\x00\x00\x80\x08\x02\x00\x00\x00\x66\xEC\x07" + 5 | "\x33\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x14\xEA\x00\x00\x14\xEA\x01\x71\x95\x86\x57\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9C" + 6 | "\xED\x7D\x67\x60\x1B\x55\xBA\xF6\x9C\x69\x1A\x55\x4B\xB2\x2D\xC9\xB6\x5C\x54\x5C\x52\x9D\xD8\x71\x48\x2F\x90\x04\x36\xA1\x87\x40" + 7 | "\x20\x4B\x08\xB0\x0B\xF7\x2E\xB0\x2C\xB0\x2C\x7B\x77\x3F\x60\xD9\xA5\x6D\xB8\x6C\x96\x5E\x42\x0D\x2D\x37\x6C\x42\x48\x61\x37\xBD" + 8 | "\xC7\x09\x24\x26\xD5\xBD\xC9\xB6\x5C\xE4\x22\x59\xD5\x23\xCD\xCC\xF9\x7E\x9C\x44\x08\xB9\xC9\x2A\x4E\xB6\x3C\x3F\x12\x4B\x33\x73" + 9 | "\xE6\x68\xDE\x39\xE7\xBC\xE5\x79\xDF\x03\xB0\xD8\x00\x00\x20\x49\x92\x20\x08\x00\x40\x8C\x4D\x8D\x14\x10\x42\xBF\xDF\x2F\x08\x42" + 10 | "\x8C\xED\x00\x00\x44\x22\xD1\x25\xE9\x3F\xCF\xF3\x1C\xC7\x41\x08\x63\x69\x87\x8C\xFA\x4A\x86\x61\xB4\x5A\xAD\x52\xA9\x24\xC9\xE8" + 11 | "\x1B\x89\x05\x10\xC2\x9A\x9A\x1A\x97\xCB\x15\x63\x3B\x32\x99\x2C\x37\x37\x77\xF4\x45\x88\xC0\x71\x5C\x6F\x6F\x6F\x47\x47\x87\xCF" + 12 | "\xE7\x8B\xAE\x05\x22\xBA\xCB\x94\x4A\xA5\xD9\x6C\x96\xC9\x64\x38\x8E\x47\xD7\x42\xEC\x00\x00\x08\x82\xD0\xDB\xDB\x1B\x63\x3B\x3A" + 13 | "\x9D\x4E\x2A\x95\xC6\xA5\x4B\x51\x00\xC7\x71\x89\x44\xA2\x56\xAB\x7D\x3E\x1F\xCB\xB2\xD1\xB4\x10\xC5\x35\x24\x49\x66\x65\x65\x11" + 14 | "\x44\x94\xE2\x8F\x23\x54\x2A\x55\x8C\x4F\x5F\x2A\x95\xAA\x54\xAA\x78\xF5\x27\x6A\x10\x04\x91\x93\x93\x13\xDD\x7C\x16\x8D\x08\xA5" + 15 | "\x52\xE9\xA5\x9A\x3C\xC3\x40\x92\x64\x76\x76\x36\x4D\xD3\xD1\x5D\x4E\xD3\x74\x56\x56\xD6\x65\xF2\x5B\x08\x82\x88\xEE\x75\x8C\x46" + 16 | "\x84\x97\x6A\xD9\x18\x10\x62\xB1\xD8\x6C\x36\x8B\xC5\xE2\x28\x2E\x34\x99\x4C\x12\x89\x24\x11\xBD\x8A\x0E\xD1\xAD\x4A\xC3\xBF\x80" + 17 | "\xA8\xDD\x50\xAD\xE9\xB2\x12\x21\x86\x61\x62\xB1\x38\x3F\x3F\xBF\xA3\xA3\xC3\x66\xB3\xF1\x3C\x3F\xEC\xF9\x04\x41\x68\x34\x1A\xAD" + 18 | "\x56\x7B\x39\xAC\x05\x61\x08\x7D\xB6\xE8\xEF\x61\x55\xEE\x81\x85\x41\x10\x84\x58\x2C\xCE\xCD\xCD\xCD\xCE\xCE\xCE\xC9\xC9\x31\x18" + 19 | "\x0C\x0C\xC3\xA0\x43\x95\x95\x95\x9F\x7E\xFA\x69\x66\x66\xE6\xE5\x26\x48\x0C\xC3\x78\x9E\xB7\xDB\xED\x76\xBB\xDD\xE3\xF1\x20\x59" + 20 | "\xA2\x4E\xA2\xF7\x0F\xCD\x54\x6A\xB5\x5A\xA9\x54\x5E\x86\xC2\x83\x10\x36\x37\x37\xAF\x58\xB1\x62\xCC\x98\x31\xE8\x9B\x40\x20\x60" + 21 | "\xB1\x58\xEA\xEA\xEA\x9A\x9B\x9B\xAB\xAB\xAB\xDD\x6E\xF7\x80\x2F\x28\x49\x10\x04\xFA\x3D\x00\x80\xCC\xCC\x4C\xB3\xD9\x9C\x9E\x9E" + 22 | "\x6E\x32\x99\x52\x52\x52\x62\xEC\x50\x2C\x97\x47\x07\x1C\xC7\x93\x93\x93\x93\x93\x93\x21\x84\x2C\xCB\x06\x02\x01\xF4\x9B\x09\x82" + 23 | "\xA0\x69\x9A\xA6\xE9\xE0\x6B\x77\x49\xBA\x37\xD2\x97\x9E\xA2\x28\xB3\xD9\x6C\x36\x9B\xD1\xC7\xDE\xDE\xDE\xBA\xBA\x3A\x8B\xC5\x52" + 24 | "\x5B\x5B\xDB\xDC\xDC\x8C\x5D\xB4\x2C\xC9\xCC\xCC\xCC\xBB\xEF\xBE\x1B\x00\xA0\x56\xAB\x29\x8A\x8A\xB1\x97\x2C\xCB\x7A\xBD\x5E\x86" + 25 | "\x61\xD2\xD3\xD3\xE5\x72\xF9\x65\xF8\xB2\x5F\x12\xF0\x3C\xEF\x72\xB9\x5A\x5B\x5B\xFB\xFA\xFA\x24\x12\x89\x48\x24\x8A\xA2\x91\xA4" + 26 | "\xA4\xA4\xA2\xA2\xA2\xA2\xA2\x22\x0C\xC3\x02\x81\x80\xCD\x66\x13\x04\xE1\xB3\xCF\x3E\x23\x69\x9A\xD6\xE9\x74\xB1\xF7\xB2\xAF\xAF" + 27 | "\x8F\xE3\xB8\x45\x8B\x16\x2D\x5C\xB8\x30\x2D\x2D\xED\x32\x9C\x66\x2F\x39\x20\x84\xED\xED\xED\xBB\x76\xED\xDA\xB1\x63\x07\x45\x51" + 28 | "\xD1\x09\x12\x81\xA2\xA8\x8C\x8C\x0C\x0C\xC3\x44\x22\x51\x7C\x0C\x73\x87\xC3\x61\x34\x1A\xDF\x7A\xEB\xAD\xBB\xEE\xBA\x2B\x3D\x3D" + 29 | "\xFD\x3F\xF2\x1B\x10\x00\x80\xB4\xB4\xB4\x95\x2B\x57\xBE\xF5\xD6\x5B\x06\x83\xC1\xE1\x70\xC4\xA5\xD9\x38\x88\xD0\xE3\xF1\x14\x14" + 30 | "\x14\xFC\xEE\x77\xBF\x53\x28\x14\xB1\xB7\xF6\xEF\x00\x85\x42\xF1\xFB\xDF\xFF\xBE\xA0\xA0\xC0\xE3\xF1\xC4\xDE\x1A\x8E\x9C\xC5\x7E" + 31 | "\xBF\x3F\xEA\x15\xDE\xE5\x72\x3D\xF0\xC0\x03\xB1\xAF\xA3\xFF\x56\x20\x49\xF2\xC1\x07\x1F\x74\x3A\x9D\xD1\x5D\x0E\x21\x0C\x04\x02" + 32 | "\xC8\xCB\x4F\xD6\xD6\xD6\x3E\xFC\xF0\xC3\x18\x86\x29\x14\x8A\xFC\xFC\x7C\xBD\x5E\x6F\x34\x1A\xB3\xB3\xB3\x23\x14\x09\xCF\xF3\x06" + 33 | "\x83\x41\xA9\x54\x46\xD7\x95\x7F\x67\x28\x95\x4A\xA3\xD1\xE8\x76\xBB\x23\x54\xFA\x78\x9E\x6F\x69\x69\xA9\xAD\xAD\x6D\x6A\x6A\xAA" + 34 | "\xAA\xAA\x42\xCE\x61\x08\x21\x09\x21\x44\xE3\xCF\xE1\x70\x1C\x3F\x7E\xFC\xF8\xF1\xE3\x38\x8E\x03\x00\x32\x32\x32\x72\x73\x73\x33" + 35 | "\x33\x33\x73\x73\x73\x87\x30\x30\x78\x9E\x17\x8B\xC5\x97\xD0\xD9\xFD\xCF\x0B\xE4\xE0\xEE\xED\xED\x1D\x42\x84\x0E\x87\xA3\xBE\xBE" + 36 | "\xBE\xB1\xB1\xB1\xB1\xB1\xB1\xBE\xBE\x9E\xE7\xF9\xFE\x96\xFE\x00\xDE\x19\x74\x52\x53\x53\x53\x53\x53\x13\xBA\x93\x48\x24\x0A\x0E" + 37 | "\x4A\x8E\xE3\x62\x51\xA5\xFE\x83\x21\xC0\x71\xDC\xBB\xEF\xBE\x1B\xF4\xD9\x72\x1C\xC7\xB2\xEC\xB0\xFE\xA6\xE1\x1D\x6C\x82\x20\xF8" + 38 | "\x7C\xBE\xD0\x68\x56\xD4\x6E\xE5\xFF\x60\x58\x78\xBD\xDE\x91\x5E\x32\x94\x08\x71\x1C\x27\x08\x42\xAD\x56\xE7\xE5\xE5\x05\x47\x9E" + 39 | "\xDD\x6E\x6F\x6C\x6C\x8C\xAE\x7F\xFF\xC1\xD0\xC0\x71\xBC\xB8\xB8\x38\x18\xFC\x62\x59\xB6\xA6\xA6\xA6\xA7\xA7\x87\xE3\xB8\x21\x3C" + 40 | "\xA5\xE1\x22\x44\x2C\x0A\x93\xC9\x64\x30\x18\xB2\xB3\xB3\x8D\x46\xA3\x5C\x2E\x0F\x3D\xA1\xB2\xB2\x12\x4D\xB0\x97\x09\xD0\x42\x0E" + 41 | "\x21\xE4\x38\xCE\xED\x76\xDB\x6C\xB6\xDE\xDE\x5E\x9F\xCF\xEB\xF3\xF9\x58\xB6\x2F\x10\xE0\x20\x84\x24\x49\x8A\xC5\x0C\xC3\x88\xA5" + 42 | "\x52\x99\x5C\x2E\x4B\x4A\x52\x2A\x95\x4A\x91\x48\x84\x96\xF0\xCB\xC7\x8A\xC5\x71\x7C\xF6\xEC\xD9\x41\x1F\x29\x82\xC7\xE3\xB1\x58" + 43 | "\x2C\x8D\x8D\x8D\x16\x8B\xA5\xAA\xAA\x2A\x10\x08\x70\x1C\x17\x7A\x02\x29\x12\x89\x90\xCF\x3E\x2B\x2B\x4B\xAF\xD7\x9B\xCD\xE6\xC4" + 44 | "\xF9\x56\x78\x9E\xB7\xD9\x6C\x76\xBB\x9D\x61\x44\x3A\x5D\x9A\x58\x2C\x8E\xE2\x46\xC8\x31\x68\xB3\x75\x34\x36\x36\xB6\xB6\xB6\xB6" + 45 | "\xB5\xB5\xD9\x6C\x1D\x5D\x5D\xDD\x0E\x87\xBD\xAF\xAF\x2F\xE4\x44\x80\x81\x1F\xBC\xF8\x48\xD0\xC1\x63\x04\x41\x24\x25\x25\x69\x34" + 46 | "\xDA\x8C\x8C\xF4\xAC\xAC\x6C\xA3\xD1\x94\x93\x93\x23\x95\x4A\x2F\x1F\x71\x06\x21\x95\x4A\xC7\x8E\x1D\x3B\x76\xEC\x58\x0C\xC3\x20" + 47 | "\x84\x6D\x6D\x6D\xB5\xB5\xB5\x56\xAB\xD5\x62\xB1\xA0\xE7\x49\x66\x67\x67\x3F\xF6\xD8\x63\x89\xEE\x87\x20\x08\xBB\x77\xEF\xDA\xBC" + 48 | "\xF9\xAB\xF6\xF6\x76\x34\x6E\x44\x22\x51\x71\xF1\x94\x5B\x6E\x59\x66\x30\x18\x22\x6C\xA1\xBD\xBD\xFD\xD4\xA9\xB2\x33\x67\xCE\x56" + 49 | "\x55\x55\x5E\x74\x6D\x5C\x78\xE6\x22\x46\xAC\x4C\xD1\xA9\x53\x75\xA9\xBA\x0C\xB9\x52\x25\x62\x24\x22\x11\x43\x50\x14\xD2\xAE\x05" + 50 | "\x9E\xE7\xB8\x00\xCB\xF6\xF5\x79\x3D\x1E\xB7\xD3\xE5\xB0\xF7\xF6\x74\x76\xDB\xDA\xAA\x6B\xAA\xAB\x2A\x2B\x90\x60\x51\xF4\x78\xDC" + 51 | "\xB8\xF1\x85\x85\x85\x63\xC6\x8C\x1D\x69\x00\xD2\xEF\xF7\xD7\xD7\xD7\x5B\xAD\x56\x9E\xE7\x34\x1A\x4D\x5E\x5E\x7E\x22\x22\x91\x00" + 52 | "\x80\xF4\xF4\xF4\xF4\xF4\xF4\xE0\x37\x6B\xD6\xAC\x19\xA5\x80\xF5\xFA\xF5\x9F\x6F\xDC\xB8\x91\xA2\x99\x09\x53\x66\xAA\x35\x69\x7D" + 53 | "\x3E\x6F\x63\xF5\xB9\xD2\xD2\xA3\x65\x65\x27\xEF\xBC\x73\xE5\xD5\x57\x5F\x33\x98\x62\x0D\x21\x6C\x6A\x6A\x3A\x7A\xF4\xC8\xF1\xE3" + 54 | "\xC7\x9B\x9B\x9B\xD0\x92\xA0\x54\xA7\x14\x4E\x9D\x93\x61\x30\x6B\x33\xB2\xD4\xA9\x5A\x55\x8A\x56\x22\x95\x0F\x78\xF9\x10\x00\x00" + 55 | "\xF8\x59\xB6\xB3\xAD\xA5\xB5\xA9\xBE\xA5\xA1\xC6\x52\x5B\x61\xB1\xD4\xD6\xD5\xD5\x6D\xD9\xF2\xB5\x54\x2A\x9D\x38\xB1\x70\xE6\xCC" + 56 | "\x59\x45\x45\x45\xC3\xCA\x92\x65\xD9\xBF\xFF\xFD\x9B\x6D\xDB\xB6\x76\x77\x77\x07\xBF\x54\x28\x14\xB7\xDC\xB2\x6C\xC9\x92\x6B\x47" + 57 | "\xC1\xDC\x1A\x0D\x11\x56\x54\x54\x6C\xDD\xBA\x4D\x97\x69\xB8\xF7\xB1\x67\x54\x29\xDA\x0B\xDF\x42\x78\xEE\x64\xE9\xA6\x8F\xDF\x78" + 58 | "\xFF\xFD\xF7\xFA\xFA\xFA\x6E\xBC\xF1\xA6\xB0\x5F\xEB\xF1\xB8\x0F\x1D\x3A\xB4\x7B\xF7\xEE\x86\x86\x7A\x41\x10\x28\x9A\xCE\x9F\x38" + 59 | "\x65\xEC\xE4\x69\xF9\x13\x8A\x52\xB4\xE9\x58\xCC\x33\x1E\x84\x90\xA2\xE9\xF4\x6C\x63\x7A\xB6\x71\xCA\xEC\x05\x18\x86\xF9\xD9\xBE" + 60 | "\x86\xEA\xF3\x55\xA7\x4F\x9C\x2F\x2B\x2D\x2D\x3D\x5A\x5A\x7A\x54\x2E\x97\xCF\x9C\x39\x6B\xD1\xA2\x45\x39\x39\x86\x01\xE7\xD8\xCE" + 61 | "\x4E\xDB\x5F\xFE\xF2\x97\xCA\xCA\x0A\x89\x4C\x3E\xFD\xCA\x25\x7A\x43\x2E\x41\x92\xED\xCD\x8D\x27\x8F\xEC\xF9\xE8\xA3\x0F\x7B\x7B" + 62 | "\x7B\x7F\xFA\xD3\x3B\x63\xEC\xE7\xB0\x18\x0D\x11\xEE\xDE\xBD\xCB\xEF\xF7\x2F\x5E\xB6\x4A\x95\xAC\xF9\xE1\x5B\x00\xC6\x4F\x99\x91" + 63 | "\x9E\x6D\xFA\xE0\xE5\xA7\xD6\xAF\xFF\x42\xA3\xD1\xCC\x9A\x35\x1B\xC3\x30\x08\x61\x57\x57\xE7\xF6\xED\xDB\xF7\xEE\xDD\xEB\x72\xBB" + 64 | "\x68\x11\x33\xBE\x78\xC6\xA4\xE9\xF3\x0A\x0A\xA7\x30\xE2\xC4\xF2\xCC\x68\x11\x93\x3F\xA1\x38\x7F\x42\xF1\x75\x2B\xEE\x6B\x6F\x6E" + 65 | "\x3C\x75\xFC\xE0\xF7\x47\xF7\xEE\xD8\xB1\x63\xE7\xCE\x1D\x63\xC7\x8E\xBD\xFE\xFA\x1B\x27\x4F\x9E\x1C\x4A\xB4\xE9\xE8\x68\x7F\xEE" + 66 | "\xB9\x67\x5B\x5B\x5B\x8B\x67\x5E\x75\xDD\x8A\xFB\x14\x4A\x75\xF0\xD0\xBC\x6B\x97\xBD\xFF\xBF\x4F\x6D\xDB\xB6\xB5\xB0\xB0\x70\xC2" + 67 | "\x84\x89\x09\xED\x36\xD9\xD3\xD3\xF3\xCD\x37\xDF\x20\x77\x8C\xC9\x64\x62\x18\x06\xAD\x1F\xF1\xBA\x01\xC7\x71\x15\x15\xE5\xDA\x8C" + 68 | "\x2C\x75\xAA\x0E\x42\x18\x16\x74\x55\xA7\x6A\x57\x3C\xF0\x3F\x6F\xBF\xF0\xC4\xC7\x1F\x7F\x64\x32\x99\x65\x32\xD9\xD6\xAD\x5B\xBF" + 69 | "\xF9\x66\xBB\xD7\xEB\x51\x26\x6B\x96\x2C\xBE\xA5\x64\xCE\x22\x85\x2A\x39\x5E\x9D\x89\x10\x00\x80\xB4\x2C\x43\x5A\x96\x61\xD1\x4D" + 70 | "\x2B\xAA\xCE\x9E\x3C\xBC\x6B\x4B\xC5\xD9\xB2\xF3\xE7\x9F\xCB\xCF\x2F\xB8\xF5\xD6\x5B\x0B\x0B\x27\xE1\x38\xEE\x76\xBB\x5F\x7B\xED" + 71 | "\x35\x6B\x6B\xDB\xAC\x85\x37\xCC\xF9\xC9\xCD\x0A\xA5\x1A\x42\xE8\x75\xBB\xA4\x72\x05\x86\x61\x0A\xA5\xFA\x96\x7B\x7E\xF9\xEA\x1F" + 72 | "\x1E\xDE\xB5\x6B\x57\x1C\x45\x08\x21\x14\x04\xA1\xAF\xAF\x0F\xAD\xBB\x10\xC2\xEE\xEE\x6E\xB2\xAB\xAB\xEB\xEB\xAF\xBF\x46\xFD\x06" + 73 | "\x00\xA4\xA6\xA6\xE6\xE5\xE5\x69\xB5\xDA\xBC\xBC\xBC\xF4\xF4\x74\x82\x20\x62\x9C\xCD\xBD\x5E\xAF\xCF\xE7\xD3\x66\xA5\x63\x38\xE0" + 74 | "\x79\x8E\xC4\x2F\xB8\x05\xAA\xCF\x96\xD5\x55\x9E\x59\x74\xD3\x8A\xB4\xCC\x9C\x05\x37\xDC\xB1\xE5\xD3\xB7\x5F\x7D\xF5\x15\xA7\xB3" + 75 | "\xB7\xB5\xB5\x4D\x9D\xA2\xB9\xE6\xD6\x7B\x4A\xE6\x2C\xA4\x45\x4C\x1C\x7E\x77\x0C\x20\x48\x72\xEC\xE4\x2B\xC6\x4C\x9A\xDA\xD2\x58" + 76 | "\xB3\x77\xCB\x86\x73\x27\x8F\x3C\xF7\xDC\xB3\x53\xA6\x94\xDC\x71\xC7\x1D\x7B\xF7\xEE\x2D\x2F\x3F\x3F\x69\xFA\xBC\xE9\x57\x2D\x61" + 77 | "\xC4\x12\x0C\xC3\x1C\xDD\xB6\xB7\x9E\x7F\xE2\xB1\xE7\xDE\x14\x89\x25\x18\x86\x69\x33\xB2\xB2\x8C\xF9\x95\x95\x15\x1C\xC7\xC5\x42" + 78 | "\x92\x13\x04\x01\x42\x68\xB3\xD9\xAA\xAB\xAB\x9B\x9B\x9B\x6B\x6B\x6B\x6D\x36\x1B\x92\x25\x3A\xE1\x87\xA6\x91\xB3\xB4\xA3\xA3\xA3" + 79 | "\xA3\xA3\x03\xC3\x30\x44\xC8\x30\x18\x0C\x39\x39\x39\x59\x59\x59\x41\xEE\x4C\x73\x73\xF3\x88\x62\x1A\x00\x60\x18\x06\xA0\x00\x31" + 80 | "\x01\xBA\x7A\x1D\x38\x41\x08\x82\x40\x10\x84\xD3\xD1\x5D\x5F\x71\xA6\x7B\xE6\x55\x72\xA5\xDA\x90\x3F\x4E\x99\x9C\x5A\x59\x59\x41" + 81 | "\x8B\x98\xAB\x6E\x58\x7E\xE5\x75\xB7\x89\x25\x97\x8C\x9B\xDB\x1F\x00\x80\x4C\x43\xDE\x5D\x0F\xFF\xDE\x52\x57\xF5\xCD\xFA\x0F\xBE" + 82 | "\xFD\xF6\x78\x59\xD9\x49\x08\x61\x5A\x96\x71\xDE\xE2\x5B\x00\x00\x00\x07\x18\x86\x55\x9F\x2D\x4B\xD1\xA6\x23\xF9\x61\x18\x46\x90" + 83 | "\x94\x5C\xA9\xEE\xE9\x68\xF1\xF9\x7C\x61\xB6\xF5\x60\x80\x10\x36\x34\x34\x04\x3D\x6A\x2C\xCB\x36\x37\x37\x5B\xAD\xD6\xEA\xEA\xEA" + 84 | "\x20\x89\xA4\x3F\x06\x7D\x3B\x78\x9E\xE7\x79\xBE\xAA\xAA\xAA\xAA\xAA\x2A\xEC\xD0\x88\xE2\x12\x12\x89\x54\x2A\x95\x38\x7B\x7B\x02" + 85 | "\x01\x3F\x4E\x10\xE5\x65\xC7\x77\x7D\xFD\xD9\xB8\xA2\xE9\xE6\xB1\x85\x1E\x97\xD3\xEB\x76\x7A\x5C\xBD\x5B\xBF\x78\xAF\xDB\xD6\xA6" + 86 | "\xCB\x34\x2C\xBF\xEF\xD1\x2C\x53\x41\xE4\x8D\x8F\x2E\x40\xB6\xA9\xE0\xBE\xDF\xBE\x70\xFA\xD8\x81\x6D\x5F\xAC\x75\xF4\x74\x11\x24" + 87 | "\xE9\xF3\xB8\x45\x8C\xD8\xE7\xF1\x08\xBC\x50\x76\x74\xDF\xA4\x2B\xE6\x04\xCF\x86\x02\xEF\x67\xFB\x70\x1C\x8F\xDC\x1F\xC9\xF3\x3C" + 88 | "\x9A\x11\x47\x84\x88\x06\x78\xD8\xEA\x38\xA2\x95\x92\x20\x08\xB3\xD9\x7C\xF8\xF0\x11\x8F\xAB\x57\xC4\x88\xC7\x16\x5D\xA1\xD5\x67" + 89 | "\x1D\xD9\xB5\xE5\xEB\x4F\xDF\xF1\xF7\xF9\x1A\xAA\xCB\xBF\x3B\xB8\xB3\xC3\x6A\x29\x99\xBD\xE8\xA6\x55\x0F\x30\xE2\xCB\x88\xD5\x39" + 90 | "\x20\x08\x82\x28\x9A\x79\x65\xEE\xB8\xC9\x9B\x3F\x79\xEB\xFB\x63\xFB\x3F\x7D\xFD\x85\xC5\xB7\xDD\x63\x2C\x18\x5F\x79\xFA\x44\xB7" + 91 | "\xAD\x5D\x6F\xCC\xED\x6A\x6F\x15\x4B\x65\x12\x99\xDC\xCF\xB2\x1D\x2D\x16\x8D\x46\x33\xA2\xA8\x40\xA8\x71\x15\x3A\x5B\x0E\x81\x41" + 92 | "\x45\x18\xC6\x43\x0C\xBE\x4A\x16\x8B\x65\xCF\x9E\x3D\x91\xF7\x09\xC3\xB0\x92\x92\xA9\x47\x8E\x1C\x39\x7B\xE2\xE8\xDC\x6B\x6E\xC2" + 93 | "\x00\x48\xD6\xA4\x5D\xBF\xE2\xFE\xBA\x8A\x33\xDF\xFC\xDF\x07\xDB\xD7\xBF\x8F\x61\x70\xE1\x8D\x2B\x16\xDE\xBC\x82\x24\xFF\x69\x82" + 94 | "\xC6\x72\xA5\x6A\xC5\x2F\x9E\x30\x8F\x2D\xDC\xF2\xD9\x3B\x9B\x3E\x7E\x7D\xDA\x95\x8B\x2B\x4F\x7F\xE7\x76\xD9\xDF\x7A\xEE\x71\x8E" + 95 | "\xE3\x48\x8A\x5E\x7C\xEB\xDD\x29\xBA\x0C\x7B\xB7\x6D\xC1\x95\xF3\x22\x6F\x96\x20\x88\xA5\x4B\x97\xE6\xE4\xE4\xA0\x8F\x7E\xBF\xBF" + 96 | "\xA9\xA9\xC9\x6A\xB5\x56\x55\x55\xB9\x5C\xAE\xE1\x27\x52\x1C\xC7\x71\x1C\x0F\xF2\x10\x73\x73\x73\x53\x53\x53\xFB\x5F\x10\x08\x04" + 97 | "\x46\xAA\xAF\x16\x15\x15\xA7\xA5\xA5\x9D\x3E\x7E\xB0\x70\xEA\x2C\xE5\x45\xBB\x22\xCB\x94\x9F\x9A\xA6\x6F\xAC\x29\x5F\x78\xD3\x4F" + 98 | "\x17\xDE\x78\x87\xC7\xE5\xEC\x6A\xB7\xF6\xDA\xBB\xFB\xBC\x6E\x8E\xE3\x48\x92\x92\xCA\x15\xAA\x14\xAD\x26\x5D\x9F\x68\x5B\x22\x42" + 99 | "\x08\x3C\xEF\x71\x3B\x3D\x2E\x27\x17\xF0\x13\x24\xC9\x88\xA5\x53\x66\x2F\xD0\xE9\xB3\x3F\x79\xFD\x85\xC3\x3B\x36\x8B\xA5\xB2\x45" + 100 | "\x37\xAD\xD0\xE9\x0D\x0A\xA5\x9A\x16\x31\x52\x45\xD2\x86\xB5\x6B\xC4\x62\xF1\x15\x57\x5C\x11\xF9\x2D\x90\xF3\xC5\x64\x32\x05\xBF" + 101 | "\x09\xFA\x4B\x1D\x0E\x47\x4D\x4D\x8D\xC5\x62\xA9\xAF\xAF\xB7\x58\x2C\xC8\xCB\x88\x0E\x91\x5A\xAD\x76\xC1\x82\x05\x38\x8E\xEB\xF5" + 102 | "\x7A\xBD\x5E\x9F\x88\x04\x03\xB1\x58\xBC\x6C\xD9\xAD\xAF\xBD\xF6\xEA\xAE\xCD\x9F\xDF\x70\xE7\x7F\xD1\x34\x03\x21\xDC\xBB\x6D\x83" + 103 | "\xA5\xB6\x42\xA6\x50\x36\xD6\x9C\xFF\xE3\x43\x77\xB8\x5D\xBD\xC8\x8F\x19\x66\x75\x10\x24\xA9\xD3\xE7\x14\x4C\x2C\x99\x3C\x63\x9E" + 104 | "\x4E\x9F\x8D\xE3\xA3\xCA\x6A\xF4\xB3\x6C\x63\xCD\xF9\xF3\x65\xC7\x1A\xAB\xCB\x6D\xAD\xCD\x6C\xDF\x8F\x22\x41\x04\x41\x28\x54\xC9" + 105 | "\x68\xF2\x67\x7D\x5E\x5B\x9B\x75\xDC\xE4\xE9\x8C\x44\x9A\xA4\x4E\xA9\x2D\x3F\x7D\xBE\xAC\x74\x6A\x49\x89\xD1\x68\x1A\xA4\xED\x91" + 106 | "\x41\xA9\x54\x96\x94\x94\x94\x94\x94\x60\x18\xC6\x71\x5C\x4B\x4B\x4B\x4B\x4B\x8B\x20\x08\x7B\xF6\xEC\x21\x93\x92\x92\xE6\xCC\x99" + 107 | "\x33\x6C\x13\x31\x62\xE6\xCC\x59\x65\x65\x27\x0F\x1C\x38\xB0\xFB\xAB\x2F\xAE\xBA\x61\x79\xC5\xA9\x6F\xCF\x7C\x7B\x18\x42\xE8\x76" + 108 | "\x3A\xEA\x2B\xCE\x28\x95\xCA\xB1\x25\x53\xB3\xB2\x32\x53\x53\x35\x72\xB9\x1C\xCD\xA8\x2C\xEB\xB3\x5A\x5B\xCF\x9D\x3B\x57\x5B\x5B" + 109 | "\xB3\xD7\x52\xB7\x6F\xFB\x86\xFC\xF1\x45\x57\xDD\x70\x7B\x4E\xDE\xB8\x51\xF0\x5A\x79\x3D\xAE\x6F\xF7\xEF\x38\xBA\x67\x5B\x57\xBB" + 110 | "\x15\x00\x40\x51\x94\x46\xA3\x49\x4F\x9F\xA0\x52\xA9\x68\x5A\x24\x08\xBC\xCF\xE7\xEB\xEA\xEA\x6A\x6A\xB2\x74\xB6\x75\xA3\x34\xB9" + 111 | "\x13\x87\x76\xF1\x01\xFF\x15\xF3\x17\xFB\x3C\xEE\x6D\x5F\xAC\x65\x44\xA2\x9B\x6F\xBE\x39\x11\x7E\x73\x92\x24\x73\x72\x72\xD0\x7C" + 112 | "\x7B\xF2\xE4\xC9\x51\xF2\x91\xE2\x38\x7E\xEF\xBD\x3F\xB7\xDB\x1D\xA7\xBF\x3B\x54\x5F\x75\xC6\xE3\x76\x01\x0C\xCB\xCD\xCD\xBD\xF2" + 113 | "\xCA\xAB\xAE\xB8\x62\x1A\xA2\xEA\x30\x0C\x23\x12\x89\x44\x22\x11\x4D\xD3\xA1\x93\x81\xCD\x66\xDB\xBD\x7B\xD7\xFA\xF5\x5F\x9C\x3D" + 114 | "\x5B\x56\x7D\xFE\xD4\xD4\x39\x8B\x7E\x72\xEB\x2A\x99\x22\x51\x6C\x1D\x9E\xE7\xCF\x7E\x77\x78\xFB\xFA\xF7\xBB\x6D\x6D\x12\x89\x64" + 115 | "\xFE\xFC\x2B\xE7\xCE\x9D\x57\x58\x58\xA8\x54\x2A\x69\x9A\x96\x48\x24\x88\xCB\x8B\x5E\x23\x8E\xE3\x2C\x16\xCB\x89\x13\xDF\xED\xDB" + 116 | "\xB7\xEF\xE0\xC1\x03\x65\x47\xF7\x9D\x3B\x59\xAA\x49\xCF\x6A\x69\xA8\x5E\xB2\xE4\xDA\xDC\xDC\xFC\x04\x75\x32\x14\xA3\x97\x97\x25" + 117 | "\x95\x4A\x8B\x8B\x8B\xCB\xCB\xCF\x7B\x5C\xCE\x09\x13\x26\xAC\x5C\xB9\x6A\xD2\xA4\x49\x24\x49\x4A\xA5\x52\xB9\x5C\x3E\x44\xE0\x49" + 118 | "\xA3\xD1\xDC\x71\xC7\x8A\xDB\x6E\x5B\xBE\x67\xCF\xEE\x97\x5E\x7A\xA9\x74\xEF\xF6\xC6\x9A\xF2\xDB\xFF\xEB\x37\x7A\x83\x39\xEE\x9D" + 119 | "\xEC\xF3\x7A\xB6\x7E\xB1\xF6\xF8\xBE\x7F\xD0\x34\x75\xF3\xCD\x4B\x6F\xBD\xF5\x36\xAD\x56\x8B\xE3\xB8\x54\x2A\x55\x28\x14\x41\xE3" + 120 | "\x38\x08\x92\x24\x4D\x26\x93\xC9\x64\xBA\xED\xB6\xE5\x5D\x5D\x5D\x1B\x36\xFC\xDF\x07\x1F\x7C\xD0\x5C\x5F\x25\x12\x89\x26\x4E\x4C" + 121 | "\xAC\x5F\x2D\x88\x0B\x59\x4B\x41\x12\x54\x82\xC0\xF3\xFC\xBA\x75\xEB\x3E\xFE\xF8\x23\x86\x61\x1E\x79\xE4\xB1\x97\x5F\x5E\x53\x5C" + 122 | "\x5C\x2C\x97\xCB\xF5\x7A\xBD\x56\xAB\x95\x48\x24\xC1\xFC\x95\xC1\xBA\x41\x10\xC4\xA2\x45\x57\x6F\xDA\xF4\xD5\xAA\x55\x77\x77\xB5" + 123 | "\xB7\xBC\xF7\xBF\xFF\xAF\xAE\xE2\x4C\x7C\x3B\xE9\xEA\xB5\x7F\xFC\xEA\xB3\xA5\x7B\xB6\x9B\xCD\xA6\x35\x6B\x5E\x79\xE8\xA1\x5F\xEA" + 124 | "\x74\x3A\x99\x4C\xA6\xD7\xEB\x35\x1A\x4D\x50\x7E\x48\xD7\xEF\xDF\xCF\x94\x94\x94\x5F\xFC\xE2\x81\x9D\x3B\x77\xAD\x5C\x79\x17\xCF" + 125 | "\xF3\x7F\xF9\xCB\xCB\xBB\x77\xEF\x4E\xD0\x53\x85\x21\x20\x1B\x1A\x1A\x9E\x7A\xEA\x29\x1C\xC7\xB3\xB3\xB3\xF5\x7A\xBD\xC9\x64\x42" + 126 | "\x59\x93\x71\x9C\xC4\x05\x41\xF8\xF8\xE3\x8F\xB6\x6F\xDF\xA6\xD7\xEB\x9F\x7C\xF2\x69\xB3\xD9\x0C\x00\x48\x4E\x4E\x56\x28\x14\xC1" + 127 | "\xBB\x58\x2C\x96\xAF\xBE\xDA\x54\x5E\x5E\x2E\x16\x8B\xAF\xB9\xE6\x27\x0B\x16\x2C\x18\x90\x05\x29\x97\xCB\xFF\xF0\x87\x67\x72\x72" + 128 | "\x0C\x7F\xFE\xF3\x0B\x9F\xBE\xF1\xC2\xBD\x8F\xFD\x51\x6F\xC8\x8D\x4B\x27\x3D\x6E\xE7\x67\x6F\xBE\x58\x73\xEE\xFB\x39\x73\xE6\xFE" + 129 | "\xFA\xD7\xBF\x96\xCB\x15\x04\x41\x24\x27\x27\x87\x3A\x56\x38\x8E\x3B\x7C\xF8\xD0\xC6\x8D\x1B\x1B\x1A\x1A\x52\x52\x52\x96\x2D\x5B" + 130 | "\xF6\x93\x9F\x2C\x0E\x5B\x98\xD5\x6A\xF5\x1F\xFF\xF8\xA7\x59\xB3\x66\x3D\xF1\xC4\x6F\xDE\x7D\xF7\x6D\x96\xF5\x2D\x59\x72\x5D\x5C" + 131 | "\x7A\x88\x98\x09\xC8\xC7\x66\xB5\x5A\x1B\x1B\x1B\x05\x41\x70\x38\x1C\x24\x4A\xB0\xC0\x30\xAC\xBD\xBD\x3D\xC8\x40\x44\xE1\x7B\x64" + 132 | "\x60\xA4\xA4\xA4\xC4\x28\xCE\x6D\xDB\xB6\x7C\xF3\xCD\xF6\x9C\x9C\x9C\xE7\x9E\x7B\x5E\xA7\x4B\x43\xE9\x7D\xC1\x88\x28\x84\xF0\xE3" + 133 | "\x8F\x3F\x5A\xBD\x7A\xB5\xDB\x7D\xA1\xF0\xC1\xE6\xCD\x5F\x3D\xF8\xE0\x43\x8F\x3E\xFA\x28\x41\x0C\x30\xCF\xE3\x38\x7E\xF7\xDD\x77" + 134 | "\x63\x18\x7C\xFE\xF9\xE7\xD6\xBF\xFB\xF2\x7D\xBF\x79\x2E\x76\x3F\x78\x20\xE0\xDF\xFA\xD9\xBB\xD5\x67\xCB\xE6\xCF\xBF\xF2\xF1\xC7" + 135 | "\x7F\x23\x16\x8B\x29\x8A\xD2\x6A\xB5\xA1\x56\xB9\xD3\xE9\x7C\x77\xED\xDA\xC2\x92\x69\xE9\x59\x86\x2D\x5B\xBE\x86\x10\x1E\x3C\x78" + 136 | "\xE0\x89\x27\x9E\xB8\xFF\xFE\xFF\xEE\xDF\xC3\x6B\xAE\xF9\x89\x46\xA3\xB9\xEF\xBE\x9F\xAF\x5B\xB7\x2E\x29\x49\x89\x82\x30\x51\x00" + 137 | "\x42\x18\xE4\x21\x22\x73\xA2\x3F\x0F\x31\xFC\x19\xA1\xC3\x16\x8B\xC5\x62\xB1\x60\x17\xB9\x8E\xB9\xB9\xB9\x41\xD3\xDE\xE9\x74\x8E" + 138 | "\xA8\x4E\xC8\xB9\x73\xE7\xD6\xAF\x5F\x9F\x9C\x9C\xFC\xF4\xD3\xCF\xE8\x74\x69\x38\x8E\x6B\xB5\xDA\xD0\x38\xEA\x97\x5F\x6E\x78\xFB" + 139 | "\x9D\xB7\x5F\x7B\xE7\x7D\x97\xCB\xF9\xFB\xC7\x1F\x71\xB9\x5C\x10\xC2\x0F\x3E\x78\x7F\xC9\x92\x25\x63\xC7\x8E\x1B\xB0\x4D\x00\xC0" + 140 | "\x5D\x77\xAD\xB2\x5A\xAD\xEF\xBD\xB7\xF6\x1F\x7F\x5B\xB7\xF4\x9E\x87\x06\x14\x76\xE4\x38\x71\x68\xF7\x89\x43\xBB\x0A\x0B\x0B\x1F" + 141 | "\x79\xE4\x11\xB1\x58\x4C\x92\x64\x98\xFC\x02\x81\xC0\x73\xCF\x3D\xCB\x72\xC2\x7D\xD3\x67\xA6\x67\xE8\x3F\xFE\xE0\x5D\xAF\xC7\xC3" + 142 | "\x71\xDC\xDA\xB5\xEF\x5D\x7F\xFD\x8D\x69\x69\x69\xFD\xDB\x2C\x2A\x2A\x7E\xF3\xCD\xB7\xEE\xB9\xE7\xEE\xB5\x6B\xDF\xD5\xEB\x33\x83" + 143 | "\x06\xFB\x10\x10\x04\x61\xC7\x8E\x1D\xA5\xA5\xA5\xE8\xA3\xDF\xEF\xAF\xAB\xAB\x0B\xE6\x4A\x0E\x86\x61\x7E\xB9\x20\x08\x6E\xB7\xFB" + 144 | "\xFB\xEF\xBF\x0F\xFD\x32\x72\x1F\xA9\xC7\xE3\x79\xFF\xFD\xB5\x82\x20\xFC\xE6\x37\x4F\x64\x65\x65\x61\x18\xA6\x56\xAB\x43\xE5\xE7" + 145 | "\x70\xD8\x5F\x7F\xFD\x35\xAD\x2E\x7D\xEC\xF8\x89\x10\x42\xA5\x4A\x8D\x8A\x90\x78\x3C\x9E\x6F\xBF\xFD\x6E\x30\x11\x62\x18\x46\x10" + 146 | "\xC4\xC3\x0F\xFF\xEA\xCC\x99\x33\x27\x0E\xEF\x1E\x57\x3C\x7D\x5C\xD1\xB4\x08\xBB\xD4\x1F\x1D\xAD\xCD\x3B\x37\xAE\x4B\x4E\x4E\x79" + 147 | "\xF4\xD1\x5F\xCB\xE5\x0A\x34\xC9\x87\x79\xC5\xAA\xAA\x2A\x37\x6D\xDA\x28\x96\x48\xB2\xDF\xCE\x39\x77\xF6\x8C\xF7\x62\x2E\x84\xC3" + 148 | "\xE1\xA8\xA8\xA8\x18\x50\x84\x18\x86\x95\x94\x4C\x7D\xF6\xD9\xE7\x1F\x79\xE4\xE1\x77\xDE\x79\xFB\x99\x67\xFE\x38\xAC\xB3\x54\x10" + 149 | "\x84\x8A\x8A\x8A\x91\xF6\x7F\x18\x11\xE2\x38\x4E\x92\xA4\x42\xA1\x08\xDE\x9E\x65\xD9\xC8\x47\xE1\x3F\xFE\xF1\xF7\xA6\xA6\xA6\x9B" + 150 | "\x6F\x5E\x3A\x69\xD2\x64\x0C\xC3\x24\x12\x49\x58\xEA\x4C\x4D\x4D\x6D\x67\x67\x67\x73\x4B\xCB\x8B\x7F\x7A\xD2\xEB\xF1\xB6\xB6\x5A" + 151 | "\x83\x87\x86\xAD\x46\xA2\x50\x28\x7E\xFD\xEB\x5F\xDF\x73\xCF\x3D\xFB\xB6\x6D\x30\x8D\x99\x10\x9D\x13\x47\x10\xF8\x03\xDF\xFC\xCD" + 152 | "\xED\x74\xFC\xF2\x97\x0F\xA3\x97\x4C\x26\x93\xC9\x64\xB2\xB0\xD3\xCA\xCB\xCB\x59\x96\x65\x59\x76\xCD\x4B\x2F\x86\x7E\x3F\xB4\x1B" + 153 | "\x13\x00\xB0\x64\xC9\x92\x03\x07\xF6\x6F\xDE\xFC\xD5\xEE\xDD\xBB\x16\x2F\x5E\x32\x74\x67\xC2\xDE\x1E\xBF\xDF\xEF\x74\x3A\x51\xBC" + 154 | "\x61\x88\xAB\x06\x10\x21\x45\x51\x41\x1E\x62\x56\x56\x56\x18\x0F\x11\x25\x6A\x0F\xDD\x15\x04\x87\xC3\xF1\x8F\x7F\xFC\x3D\x39\x39" + 155 | "\xF9\xB6\xDB\x6E\x43\x71\x47\xB5\x5A\x1D\xB6\xAC\x92\x24\x89\xE3\x38\xCF\x71\x5F\xFD\xED\xCB\xB0\xCB\x93\x93\x87\x5F\xE1\xA6\x4C" + 156 | "\x29\x59\xB8\x70\xE1\xE6\xAF\x37\xD7\x9C\x3F\x35\x61\xCA\xCC\x48\x7A\x15\x86\xF6\x96\xC6\x33\xDF\x1E\xCA\xCF\xCF\x5F\xB8\x70\x21" + 157 | "\xEA\xCF\x80\x35\x4C\xA4\xD2\x70\xA1\x5E\xFC\x5E\x9A\x95\x95\x39\x44\xFB\x14\x45\x3D\xF2\xC8\xA3\xFB\xF6\xED\xFD\xFA\xEB\xAF\xE7" + 158 | "\xCC\x99\xDB\xFF\xE5\x08\x05\x41\x10\xA1\x89\xDA\x18\x86\xF9\x7C\xBE\xC6\xC6\xC6\x86\x86\x06\x94\x47\x11\x08\x04\x02\x81\x40\xD8" + 159 | "\x55\x24\x76\x31\x10\xA1\xD5\x6A\xF3\xF3\xF3\x91\x8F\x2E\x2E\x39\x82\x47\x8F\x1E\xE9\xE9\xE9\xB9\xEB\xAE\x55\xC9\xC9\x29\x18\x86" + 160 | "\x49\xA5\xD2\xFE\x33\x49\x6E\x6E\xAE\x56\xAB\xED\x5F\xC1\x89\x61\x98\x49\x93\x26\x0D\x7B\x0B\x82\x20\x56\xAC\xF8\xE9\xCE\x9D\x3B" + 161 | "\xBE\x3B\xB0\x73\xEC\xA4\x2B\x88\x91\x7B\x07\x4F\x1E\xDE\xCB\xFA\xBC\x37\xDC\x70\xA3\x58\x2C\xC1\x30\x4C\x2E\x97\x0F\xA8\x09\x17" + 162 | "\x16\x16\x6A\xB5\x5A\x14\x49\x0D\x45\x71\x71\x91\xD9\x3C\x8C\x4A\xAC\xD7\xEB\x97\x2F\xBF\xFD\xED\xB7\xDF\x3A\x7A\xF4\xC8\xA2\x45" + 163 | "\x57\x8F\xA8\x7B\x62\xB1\x78\xCC\x98\x31\x48\xA8\x10\xC2\xAE\xAE\xAE\x9A\x9A\x1A\x24\xCE\x8E\x8E\x8E\x0B\x46\x45\x5E\x5E\x5E\x22" + 164 | "\x48\x88\x82\x20\xEC\xDF\xBF\x5F\x2C\x16\x2F\x5A\xB4\x08\xF1\x01\x92\x92\x92\xFA\xBF\x16\x32\x99\x6C\xD5\xAA\x7B\xFE\xF0\x87\xA7" + 165 | "\xC2\xE8\xAD\xB3\x66\xCD\x0E\xE6\x98\x0F\x8D\xC2\xC2\xC2\xF1\xE3\x27\x9C\xAF\x28\xEF\xB6\xB5\x6A\xD2\xB3\x46\xD4\x49\xB7\xD3\x51" + 166 | "\x71\xEA\xDB\xB4\xB4\xB4\x29\x53\x4A\x30\x0C\x23\x08\x62\xB0\x51\x92\x91\x91\xF1\xE8\xA3\x8F\x3D\xF5\xD4\x93\xA1\x05\x9A\xF4\xFA" + 167 | "\xCC\xFF\xF9\x9F\xDF\x0F\xEB\xED\xC3\x71\x7C\xF9\xF2\xDB\x3F\xFC\xF0\xC3\xBD\x7B\xF7\x2C\x58\xB0\x30\x6A\xEF\x20\xE2\x54\xA4\xA6" + 168 | "\xA6\xCE\x98\x31\x23\xF8\xE5\x9A\x35\x6B\x12\xE5\x6C\xB4\x58\x2C\x56\x6B\x4B\x51\x51\x71\x4A\x4A\x2A\x86\x61\x0C\xC3\x0C\xB6\x98" + 169 | "\xDF\x7E\xFB\xED\x2B\x57\xAE\x0C\xF5\xA8\x65\x64\x64\x3C\xF1\xC4\x6F\xFB\xBB\x42\x06\x04\x4D\xD3\x0B\x16\x2C\x70\xF5\x3A\x1A\x6B" + 170 | "\x46\xAC\x08\xB4\xB7\x58\x3A\xDB\x9A\x8B\x8A\x8A\xD5\x6A\x35\x86\x61\x62\xB1\x78\xB0\x4E\x02\x00\x96\x2F\xBF\xFD\x93\x4F\x3E\x5D" + 171 | "\xB2\x64\x89\xC1\x60\xC8\xCB\xCB\x5B\xB1\xE2\xA7\x5F\x7C\xB1\x3E\x2F\x2F\x2F\x92\x1B\x65\x64\xA4\xCF\x9E\x3D\xCB\x62\xB1\x24\x82" + 172 | "\x08\x9F\x28\x07\x5B\x65\x65\x85\xCF\xE7\x9B\x36\x6D\x1A\x92\x4D\xD0\xFF\xD2\x1F\x14\x45\x3D\xFD\xF4\x33\xF3\xE7\x5F\xB5\x79\xF3" + 173 | "\x57\x36\x5B\x47\x5E\x5E\xFE\xDD\x77\xDF\x83\x34\x8B\x08\x51\x52\x52\x22\x93\xC9\xEA\x2A\x4E\x4F\x9D\x3B\xB2\x69\xAA\xAE\xE2\x0C" + 174 | "\x84\xB0\xA4\x64\x2A\xFA\x38\x74\xF1\x25\x00\xC0\xB4\x69\xD3\xA7\x4D\x9B\x3E\xA2\x5B\x20\x50\x14\xBD\x70\xE1\xA2\x5D\xBB\x76\x9D" + 175 | "\x3B\x77\x36\x12\xEB\x62\x44\x48\x94\x08\x2B\x2A\x2A\x70\x1C\x2F\x2C\x2C\x44\x1F\x87\xA6\x36\x03\x00\xE6\xCE\x9D\x3B\x77\xEE\xDC" + 176 | "\xE8\xEE\x95\x99\x99\xA5\xD1\x68\xDA\xAD\x4D\x7D\x3E\x6F\xE4\x71\x7F\x81\xE7\x9B\xEB\xAB\x94\x4A\x25\xD2\x47\x48\x92\x4C\x68\xD2" + 177 | "\xDD\xF4\xE9\x33\x70\x1C\x2F\x2F\x2F\xBF\xF6\xDA\xF8\x38\x6B\x82\x20\xBD\x5E\x6F\x65\x65\x25\x8E\xE3\xE9\xE9\xE9\x28\xD9\x33\x76" + 178 | "\x45\x06\x42\xD8\xD0\x50\x9F\x96\x96\x96\x94\xA4\xC4\x2E\xAA\xB8\xF1\xE8\xED\xC0\x50\xAB\xD5\x3A\x9D\xAE\xA2\xBA\xD6\xE3\xEA\x8D" + 179 | "\x5C\x84\x5E\x8F\xDB\xDE\x65\x53\x2A\x55\xA9\xA9\x1A\x0C\xC3\x08\x82\x48\x68\x31\x36\xB5\x5A\x65\x30\x18\x10\xAD\x39\x96\x60\x19" + 180 | "\x32\x63\x7C\x3E\x5F\x5B\x5B\x1B\xCF\xF3\x1E\x8F\x87\xB4\x5A\xAD\xAF\xBC\xF2\x0A\x76\x71\xB5\x34\x9B\xCD\x3A\x9D\x2E\x46\x06\xA2" + 181 | "\xC7\xE3\x71\xB9\x5C\xB9\xB9\x79\x68\x69\x41\x96\x43\xD4\x9D\x1E\x16\x38\x8E\xEB\xF5\x99\x65\xDF\x9F\xEA\xF3\x8E\xA0\xFA\x80\xCF" + 182 | "\xE3\x72\xBB\x7A\x33\xF3\x2E\xD4\x6F\xA3\x28\x2A\xA1\x39\x31\x34\x2D\xCA\xCE\xCE\x3E\x76\xEC\x78\x6F\x6F\xEF\x48\x6B\x2F\x0A\x82" + 183 | "\x20\x08\x82\xCD\x66\x43\xEA\x68\x6D\x6D\x6D\x67\x67\x27\x76\xD1\xD9\xFD\x43\xA2\x36\x86\x61\xED\xED\xED\xED\xED\xED\xD8\x8F\x19" + 184 | "\x88\x06\x83\xC1\x68\x34\x86\xDA\x9B\xC3\xDE\xB2\xB7\xB7\x97\xE3\x38\x95\x4A\x85\xDE\xEB\x51\xA8\x19\x9C\x9C\x9C\x1C\xF0\xFB\xFD" + 185 | "\xFE\x11\xD4\xF3\xEC\xEB\xF3\xFA\xFB\x7C\x6A\xF5\x05\xEB\x33\xD1\xF5\x10\x29\x8A\xD2\x6A\x75\x3C\xCF\xD9\xED\xF6\xC1\x44\x88\x4A" + 186 | "\x57\x04\xF3\xB3\x58\x96\x6D\x68\x68\x68\x6C\x6C\x44\x3C\xC4\xC1\x4A\x20\x0F\xDC\xEF\x50\x06\x22\x00\x00\xC7\xF1\xD0\xA0\x49\x52" + 187 | "\x52\xD2\xD0\xDD\xF5\xF9\x7C\x82\x20\xC8\x64\x52\x34\xF8\x46\x21\xC8\x2E\x91\x48\x04\x81\x0F\x8C\x44\x84\x9C\xDF\xCF\x71\x5C\x70" + 188 | "\x91\x4E\x74\x27\x01\x00\x2A\x95\x5A\x10\x84\x21\x0A\x95\xF0\x3C\xFF\xF6\xDB\x6F\x87\x5E\x32\x60\x54\x2B\x0C\xC3\xBF\x7A\xA1\x4C" + 189 | "\x9B\xE0\x37\x43\x5F\xC2\xF3\x3C\x84\x90\xA2\x46\x2F\x9F\x1B\xFE\x98\x77\x13\x09\x04\x41\xC0\x42\x12\x04\x46\x21\xB3\x50\x2C\x66" + 190 | "\x20\x84\x1C\x17\xEE\x5E\x09\xEF\xD5\x08\x31\x94\x08\x49\x92\x64\x18\x26\x2F\x2F\x2F\x33\x33\x33\xE8\xB3\xB0\xD9\x6C\xE7\xCF\x9F" + 191 | "\x1F\xBA\x51\x1C\x07\x18\x86\xF1\xFC\x05\x6B\x7D\x14\x6A\xD6\x79\x3C\x6E\x9C\x20\x28\x7A\x64\x8C\x4D\x9C\x20\x82\xB3\xD6\x28\x74" + 192 | "\x72\xD8\x5B\xA0\x2C\x5F\xAD\xF6\x42\xF2\x17\xC7\x71\x6D\x6D\x6D\x55\x55\x55\xA8\x06\xE2\x60\x97\xFF\x48\x84\x88\x87\x98\x91\x91" + 193 | "\x81\xD4\x19\xB3\xD9\xAC\xD1\x68\xC2\x2E\xA8\xAC\xAC\x1C\xD6\x9B\x8E\xA8\x25\x5E\xAF\x17\xE5\xC1\xA0\xD9\x20\xA1\xAF\xB9\xCD\xD6" + 194 | "\x49\x8B\x18\x91\x68\x04\x79\x9D\x24\x2D\xA2\x45\x22\x87\xC3\x8E\x3E\x86\xB9\x87\x12\x01\x8F\xC7\x83\xAA\xF1\x0F\x76\x02\xCA\xB5" + 195 | "\x0F\x4B\xD4\xC6\x2E\x32\x10\x5B\x5A\x5A\x50\xE0\x30\x2C\xF5\x9E\x54\xAB\xD5\x85\x85\x85\xA8\x12\x62\x30\x64\x1F\x63\x5F\x51\xC8" + 196 | "\x1B\x29\x35\x14\x45\xA1\x3A\xFE\x89\x13\x21\xC7\x71\xCD\xCD\x4D\x12\xA9\x9C\x19\x49\x61\x64\x11\x23\x66\x24\xB2\xAE\xAE\xAE\x40" + 197 | "\x20\x40\x51\x54\x7F\xF7\x71\x7C\x21\x08\x42\x4F\x4F\x37\x8E\xE3\x43\x7B\xBA\x07\x44\x18\x03\xB1\xA9\xA9\xA9\xAE\xAE\xAE\xA7\xA7" + 198 | "\x07\x42\x78\xE6\xCC\x19\x32\x25\x25\x65\xF9\xF2\xE5\xF1\xED\x6E\x52\x52\x92\x58\x2C\xB6\xD9\x6C\x7E\xBF\x1F\x3D\x1D\x9E\xE7\x13" + 199 | "\xA7\x2F\xD8\x6C\x36\x9B\xCD\x96\xA4\x4A\x96\xC9\xC3\xF5\x2C\x28\x08\xF0\x62\xD2\x56\xD8\x21\x86\x11\xCB\x15\x4A\x87\xA3\xBB\xBB" + 200 | "\xBB\x5B\xA7\xD3\x71\x1C\xC7\xF3\x7C\xE2\xEC\xD7\x40\x20\x60\xB5\xB6\x52\x14\x85\x9C\x79\x51\x83\x24\x49\xA3\xD1\x68\x34\x1A\xD1" + 201 | "\xC7\xB6\xB6\xB6\x84\x68\xD2\xC8\x50\xAB\xA8\x28\xF7\xF9\x7C\x52\xA9\x54\x10\x04\x96\x65\x13\x57\xA4\xCD\x62\x69\xB4\xD9\x6C\x53" + 202 | "\x66\x4F\x0A\xAE\x85\x01\x3F\x5B\x5F\x79\xB6\xE6\xFC\xA9\xAE\x76\x6B\x20\xE0\x97\x29\x92\xD2\x32\x8D\xF9\x13\x8B\x75\x19\xD9\xE0" + 203 | "\xE2\x9B\x04\x70\x22\x35\x2D\xF3\xB4\xA5\xB6\xB5\xD5\x8A\x44\xE8\xF7\xFB\xA3\xA8\xF1\x1D\x21\x58\x96\xB5\x58\x1A\x55\x2A\xD5\x60" + 204 | "\x71\xAB\xA8\x91\x28\x63\xC8\x6C\xCE\x2D\x2B\x3B\x59\x5F\x5F\x8F\x8A\x7F\x79\x3C\x9E\xC4\xD5\x93\x38\x7A\xF4\x28\xCB\xB2\xE6\x71" + 205 | "\x93\x30\x0C\x83\x10\x96\x7F\x7F\x6C\xEB\x67\xEF\xDA\xDA\x5A\xD0\x51\x80\x61\x18\x00\x10\x42\xFC\x0B\x62\x5C\xF1\xF4\xA5\xAB\x1E" + 206 | "\x0C\x72\x6D\xB2\xCD\x05\x27\x0E\xED\x3C\x75\xEA\x54\x51\x51\x31\x84\xD0\xEB\xF5\x26\x4E\x84\x1D\x1D\x1D\x56\xAB\x75\xEE\xDC\x79" + 207 | "\x71\x7F\x08\x89\x9A\xDC\x0A\x0A\xF2\x29\x8A\xFA\xEE\xBB\x6F\x91\x1E\xE5\xF3\xF9\x22\x29\x7C\x1E\x05\xDC\x6E\xD7\xDE\xBD\x7B\x95" + 208 | "\xC9\x1A\xBD\x21\x0F\xC3\xB0\xAA\xB3\x27\x3F\x7D\xFD\x85\xAE\x8E\x56\x65\x92\x32\x3B\x2B\x6B\x52\x61\xE1\x15\x53\xA7\x4E\x1C\x3F" + 209 | "\x3E\x53\xAF\x97\xCB\x65\x67\xBF\x3B\xBC\x69\xDD\x9B\x48\x17\xC0\x71\x3C\x35\x4D\xAF\x50\xAA\x8F\x1F\x3F\x86\x6A\x2E\x79\xBD\xDE" + 210 | "\xD8\xB7\x0F\x1A\x0C\x47\x8F\x1E\x01\x00\xF4\x57\x55\x62\x07\xD9\xD9\xD9\xF9\xF9\xE7\x9F\x23\x75\x06\xB1\xD6\xE2\xE2\x6A\xCA\xCB" + 211 | "\xCB\x57\x28\x14\x27\x4E\x7C\xE7\xF1\x78\x64\x32\x19\xCF\xF3\x6E\xB7\x3B\x11\x05\x13\x8F\x1D\x3B\x5E\x55\x55\x59\x38\x7D\x9E\x2A" + 212 | "\x25\x15\x00\xF0\xDD\xC1\x9D\x01\x3F\x9B\x91\x9E\x21\x95\x48\x14\x0A\x05\x4D\x53\x18\x86\x89\x44\x22\x8F\xC7\x93\xA5\xD7\x37\x61" + 213 | "\x58\x6B\x63\xAD\xCB\xD1\x93\xA4\x4E\x21\x29\x5A\xA1\x4C\xCE\x34\xE6\xD7\x9C\x3B\x79\xEE\xDC\xB9\xA9\x53\xA7\x06\x02\x01\xAF\xD7" + 214 | "\x1B\x85\xBA\x31\x2C\xFC\x7E\xFF\xDE\xBD\x7B\x44\x22\xD1\x10\x6C\xA0\x48\x80\x6A\x58\xB6\xB4\xB4\xA0\xAA\x50\x28\xFB\x97\xB4\xDB" + 215 | "\xED\x07\x0E\x1C\x40\x67\x84\xD5\x40\x44\x0C\x44\x2C\x2A\xB3\x17\x71\xB7\x77\xEE\xDC\x59\x59\x59\x81\x02\xAA\xBD\xBD\xBD\x32\x99" + 216 | "\x2C\xBE\x7E\x2C\xBF\x9F\x5D\xB7\xEE\x63\x0C\x80\xA9\x73\xAE\x06\x00\x87\x18\x84\x82\x80\x5D\xAC\xFB\x0F\xE1\x85\x21\x45\xD3\x74" + 217 | "\xA6\x5E\xDF\x6D\xB7\xB3\x2C\xEB\xF1\xFA\x76\x7E\xF5\xE9\xD5\x4B\x57\x4A\xE5\x49\x24\x49\x4D\x28\x99\x55\x79\xFA\xBB\x6D\xDB\xB6" + 218 | "\x4C\x99\x32\x05\xC7\x71\x87\xC3\x21\x91\x48\xE2\xAE\x79\x59\xAD\xD6\xD2\xD2\x52\xA3\xD1\x88\xAA\x31\x47\x8E\x60\x91\x4A\x64\x4E" + 219 | "\x20\x7F\x5B\x18\x0F\xF1\x47\x0F\x34\xAC\x06\x22\x41\x10\x0C\xC3\xE4\xE6\xE6\x66\x65\x65\x85\x9A\xF6\x11\xCE\x36\xB3\x67\xCF\x3D" + 220 | "\x70\xE0\xC0\xD6\xAD\x5B\x0A\x0B\x27\x21\xD3\xA2\xA7\xA7\x27\x35\x35\x35\x8E\x8B\xC1\xDE\xBD\xFB\x4A\x4B\x8F\xE6\x8D\x2F\xCE\x32" + 221 | "\x17\x40\x28\xEC\xDF\xBE\xE9\x7C\xD9\x31\x41\x10\xDA\x3A\xDA\x33\xD2\xD2\x71\x1C\xC7\x71\x82\xA2\x2E\x04\x2C\xAD\xAD\xAD\x2C\xCB" + 222 | "\x4A\xC4\xE2\xD2\x3D\xDB\x6B\xCF\x9F\x59\xF5\xC8\x53\x52\x99\x22\x3D\xCB\x94\x69\xCA\x3F\x71\xE2\xC4\xF7\xDF\x97\x15\x17\x4F\x61" + 223 | "\x59\xD6\x6E\xB7\x47\x42\xDB\x89\x1C\x10\xC2\xBF\xFD\xED\x4B\xBF\xDF\x3F\x6F\xDE\xFC\xA1\x7F\xBB\x20\x08\x27\x4F\x9E\x44\xD5\xEF" + 224 | "\x31\x0C\xE3\x38\xAE\xB5\xB5\x15\x6D\x2D\x36\xC4\x32\x34\xD4\x98\x40\xB1\x8C\x53\xA7\x4E\x9D\x3A\x75\x2A\xF4\xFB\x08\xE7\xC3\xB1" + 225 | "\x63\xC7\x9A\x4C\xE6\xD2\xD2\xD2\x9A\x9A\x6A\x34\x81\xB8\x5C\x2E\x9A\xA6\x07\x64\x60\x44\x81\xAE\xAE\xCE\x35\x6B\x5E\x06\x04\x39" + 226 | "\xFF\xBA\x5B\x29\x8A\x3E\xB6\xFF\xEF\xDF\xFC\xDF\x07\x0A\x99\xD8\x38\xC6\x74\xEA\x7C\x55\x53\x73\x93\x4C\x26\x97\xC9\xA4\x0C\xC3" + 227 | "\xF0\x82\x60\xB3\xD9\x7C\x3E\xDF\xCC\xA9\x93\xEF\x5F\xB9\xEC\x1F\x7B\x8F\x7C\xB9\x65\xC7\x27\xAF\x3F\x7F\xF7\xAF\x9E\xA6\x45\xA2" + 228 | "\xA9\x73\xAF\xD9\xF8\xE1\x2B\x1F\x7E\xF8\x61\x41\xC1\x18\xA9\x54\xDA\xDB\xDB\x4B\xD3\x74\x84\xD9\xF1\x91\xA0\xB3\xB3\xF3\xCB\x2F" + 229 | "\x37\xA8\xD5\xEA\xE9\xD3\x67\x0C\x7D\xA6\x20\x08\x87\x0E\x1D\x1A\x69\xFB\xC3\x9B\x41\x04\x41\xA0\x80\x1F\x02\x2A\x4F\xAA\x52\xA9" + 230 | "\x90\x18\x78\x9E\x97\xC9\x64\x57\x5E\x79\x65\xFF\xC9\x07\x00\x40\x51\xE4\xB1\x63\xC7\x3A\x3A\x3A\x66\xCF\x9E\x83\xA6\x50\x9F\xCF" + 231 | "\x47\x10\x44\xEC\xFB\x05\xFA\xFD\xFE\xA7\x9F\x7E\xFA\xD0\xA1\x83\xF3\x96\xDC\x52\x32\x7B\x81\xAD\xB5\x79\xFD\xDB\x2F\x31\x14\xBE" + 232 | "\xEC\xFA\xAB\xC7\x17\xE4\x66\xE8\x34\x9D\xDD\x3D\xF6\xDE\x5E\xA7\xCB\x65\x77\x38\x9C\x4E\x27\x49\x10\x37\x5C\x33\x7F\xD5\xF2\x1B" + 233 | "\xA5\x12\xF1\xD8\x3C\xA3\x48\x44\x1F\x3D\x76\x9C\x65\xFB\xF2\xC6\x17\xC9\xE4\x49\x1E\x97\xF3\xEC\xF7\xDF\x72\x1C\x57\x5C\x5C\x0C" + 234 | "\x00\xF0\xF9\x7C\xF1\x8A\x00\xF3\x3C\xFF\xCA\x2B\xAF\x1C\x3A\x74\x70\xE9\xD2\xA5\x85\x85\x3F\x22\x74\x41\x08\xF7\xED\xDB\x17\x5A" + 235 | "\x15\xD8\xE1\x70\xF0\x3C\x8F\x2A\x19\x06\xF7\x0F\x89\xD2\xCD\x4D\xD3\x34\x8E\xE3\x66\xB3\x19\x05\x9B\x72\x72\x72\x82\xBF\xA7\xAA" + 236 | "\xAA\x6A\xFD\xFA\xF5\x91\xFF\x06\x08\xE1\x89\x13\x27\xF6\xEC\xD9\xB5\x78\xF1\xB5\x48\x6C\x5D\x5D\x5D\x82\x20\x28\x95\xCA\xA8\xA5" + 237 | "\xC8\xF3\xFC\x9B\x6F\xBE\xB1\x79\xF3\x57\xA6\x31\x13\xE7\x2D\xB9\x05\x00\xFC\xE8\xEE\xAD\x6E\xA7\xE3\xBA\x45\xF3\x92\x55\x4A\x0C" + 238 | "\xC3\x72\x32\x33\x56\xDE\x76\x63\x77\x8F\xA3\xD7\xE9\x02\x00\x68\x52\xD4\x13\xC7\xE6\x69\x52\x2E\xD8\xD4\x00\x80\xAB\xE7\xCF\x38" + 239 | "\x79\xA6\xBC\xBC\xEC\xD8\x8C\xAB\xAE\x15\x4B\x64\x33\x16\x5C\xD7\xD2\x58\xBB\x79\xF3\xE6\xCC\xCC\xAC\x25\x4B\x96\x08\x82\xD0\xD5" + 240 | "\xD5\x05\x21\x8C\xBD\x60\xFC\xD9\xB3\x67\x3F\xFD\x74\x5D\x7A\x7A\xC6\xA2\x45\xD7\x0C\x7B\x32\x49\x92\xF7\xDF\x7F\x7F\x41\xC1\x85" + 241 | "\x82\x11\x2C\xCB\x22\x5A\x7D\x73\x73\x73\x55\x55\x95\xDF\xEF\x1F\xD0\x85\x44\x22\xBF\x28\xFA\x61\x1A\x8D\x26\x3F\x3F\x3F\x2D\x2D" + 242 | "\x6D\x88\x7A\x88\x23\xD2\x47\x10\x7B\x1F\x00\xB0\x76\xED\xDA\xBC\xBC\x82\xDC\xDC\x0B\x7C\x3D\x54\x63\x33\x39\x39\x39\x0A\xC5\x81" + 243 | "\xE7\xF9\x77\xDF\x7D\xE7\x8D\x37\x5E\x57\xA5\xE8\x6E\xB9\xF7\x57\x12\xA9\xDC\xED\x74\x54\x9D\x39\xA9\x49\x51\x1B\xB3\xF5\x17\x3B" + 244 | "\x49\x64\xEB\xD3\xA7\x15\x4D\x18\xEC\x2D\x61\x44\xA2\xAB\x66\x5D\xF1\xD7\x77\x3F\x69\x6B\xAA\x1F\x57\x3C\x03\x42\x78\xCD\xD2\xBB" + 245 | "\x36\x7E\xF4\xEA\x5B\x6F\xBD\x21\x95\x4A\xE6\xCD\x9B\x8F\xA4\x88\xA2\x9E\x51\xBF\x6A\x0E\x87\xE3\xC9\x27\x7F\xCF\xB2\xFE\x5B\x6E" + 246 | "\x59\x16\xE1\xAE\x68\x24\x49\x06\xD5\x0E\x8A\xA2\xC6\x8D\x1B\x37\x6E\xDC\x38\xEC\x22\x03\x31\x58\x98\x1B\xA5\xC1\xA0\x08\x3E\xA9" + 247 | "\xD7\xEB\x6F\xBF\xFD\x76\xB4\x85\x42\x84\xA4\xB1\xC8\xE1\x74\x3A\x21\x84\xF3\xAF\x5D\x76\x68\xC7\xD7\x2F\xBE\xF8\xC2\x8B\x2F\xFE" + 248 | "\x39\x98\xBF\xEF\x74\x3A\x59\x96\x4D\x4D\x4D\x1D\xD1\x7C\xE5\xF5\x7A\x5F\x7E\xF9\x7F\x3F\xFA\xE8\x43\x99\x32\xF9\xA7\x0F\xFE\x8F" + 249 | "\x26\x4D\x8F\x61\x58\x4F\x67\x47\xAF\xBD\x6B\xE2\x18\x93\x48\x74\x21\xBC\x95\x99\xAE\x4B\x51\x0F\xB3\x60\x67\xE9\xD3\x28\x8A\xEC" + 250 | "\xEA\x68\x93\xCA\xE4\x5C\x20\x90\x9E\x6D\x5C\x7C\xEB\xDD\x5B\xBF\x58\xFB\xD2\x4B\xAB\xDD\x6E\x37\xAA\x80\x67\xB7\xDB\x51\x27\xA3" + 251 | "\x50\xA4\x59\x96\x7D\xF6\xD9\x3F\x9E\x3E\x7D\x9A\xA2\xA8\xD8\x57\xD6\x20\x03\x71\xFA\xF4\xE9\x18\x86\xF5\xF5\xF5\xB5\xB7\xB7\x0B" + 252 | "\x82\xB0\x7E\xFD\x7A\x9C\x61\x18\xA3\xD1\x18\xBA\xB1\x56\x1C\xE1\x74\x3A\x49\x92\x9A\x7D\xF5\x8D\x33\x17\x5C\xD7\xD0\xD8\xF0\xA7" + 253 | "\x3F\x3D\x63\xB7\xDB\x83\x47\x59\x96\xB5\x5A\xAD\x3D\x3D\x3D\x11\x5A\xFD\x95\x95\x95\xAB\x56\xAD\x5C\xFB\xDE\xDA\x64\x6D\xC6\xBD" + 254 | "\x8F\x3D\x93\x69\xBC\x40\x00\x64\xFB\xBC\x01\x3F\x9B\x74\xF1\x31\x21\x8F\xA8\x20\x08\x10\x62\x17\xEB\xCD\x0E\xB0\xA0\x78\xBC\x3E" + 255 | "\x8E\xE3\x45\x0C\x03\x70\x5C\xAE\x54\x91\x14\x6D\x1A\x53\x78\xDD\x1D\xF7\x01\x82\x7A\xF5\xD5\x57\xFE\xFA\xD7\x35\x68\x07\x02\xAF" + 256 | "\xD7\x6B\xB5\x5A\x51\xB2\x4E\xE4\x3F\x3C\x10\x08\xAC\x59\xF3\x97\x0D\x1B\x36\x50\xB4\x48\x10\x04\x9F\x6F\xC4\xE5\x9A\x87\x06\xC3" + 257 | "\x30\x39\x39\x39\x46\xA3\x51\x2C\x16\x27\x96\x6D\xE0\x72\xB9\x44\x8C\x98\xA4\xE8\x25\xCB\xEF\xF5\xB8\x9D\x27\x0F\xEF\xFE\xDD\xEF" + 258 | "\x7E\xFB\xE4\x93\x4F\x07\x2B\x6A\x42\x08\xED\x76\xBB\xD3\xE9\x4C\x4A\x4A\x92\xCB\xE5\x83\xBD\xEC\x36\x9B\xED\xBD\xF7\xD6\x7E\xF2" + 259 | "\xC9\x3A\xAF\xD7\x3B\x61\xCA\x8C\xA5\xAB\x1E\x0A\x4D\x48\x13\x31\x12\x8A\x16\x75\xDB\x1D\xC1\x36\xEB\x2D\x2D\x75\x8D\xCD\xDD\xF6" + 260 | "\xDE\x86\xA6\x96\xEE\x1E\x07\x84\x50\xA9\x90\xEB\x34\x29\x63\xF3\x4D\x79\xA6\x1C\x46\x44\xBB\x3D\xDE\x4D\xDB\x77\x93\x14\x6D\xC8" + 261 | "\x1B\x87\x61\x18\x41\x10\x4A\x75\x72\xAF\xBD\xDB\x54\x30\xF1\xB6\x9F\x3F\xBA\x6D\xFD\xFB\x5B\xB7\x6E\x29\x2B\x3B\x79\xCF\x31\xF9" + 262 | "\x0F\x70\x00\x00\x0F\x52\x49\x44\x41\x54\x3D\xF7\xCE\x99\x33\x17\x75\xC0\xE9\x74\xAA\x54\xAA\x48\xCA\xE0\xB2\x2C\xBB\x7A\xF5\x9F" + 263 | "\xDF\x7B\x6F\xAD\x36\x3D\x73\xD6\xD5\x37\x6D\xFA\xE8\x35\xAF\x37\xCA\x7D\x7A\x23\x41\x62\x45\xE8\x76\xBB\x18\x89\x14\x00\x9C\xA4" + 264 | "\xA8\x65\xF7\xFE\x8A\x20\x88\xEF\x0E\xEE\x7C\xE8\xA1\x07\x56\xAE\xBC\xEB\xEA\xAB\xAF\x09\x8E\x7B\x9E\xE7\x7B\x7A\x7A\xEC\x76\x3B" + 265 | "\xC3\x30\x88\x8F\x4B\x51\x14\x8E\xE3\x3C\xCF\x9F\x3D\x7B\x76\xD3\xA6\xBF\x6D\xD9\xB2\xC5\xE9\x74\x26\xA9\x52\x6E\x5B\xF1\x5F\xC5" + 266 | "\xB3\x16\x84\x11\xEF\x35\xE9\x99\x9A\xF4\xAC\xF3\x55\xB5\x29\x2A\xE5\x98\x7C\x93\xDF\x1F\xA8\xAE\x6B\x3C\x57\x59\x63\xEB\xEA\x41" + 267 | "\x27\x84\xC6\xF4\x49\x92\x4C\x56\x25\xB9\xDC\x1E\xAF\xAF\x6F\xF2\xF4\xF9\x39\xF9\xE3\xD1\x39\x38\x41\x28\xD5\x29\x2E\x67\xAF\x36" + 268 | "\x23\x7B\xC5\x2F\x7E\x7B\x78\xE7\xE6\x53\xA5\xFB\x9F\x7D\xF6\x4F\x66\xF3\x17\x37\xDD\x74\x33\x12\x64\x5B\x5B\x1B\x4D\xD3\x32\x99" + 269 | "\x4C\x2A\x95\xF6\xF7\x61\xA1\x14\xCE\xDA\xDA\xDA\x17\x5E\x78\x6E\xFF\xFE\xFD\xA9\x3A\xFD\xCA\x87\x9F\xEC\xF3\x79\x21\x8C\xFF\x28" + 270 | "\x0C\x45\xA2\x45\xE8\x61\xC4\x12\xA4\x1C\x53\x34\xBD\xEC\xDE\x5F\x69\xD2\xB3\x76\x7E\xF5\xE9\x5F\xFF\xBA\x66\xDD\xBA\x8F\x67\xCC" + 271 | "\x98\x39\x69\xD2\x64\x93\xC9\x98\x9A\xAA\x41\x66\x86\xC3\xE1\x68\x6A\x6A\x6A\x6F\x6F\x6B\x68\x68\x28\x2F\x2F\x3F\x75\xEA\x7B\x54" + 272 | "\x32\x4E\xA1\x54\x5F\x73\xCB\x5D\x33\x17\x5D\x2F\x95\x0D\xA0\x22\x32\x62\xC9\x4F\x6E\x5D\xF5\xD9\x1B\x2F\xEC\x3A\x58\xBA\xF3\xC0" + 273 | "\x51\x24\x2C\x9A\xA6\x27\x4D\x9A\x64\x30\x18\x4F\x9E\x3C\xB1\x72\xE5\x5D\xA9\xA9\xA9\x3D\x3D\xF6\xD7\x5E\x7B\xD5\xE9\x72\xBA\x7C" + 274 | "\x7E\x46\xA6\x2C\x9E\x33\xFD\xAA\xEB\x97\x87\x46\x97\x00\x8E\x2B\x94\x2A\x5A\x24\xC2\x09\x62\xC1\x0D\x77\x4C\x98\x32\xF3\xC8\xAE" + 275 | "\x2D\xB5\x15\xA7\x57\xAF\xFE\xF3\x1B\x6F\xBC\x5E\x5C\x5C\x5C\x5C\x3C\x65\xDC\xB8\xF1\x7A\xBD\x9E\x61\x18\x54\x06\x03\x5D\xCE\xF3" + 276 | "\x7C\x67\x67\x67\x59\x59\xD9\xBE\x7D\x7B\x4A\x4B\x4B\x39\x8E\x33\x16\x4C\x58\x76\xEF\x23\xDA\x8C\xCC\xF6\x96\x46\xE4\x40\x4F\xDC" + 277 | "\x43\x26\xAB\xAB\xAB\xEF\xBF\xFF\x7E\xA4\x8E\x22\x45\x34\x37\x37\x37\x3D\x3D\x1D\xE5\x6A\xC7\x62\xBD\xA1\x35\x80\x51\x24\xE3\x17" + 278 | "\x1F\x13\x4E\x10\xF3\xAF\x5D\x36\x71\xEA\xAC\x43\x3B\x36\x7F\x7F\x74\xDF\x37\xDF\x6C\xDF\xB6\x6D\x2B\x86\x61\x00\x00\xC4\x72\xFB" + 279 | "\xC1\x75\x04\x00\x0E\x70\xB1\x54\x56\x78\xC5\x9C\x49\x57\xCC\xCD\x9F\x34\x65\xE8\x88\x7C\xDE\xF8\xA2\x9F\x3D\xFE\x6C\xD9\xD1\x7D" + 280 | "\x36\x6B\x93\xD7\xE3\x6E\xAE\xAF\xBA\xF9\xE6\xA5\x0B\x16\x2C\x74\xBB\xDD\xE7\xCF\x9F\x4F\x4E\x4E\x59\xB2\xE4\x5A\x9B\xCD\xF6\xC1" + 281 | "\x07\xEF\xA9\xB5\x19\xB7\xFE\xFC\x51\x00\x80\x58\x2A\x13\x0F\x54\x4B\x98\x11\x4B\x68\x91\xC8\xEB\x76\xE9\x32\x0D\x37\xAF\x7A\xB0" + 282 | "\xDB\xD6\x7E\xEE\xC4\xD1\xCA\x33\xDF\x1E\x3E\x72\xE4\xE0\xC1\x83\x18\x86\x51\x14\xA5\x52\xA9\x92\x92\x94\x0C\x23\x82\x10\xF3\x7A" + 283 | "\x3D\xDD\xDD\xDD\x48\x71\xC3\x71\x22\x35\x2D\x63\xFA\x95\x4B\xA6\xCC\x59\x88\x0A\x15\x8B\x18\x31\x86\x81\xA8\x37\x3C\x0F\x7D\x98" + 284 | "\x88\x87\x58\x5D\x5D\x8D\x42\xBE\x28\x2D\x06\x0B\x8E\xC2\xB0\x1A\x88\x38\x8E\x1B\x8D\xC6\x9C\x9C\x1C\xB4\x5B\x4C\xA8\x42\x15\xB9" + 285 | "\x2F\x9F\xE3\x38\x96\xF5\x2B\x44\x0C\xF8\xB1\xE5\x90\xAC\x49\xBB\xF1\xCE\xFF\x5E\x7C\xEB\xDD\x96\x9A\x0A\x4B\x5D\xA5\xAD\xAD\xA5" + 286 | "\xB7\xA7\x8B\xF5\x79\x21\x84\x24\x4D\xCB\xE4\x0A\x55\xB2\x26\x35\x3D\x53\x9F\x6D\x4A\xCB\x32\xD1\x91\xE9\xAB\x38\x8E\xEB\x0D\x79" + 287 | "\xEA\x54\x1D\xEB\xF3\x35\xD6\x94\x7F\xF1\xF6\x6A\x0C\xC3\x00\x00\x93\x26\x15\x4A\xA5\x52\x9D\x4E\x4B\xD3\xB4\xDF\xEF\x67\x59\x56" + 288 | "\x91\x22\x61\x24\x52\xA9\x7C\x28\x0F\x11\x8E\x13\x32\x85\x52\x22\x95\xFB\xBC\x1E\x9C\x20\xE7\x2E\x5E\x3A\xFB\x9A\x9B\x3A\xDB\x5B" + 289 | "\x5A\x1A\xAA\xDB\x5B\x1A\xBB\xDA\xDB\x9C\x8E\x6E\xBB\xA3\xF1\x62\xC4\x83\x90\xC8\xE4\x86\xBC\xF1\xE9\xD9\x46\x43\xFE\x04\x43\xDE" + 290 | "\x58\x79\x92\x2A\x38\xD5\x93\x14\x4D\x84\x30\x74\x86\x85\x20\x08\xA1\xCA\x9D\xD7\xEB\x45\xDE\xD1\xE6\xE6\xE6\x9A\x9A\x9A\x01\x79" + 291 | "\x88\x03\x4C\xA4\x61\x0C\x44\x00\x80\x42\xA1\x08\x1A\x2B\x91\x17\xF0\xF2\xFB\xFD\x3C\xCF\x89\x18\x66\xC0\x92\x4D\xB4\x88\xC9\x1D" + 292 | "\x3F\x39\x77\xFC\xE4\x08\x7F\xDB\xB0\x20\x08\x42\x9E\xA4\x92\xCA\x93\x6C\xAD\x4D\x04\x49\xB9\x5C\x2E\x86\x61\xB4\x5A\x9D\x44\x22" + 293 | "\x41\xBA\xA5\xDB\xED\x72\x3A\x9D\xE6\x89\xA9\x12\xA9\x3C\x92\x9F\x80\x13\x84\x54\xAE\x90\xC8\xE4\x01\x3F\xCB\xF6\xF5\x51\xB4\x49" + 294 | "\x1B\x92\x39\xC5\x71\x1C\xCF\x05\x30\x0C\xA3\x28\x9A\x20\x09\x9C\x20\x45\x8C\x98\x11\x4B\xC8\x1F\x47\xB6\x71\x9C\x20\x29\x9A\x65" + 295 | "\x23\x12\x21\xAA\x0B\x12\xFA\xA8\xD1\xE0\x1E\x5A\x19\x1E\x66\x2D\x44\xD7\x87\xED\xB4\x17\xA1\x8F\x94\x65\xFB\x04\x41\xA0\x68\x66" + 296 | "\x34\x77\x74\xC2\x71\x3C\x25\x4D\x2F\x95\x29\x50\xAD\x00\x94\xA2\x8C\xF2\x17\xAB\xAA\xAA\x7C\x3E\x5F\xB6\xB9\x00\x1F\x09\xBB\x02" + 297 | "\x00\x40\x8B\x18\x54\xDC\x96\xE7\x79\x9E\x0B\xF0\x3C\x2F\xF0\x3C\x62\x03\x01\x1C\x27\x08\x92\xA2\x48\x7C\xF0\x64\x7F\x8A\x16\x45" + 298 | "\x38\x0A\xFB\x3F\xEA\x48\x30\x8C\x08\x49\x92\x44\xE5\x12\x82\x06\xB8\xD3\xE9\x6C\x6B\x6B\x8B\xA4\x69\x96\x65\x21\x84\x22\x86\x19" + 299 | "\x05\x8A\x66\x28\x52\x34\x69\x19\x39\xA6\x9A\xF2\x53\x07\x0F\x1E\x1C\x3F\x7E\x3C\xCF\xF3\x10\x62\x56\xAB\xF5\xF3\xCF\x3F\x93\x29" + 300 | "\x94\xB1\x14\x39\x09\xFA\x2D\x23\x07\x00\x80\xA2\x68\xBF\x3F\x22\x6E\x15\x8E\xE3\xE3\xC6\x8D\x0B\x32\xAD\x59\x96\xAD\xAD\xAD\x45" + 301 | "\xE5\x12\x86\x18\x88\xE1\x22\x44\x6A\x85\x5E\xAF\x47\x21\x43\xA3\xD1\x18\x56\x0F\x31\xF2\x44\x6D\xBF\x3F\x80\x46\x61\x24\x27\xC7" + 302 | "\x11\x38\x41\x2C\xB8\xF1\x0E\x4B\x6D\xE5\x3B\xEF\xBC\xB5\x71\xE3\x97\x1E\x8F\xE7\xE8\xD1\x23\x88\x36\x30\x73\xE1\xF5\x3A\x7D\xCE" + 303 | "\x68\x76\x06\x00\x40\x52\x54\x24\x59\x0C\x18\x86\xE1\x38\xBE\x70\xE1\xC2\xB0\xC8\xBE\xC3\xE1\x40\x61\x42\xB4\x17\x73\xFF\xD4\x7B" + 304 | "\x12\x71\xAA\xFA\x97\x0E\x8A\xBD\xF7\x68\xED\xA5\x47\x42\xCF\x8D\x17\x72\x72\xC7\xFE\xFC\x37\xCF\xEE\xDA\xFC\x79\x53\x5D\xA5\x00" + 305 | "\x31\x8A\xA4\x33\x72\x32\x26\x94\xCC\x9A\xBD\xE8\xC6\x51\x9E\x12\x00\x00\x04\x49\x06\x02\x11\x89\x70\x40\x28\x95\xCA\xC9\x93\x27" + 306 | "\x4F\x9E\x3C\x19\xBB\x40\xB7\x6C\xAE\xAB\xAB\x6B\x69\x69\x41\xA5\x83\xEC\x76\x3B\x69\x30\x18\x12\xB4\x5B\x0C\xDA\x99\x94\xBA\x44" + 307 | "\x3B\xE5\x65\x99\x0A\xEE\x79\xF4\x19\x2E\xE0\xE7\x79\x1E\x20\xCD\x30\xC1\x89\x2F\x03\x03\x00\x82\xA4\xE2\xC5\x33\x26\x49\xD2\x60" + 308 | "\x30\x84\xEE\xAF\x93\xD8\xDD\x62\x38\x2E\x00\x21\xBC\x24\xA3\x10\x01\x00\x40\xD1\xA2\x4B\x5B\x6A\x18\x99\xBC\x81\x40\x5F\xE2\xC8" + 309 | "\xD0\x09\xD4\x15\x03\x01\x4E\x10\x04\xF2\xDF\x7B\xB3\x43\x00\x00\x4E\x10\xC1\xF4\x92\x44\x20\x81\x22\x44\xA3\x70\x34\xF3\x9B\x2E" + 310 | "\x4F\xE0\x38\x91\x20\x02\x26\x02\x69\xB7\xDB\x77\xEF\xDE\x8D\xE3\x78\x56\x56\x56\xB0\x06\x62\x5C\x86\x3C\x4A\xA5\xF8\x27\x2A\x9A" + 311 | "\x9E\x08\xA0\xEC\xCC\x78\x25\x06\x21\x33\x1D\xA5\x55\x34\x35\x35\x09\x82\xD0\xD3\xD3\x43\x76\x76\x76\x7E\xF9\xE5\x97\xC1\x9B\xA1" + 312 | "\x72\x4F\x48\x35\x45\x6C\xB3\x58\xE8\x11\x10\xC2\x4B\xA3\x44\x5C\x4E\x40\x09\xB6\x51\x27\xBF\x05\xBD\x2B\xF5\xF5\xF5\xF5\xF5\xF5" + 313 | "\x0D\x0D\x0D\xA8\xBC\xFA\xC0\xBB\xC5\xF0\x3C\xDF\xD0\xD0\xD0\xD0\xD0\x80\x5D\x64\x20\x06\xE9\x33\x41\xA6\x7A\x70\x03\xC2\x61\xC1" + 314 | "\x71\x3C\x86\x61\xFF\xEE\x22\x04\x00\x5C\x10\xA1\x30\x2C\xD9\x0C\x42\xD8\xDE\xDE\x1E\x7C\xD4\x7D\x7D\x7D\x28\x4B\x3B\x98\x62\x38" + 315 | "\xE0\x55\x43\xED\x16\xE3\xF1\x78\x4E\x9F\x3E\x7D\xFA\xF4\xE9\xB0\xB1\x18\x21\x29\x48\x10\x78\x08\x61\x8C\x65\x26\xFF\xD9\x01\x7E" + 316 | "\x18\x85\xC3\x9F\xCC\xF3\xFC\x86\x0D\x1B\x82\x1F\x23\x1C\xBB\x11\x3D\xDF\xE8\xE6\x01\xF4\xD6\x8C\xC8\x21\xF9\xAF\x08\x00\x40\x70" + 317 | "\x14\x0E\x8F\x78\x26\x6A\xA3\x32\xF5\x26\x93\x29\x3B\x3B\x3B\x74\xDB\xAD\xA6\xA6\xA6\xFD\xFB\xF7\x47\xDE\x9B\xD1\x17\x21\xC0\x30" + 318 | "\x0C\x60\x24\x81\x13\x38\x8E\x5F\x98\x3C\xA0\x20\x40\x4E\x80\x3C\x2F\x24\x3C\x1D\x3B\xAC\x33\x00\x43\xEA\x8C\x10\xC1\x9D\xD1\x6E" + 319 | "\x31\xD9\xD9\xD9\xE8\x23\xCB\xB2\x2D\x2D\x2D\x68\x22\x65\x59\x76\x30\x2F\x1D\x19\x7A\x3D\x41\x10\xA9\xA9\xA9\x05\x05\x05\x3A\x9D" + 320 | "\xCE\x64\x32\xA5\xA5\xA5\xF5\x0F\x32\x44\xAE\x59\xA1\x51\x48\x8C\xD6\xE6\x20\x24\x81\x4B\x44\x24\x43\x91\x34\x45\xD0\xE4\x60\xDB" + 321 | "\xCA\x62\x2C\xC7\xB1\x7E\xDE\xEB\x0F\xF4\xF9\x87\xF2\x1D\xC7\x0D\x00\xE0\x38\x31\x74\xD9\xD2\x90\x73\x41\x66\x66\x66\x7E\xFE\x0F" + 322 | "\x5B\x23\xA0\x32\xFB\x41\x06\x62\x73\x73\x73\x75\x75\x75\x47\x47\x87\x20\x08\x41\x8F\x0F\x99\x9A\x9A\x3A\x7F\xFE\x7C\x44\x42\x8C" + 323 | "\x2F\x8F\x4D\x10\x04\x0C\x83\x20\xC1\x91\x26\x1C\x00\x29\x43\xC9\xC5\x34\x43\x0F\xBF\x28\x00\x80\x31\x14\xC9\x50\x64\x92\x54\xC4" + 324 | "\xF3\xD0\xE5\xF3\x3B\x7D\x2C\xC7\x27\x2A\x21\x0D\x43\xD3\x28\x49\x22\x4B\x20\x96\x46\xC2\x18\x88\x0D\x0D\x0D\x6D\x6D\x6D\x10\xC2" + 325 | "\xFD\xFB\xF7\x93\x2A\x95\xEA\xAA\xAB\xAE\x8A\x5F\x9F\x7F\x00\x5A\x40\x13\x17\x2C\x04\x00\x28\xC4\x74\x92\x54\x44\x12\xD1\xDC\x82" + 326 | "\x20\x80\x52\x26\x4A\x92\xD2\x4E\x2F\x6B\x77\xB3\x42\xA2\x46\x24\x20\x08\xA2\x7F\xE1\x97\x58\xC0\x30\x4C\xB0\x48\xE9\x99\x33\x67" + 327 | "\x12\xA8\x2E\x5E\xE4\x8D\x25\x44\x84\x62\x9A\x4C\x56\x48\x68\x32\xD6\xC6\x01\x00\x49\x52\x46\x22\xA2\x3B\x9D\xDE\x3E\x7F\xFC\xDD" + 328 | "\x60\x00\x00\xA4\x93\x27\xCE\x41\x93\xD0\x59\x6E\xC4\xE5\x7C\x22\x01\x00\x20\x59\x2E\xD6\xA9\x64\xB1\xCB\x2F\x08\x8A\xC4\x75\x2A" + 329 | "\xA9\x5C\x9C\x10\x5F\x20\x4E\x90\xF1\x1D\x85\x61\xF8\x27\x33\xDA\x08\x1C\xD7\x28\x25\xE2\x08\x96\xBD\x91\x02\x07\x20\x45\x21\x06" + 330 | "\x00\x38\xBD\x23\xA8\x02\x36\x2C\x50\xA4\x22\xB1\x22\x6C\x6A\x6A\x7A\xF1\xC5\x17\x51\xC5\x20\x14\xAC\x1F\x2C\x21\xE6\x92\x83\x22" + 331 | "\x71\xAD\x52\x3A\x98\xB6\x19\x3B\x00\x00\x6A\x39\xC3\xF1\x82\x97\x8D\x67\x0D\x9A\x20\xD7\x34\xF6\xA6\x20\x84\x6D\x6D\x6D\xB5\xB5" + 332 | "\xB5\xC1\xCD\xEF\xDA\xDB\xDB\x49\xA4\xDE\x60\x18\x56\x57\x57\x87\x85\x30\x10\x91\xD7\x3B\x37\x37\x57\xA1\x50\x84\xAA\x24\xA3\xA1" + 333 | "\x88\x0F\x04\x8A\xC0\x75\x4A\x19\x15\xBF\xC9\x73\x40\xA0\xB1\xD8\xDA\xC3\xC7\x51\x4D\x25\x08\x12\x42\x28\x08\x11\x89\x30\xCC\x8B" + 334 | "\x82\xCA\xEE\x21\xD7\x68\x4B\x4B\x4B\x6D\x6D\x6D\x7F\x1E\x62\xF8\x8C\x14\xB6\x0B\x33\x8E\xE3\x2A\x95\xCA\x6C\x36\x07\xE9\x4F\xBD" + 335 | "\xBD\xBD\x89\x2B\x0B\x31\x18\x08\x1C\xD7\x28\xA5\x89\x96\x1F\x02\x49\xE0\xC9\x72\xC6\xE6\xF0\xC6\xEB\x55\xC5\x09\x1C\x42\x8C\x8F" + 336 | "\xE0\x9D\x40\x35\xE9\x83\x1B\xBB\xF8\xFD\xFE\xDA\xDA\x5A\xBB\xDD\x3E\x74\x3D\xC4\xE1\x77\x8B\xE9\xEE\xEE\xEE\xEE\xEE\x0E\xFD\x32" + 337 | "\x11\x85\x2B\x86\x00\x00\x20\x45\x21\x16\x51\xA3\xE7\xE5\x91\x88\x28\x09\x43\x79\xFA\xE2\x33\x9D\xE2\x04\x89\x61\x11\xAD\x85\x82" + 338 | "\x20\x9C\x3E\x7D\x7A\xA4\xED\x0F\xAF\x17\xA0\x7A\x88\x41\x7E\x2A\xC7\x71\x11\xAF\x94\x17\xF6\xB3\x1B\x69\x9F\xC2\x90\x24\xA6\xA5" + 339 | "\xCC\xA8\x06\x1D\x01\x00\x2A\x19\xE3\xF3\x73\x91\x78\xC5\x86\x05\x8E\x13\x10\x46\xE4\xFC\x04\x00\xC8\x64\xB2\x50\x2A\x30\xCB\xB2" + 340 | "\x28\xEC\x3A\xC4\x55\x03\x88\x10\x2D\x87\xA8\x1E\xA2\x5E\xAF\x37\x1A\x8D\xA1\x9B\xA7\x45\x4E\x42\x04\x20\x0E\x22\x14\x91\x44\x92" + 341 | "\x6C\xB4\x69\x8C\x18\x86\xD1\x24\x21\x63\x28\xA7\x37\x7A\xE6\x59\x10\x38\x8E\x63\x58\x44\x0E\x36\x82\x20\x7E\xF6\xB3\x9F\x85\x92" + 342 | "\x10\x11\x03\xD1\x62\xB1\x20\x06\x22\x2A\x14\x17\x76\x15\x19\xAC\xA7\xAE\x50\x28\x0A\x0A\x0A\x32\x32\x32\x0C\x06\x03\xDA\x99\x35" + 343 | "\xF6\xDE\x03\x80\x45\xE8\xA1\x1F\xEC\x72\x95\x9C\x21\xF0\x4B\xA3\x1E\x2B\x24\x22\xB7\x2F\x10\xBB\xD7\x06\x29\x83\xD1\x3D\x87\x30" + 344 | "\x06\xA2\xD5\x6A\xAD\xAB\xAB\x6B\x6A\x6A\xAA\xAC\xAC\x44\x59\x06\x10\x42\xD2\x68\x34\x3E\xF0\xC0\x03\x38\x8E\xC7\x3D\xCB\x17\xC7" + 345 | "\x71\x0C\x03\x30\x06\xDD\x47\x4C\x53\x62\xFA\x92\xF1\x36\x28\x92\x90\x88\x28\x77\x5F\xAC\x03\x11\xC4\x16\xB5\x0F\x82\x24\xC9\xEC" + 346 | "\xEC\xEC\xD0\x38\x06\xCF\xF3\x6F\xBE\xF9\x26\x89\x76\x28\x8C\xB1\xF5\x01\x81\x6A\x03\x47\xAD\xBE\x02\x00\x94\x32\xE6\x12\x1A\xA8" + 347 | "\x00\xC3\x64\xE2\x78\x88\x10\x5C\xD8\x6D\x37\x1E\x9D\xFA\x01\xC8\x46\x20\x88\xA8\x1C\xC4\x11\x02\x25\x34\x09\xD1\x4E\xA4\x62\x9A" + 348 | "\x14\x25\xCC\x8A\x8F\x10\x22\x8A\xA0\x62\x7E\x44\xE8\x2D\x4C\x9C\x3D\x9D\x40\x11\x5E\x50\x67\xA2\x55\xEA\x14\x62\xFA\x92\xFB\x88" + 349 | "\x08\x1C\x8F\xDD\x98\x01\x17\xD6\xC2\x78\x74\x68\x20\x90\x28\x34\x0C\x00\x48\x49\x49\x41\xF9\xE3\xF1\xF2\xAE\xA1\x65\x3C\x42\xAF" + 350 | "\x44\x18\x68\x92\x10\x25\xC0\x11\x1A\x05\x44\x14\xE9\x8E\x93\x81\x18\x17\xA0\x65\x35\x10\x08\xA0\xE2\x46\x2C\xCB\x92\xCD\xCD\xCD" + 351 | "\xCF\x3F\xFF\x3C\x3A\x8C\xB8\x87\xE9\xE9\xE9\x79\x79\x79\x31\x32\x10\xB1\xD8\x44\xC8\xD0\xE4\xA5\x52\x44\xC3\x30\x9A\x2E\x85\xC1" + 352 | "\x10\xE4\x21\x56\x57\x57\x5B\x2C\x96\xFA\xFA\xFA\xE6\xE6\x66\x00\x00\xFA\x9E\x0C\x55\x37\x82\xBB\x30\x07\x19\x88\x88\x56\x9A\x93" + 353 | "\x93\x13\xD4\x57\x23\x57\x4F\x90\xB9\x12\x9D\x46\x3A\xCA\xB6\xFC\x10\x20\x08\x1C\xC7\x41\x2C\x36\xFE\x85\xFA\x9A\x91\xBD\x90\x28" + 354 | "\xA7\x1E\xFD\x1D\x08\x04\x50\x7E\x36\xDA\x2D\x66\x30\x1E\xE2\xA0\xBB\xC5\x04\x19\x88\xFD\x99\xAC\x11\x3A\xD8\x2E\x8E\xC2\x91\x53" + 355 | "\xB2\x08\x3C\x76\x25\x22\x5E\x20\x00\xA0\x08\x9C\x8D\x6A\x2E\x41\x08\x2D\x99\x32\x34\x38\x8E\x7B\xF5\xD5\x57\x83\x1F\x83\x35\x90" + 356 | "\x86\xBE\x6A\xF8\x27\x15\xC9\x9E\x33\x03\x37\x1D\xAD\x08\x69\x92\x20\x46\x31\xB7\x7B\x68\xE0\x38\x88\x31\xBC\x85\x14\xBA\x28\x96" + 357 | "\xA4\x08\x49\x53\x43\xA9\x0C\x88\xD3\x86\x78\x88\x41\x67\x4D\x57\x57\x57\x75\x75\x75\x24\x3D\x00\x00\x07\x00\x44\xB1\x16\xD2\x14" + 358 | "\x71\xC9\x75\xD1\x50\x30\x14\xE9\xF2\x45\x6F\x1D\x0A\x02\x87\x92\xF2\x87\x3D\x13\xC7\xF1\x69\xD3\xA6\x05\xD3\xAA\x51\x49\x59\xB4" + 359 | "\xE1\x56\xA4\x25\x65\x83\x3C\x44\x54\xA4\xDB\x64\x32\xE9\x74\xBA\x30\xFE\x52\x65\x65\x65\x6D\x6D\x6D\x24\x5D\xBF\x30\x0A\x47\x1E" + 360 | "\x78\xBB\xE4\xE6\x60\x18\x44\x34\x89\x74\x87\xE8\x2E\xE7\x79\x1E\xC3\x40\x24\x34\x30\x24\xC2\xB0\x44\xED\x20\x03\x11\xC5\x0B\x5B" + 361 | "\x5B\x5B\xC3\x72\xB5\x49\x95\x4A\x35\x6E\xDC\x38\x64\x54\xE4\xE4\xE4\x84\x6A\x2E\x31\x02\xC7\x41\x74\xEA\xCC\xE8\xC4\x05\x23\x07" + 362 | "\x81\x03\x8A\xC4\xFD\x81\x28\x97\x43\x8E\x0B\x00\x10\xFD\xE6\x7A\x41\x06\x22\xFA\x88\x12\x2D\x1A\x1B\x1B\xBB\xBB\xBB\x05\x41\x28" + 363 | "\x2F\x2F\x27\x53\x53\x53\xEF\xBC\xF3\xCE\xE8\x5A\x1F\x1A\xD1\x19\x15\x21\x14\xEC\xCB\x05\x04\x0E\x44\x24\x11\xB5\x08\xF9\x40\x00" + 364 | "\x15\x48\x8E\x4B\x67\x18\x86\x29\x28\x28\x08\x96\x9D\x8D\xC3\x8E\xDA\x43\xAC\xD2\x68\x2D\x1C\xE9\x28\x24\xF0\xB8\xF9\x16\xE2\x88" + 365 | "\x48\x78\xC6\x83\x21\xE0\xF7\x03\x00\x06\xCC\xB3\x8C\x4B\xD2\x61\xAC\x22\x24\x49\x12\x55\xCF\x1D\xA0\x69\xE4\xE6\x1E\xA1\x8F\x34" + 366 | "\x1E\x7B\x09\xC7\x1F\x51\x1B\xF8\x10\x42\xBF\x9F\xC5\x71\xBC\xFF\x76\xEB\x1C\xC7\x75\x75\x75\xC5\x5E\x5C\x24\x0E\xA3\xB0\xAD\xAD" + 367 | "\x6D\xC0\xED\xF0\xA2\xF3\x91\x02\x00\x00\x76\xD9\xC9\x10\x07\x20\x3A\xCE\x38\x14\x84\x80\x9F\x05\x00\x30\x4C\x78\xD9\x88\x8A\x8A" + 368 | "\x8A\xB6\xB6\xB6\xD8\x5F\x58\xB2\xBB\xBB\x7B\xE3\xC6\x8D\x18\x86\x25\x27\x27\x23\x06\xE2\x48\x29\xF4\x3A\x9D\xEE\xA5\x97\x5E\x5A" + 369 | "\xBD\x7A\xB5\x5E\xAF\xFF\xF1\x91\x0B\x59\x45\x23\x6A\x0D\x04\xAF\xBB\x9C\x80\x03\x80\xE3\x00\x1B\xF9\x6A\x28\x08\x3C\xDB\xE7\x25" + 370 | "\x49\x32\xAC\xF2\x87\xD5\x6A\x5D\xBD\x7A\xB5\x4E\xA7\x1B\x79\x83\x42\x5B\x5B\x5B\x4D\x4D\x0D\x22\x34\x75\x75\x75\x91\xDD\xDD\xDD" + 371 | "\x3B\x77\xEE\x44\x87\x11\xE5\xC2\x64\x32\x21\xD5\xD4\x6C\x36\x47\x52\x54\x1A\x79\xE3\x1E\x7F\xFC\xF1\x9F\xFD\xEC\x67\xF3\xE7\xCF" + 372 | "\x0F\xBE\x01\x48\x23\x1D\xA9\x6B\x0A\x42\x18\xE0\x2E\x3E\x2A\x18\xFC\x27\xE4\x78\xC8\xA1\x1F\x1D\x18\xFE\x94\xB0\x70\x41\xC8\x69" + 373 | "\xB0\xDF\xB7\x3F\xEE\x12\x84\x58\x74\x3E\x36\x41\x10\x7C\x1E\x8F\x58\x2C\x0E\x1A\xD6\x82\x20\xEC\xDB\xB7\x6F\xED\xDA\xB5\x12\x89" + 374 | "\x24\xC2\x72\x60\xA8\x1E\x62\x43\x43\x03\xAA\xAD\x1E\x08\x04\x06\xDD\x2D\x06\x19\x1C\xD5\xD5\xD5\x35\x35\x35\x28\x3F\x0D\x91\x83" + 375 | "\x43\xB7\x78\x19\xD0\xC6\xA4\x28\x8A\x65\xD9\xF5\xEB\xD7\xFB\xFD\xFE\x39\x73\xE6\x30\x0C\x13\xE4\x73\x88\x49\x4C\x4A\x8C\xE0\xED" + 376 | "\x25\x20\x64\xBD\x3F\x5A\x3E\xE1\x40\xFF\x0D\xF0\x21\xF8\xE5\x80\x82\x0A\xF9\x00\xFB\x1D\x19\xD0\xE4\x0B\x3B\x2C\xC2\xA0\x68\xE4" + 377 | "\x0B\x22\x01\x38\xC8\x07\x44\x17\xAB\xF0\xF5\xF5\xF5\x1D\x3C\x78\x70\xD3\xA6\x4D\x68\xF7\x8F\xFE\xE7\xF3\x3C\x1F\xAA\x58\x20\xD7" + 378 | "\x76\x73\x73\x33\x92\xDF\x80\xFE\x9A\xE1\xE7\x2C\x82\x20\xD0\xE6\x17\xC1\x7B\x48\x24\x12\x83\xC1\x30\xE0\x24\xEE\xF1\x78\x58\x96" + 379 | "\xCD\xCE\xCE\xD6\x6A\xB5\x81\x80\xFF\xF0\xE1\xC3\x53\xA6\x94\x8C\x74\x1B\xF7\x7F\x25\x08\x82\x70\xEA\xD4\xF7\x34\x4D\x17\x14\x8C" + 380 | "\xE9\xE8\xE8\xB0\x58\x2C\x22\x91\x68\xC0\x0D\x0F\x20\x84\x0D\x0D\x0D\x5E\xAF\x37\xF4\x51\x0F\xC8\x77\x0A\x43\x34\xCB\x8E\x52\xA9" + 381 | "\x34\x1A\x8D\x97\xA3\xE2\xF8\xCF\x0C\x24\xC2\xD0\x1D\x04\x22\x44\x54\x5A\xD6\x25\xE2\xE4\xFF\xCB\x23\x3A\x9E\x51\x34\x22\x4C\xE8" + 382 | "\x56\x8D\xFF\xB6\xE0\x79\x3E\xBA\x2A\xEC\xD1\x58\xAC\x82\x20\xF8\xFD\xFE\x78\x6D\x80\xF6\x1F\x60\x18\x06\x21\x6C\x6A\x6A\xF2\x78" + 383 | "\x3C\x51\x5C\x1B\xA5\xD3\xC1\xE7\xF3\xB9\x5C\x2E\x92\x24\x69\x9A\xFE\x8F\x20\x63\x81\x20\x08\x4E\xA7\xB3\xA1\xA1\x01\x51\x7B\xA3" + 384 | "\x40\xCC\x0E\x3A\x1C\x17\x89\x44\x89\xDB\x4B\xFC\x5F\x1B\x82\x20\xF4\xF5\xF5\xC5\xB8\x2A\xFD\x7F\x4C\x18\xE0\x52\x80\x11\xA5\x37" + 385 | "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" 386 | -------------------------------------------------------------------------------- /08_spi_ili9341/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "image/color" 5 | "image/png" 6 | "log" 7 | "machine" 8 | "strings" 9 | "time" 10 | 11 | "tinygo.org/x/drivers/ili9341" 12 | "tinygo.org/x/tinydraw" 13 | "tinygo.org/x/tinyfont" 14 | "tinygo.org/x/tinyfont/freemono" 15 | ) 16 | 17 | var ( 18 | white = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF} 19 | red = color.RGBA{R: 0xFF, G: 0x00, B: 0x00, A: 0xFF} 20 | green = color.RGBA{R: 0x00, G: 0xFF, B: 0x00, A: 0xFF} 21 | blue = color.RGBA{R: 0x00, G: 0x00, B: 0xFF, A: 0xFF} 22 | black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF} 23 | ) 24 | 25 | func main() { 26 | display := InitDisplay() 27 | 28 | // body 29 | display.FillRectangle(20, 20, 280, 200, white) 30 | 31 | // lcd 32 | display.FillRectangle(25, 25, 270, 160, black) 33 | 34 | // speaker 35 | for i := int16(0); i < 4; i++ { 36 | display.FillRectangle(40+i*15, 190, 5, 20, black) 37 | } 38 | 39 | // buttons 40 | for i := int16(0); i < 3; i++ { 41 | display.FillRectangle(40+i*60, 15, 40, 5, blue) 42 | } 43 | 44 | // 5-way key 45 | tinydraw.FilledCircle(display, 260, 180, 20, blue) 46 | 47 | // text 48 | tinyfont.WriteLine(display, &freemono.Regular9pt7b, 30, 40, "Booting Wio Terminal...", green) 49 | 50 | // tinygo logo 51 | { 52 | img, err := png.Decode(strings.NewReader(tinygo_logo_s_png)) 53 | if err != nil { 54 | log.Fatal(err) 55 | } 56 | 57 | w := img.Bounds().Dx() 58 | h := img.Bounds().Dy() 59 | for y := 0; y < h; y++ { 60 | for x := 0; x < w; x++ { 61 | r, g, b, _ := img.At(x, y).RGBA() 62 | display.SetPixel((320-int16(w))/2+int16(x), (240-int16(h))/2+int16(y), color.RGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: 0xFF}) 63 | } 64 | } 65 | } 66 | 67 | for { 68 | time.Sleep(time.Hour) 69 | } 70 | } 71 | 72 | func InitDisplay() *ili9341.Device { 73 | machine.SPI3.Configure(machine.SPIConfig{ 74 | SCK: machine.LCD_SCK_PIN, 75 | SDO: machine.LCD_SDO_PIN, 76 | SDI: machine.LCD_SDI_PIN, 77 | Frequency: 48000000, 78 | }) 79 | 80 | // configure backlight 81 | backlight := machine.LCD_BACKLIGHT 82 | backlight.Configure(machine.PinConfig{machine.PinOutput}) 83 | 84 | display := ili9341.NewSPI( 85 | machine.SPI3, 86 | machine.LCD_DC, 87 | machine.LCD_SS_PIN, 88 | machine.LCD_RESET, 89 | ) 90 | 91 | // configure display 92 | display.Configure(ili9341.Config{}) 93 | 94 | backlight.High() 95 | 96 | display.SetRotation(ili9341.Rotation270) 97 | display.FillScreen(color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF}) 98 | 99 | return display 100 | } 101 | -------------------------------------------------------------------------------- /08_spi_ili9341/tinygo-logo.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/08_spi_ili9341/tinygo-logo.png -------------------------------------------------------------------------------- /09_webclient/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bufio" 5 | "fmt" 6 | "strings" 7 | "time" 8 | 9 | "tinygo.org/x/drivers/net" 10 | "tinygo.org/x/drivers/net/http" 11 | ) 12 | 13 | // You can override the setting with the init() in another source code. 14 | // func init() { 15 | // ssid = "your-ssid" 16 | // password = "your-password" 17 | // url = "http://tinygo.org/" 18 | // debug = true 19 | // } 20 | 21 | var ( 22 | ssid string 23 | password string 24 | url = "http://tinygo.org/" 25 | debug = false 26 | ) 27 | 28 | var buf [0x400]byte 29 | 30 | func main() { 31 | err := run() 32 | for err != nil { 33 | fmt.Printf("error: %s\r\n", err.Error()) 34 | time.Sleep(5 * time.Second) 35 | } 36 | } 37 | 38 | func run() error { 39 | rtl, err := setupRTL8720DN() 40 | if err != nil { 41 | return err 42 | } 43 | net.UseDriver(rtl) 44 | http.SetBuf(buf[:]) 45 | 46 | err = rtl.ConnectToAP(ssid, password) 47 | if err != nil { 48 | return err 49 | } 50 | 51 | ip, subnet, gateway, err := rtl.GetIP() 52 | if err != nil { 53 | return err 54 | } 55 | fmt.Printf("IP Address : %s\r\n", ip) 56 | fmt.Printf("Mask : %s\r\n", subnet) 57 | fmt.Printf("Gateway : %s\r\n", gateway) 58 | 59 | // You can send and receive cookies in the following way 60 | // import "tinygo.org/x/drivers/net/http/cookiejar" 61 | // jar, err := cookiejar.New(nil) 62 | // if err != nil { 63 | // return err 64 | // } 65 | // client := &http.Client{Jar: jar} 66 | // http.DefaultClient = client 67 | 68 | cnt := 0 69 | for { 70 | // Various examples are as follows 71 | // 72 | // -- Get 73 | // resp, err := http.Get(url) 74 | // 75 | // -- Post 76 | // body := `cnt=12` 77 | // resp, err = http.Post(url, "application/x-www-form-urlencoded", strings.NewReader(body)) 78 | // 79 | // -- Post with JSON 80 | // body := `{"msg": "hello"}` 81 | // resp, err := http.Post(url, "application/json", strings.NewReader(body)) 82 | 83 | resp, err := http.Get(url) 84 | if err != nil { 85 | return err 86 | } 87 | 88 | fmt.Printf("%s %s\r\n", resp.Proto, resp.Status) 89 | for k, v := range resp.Header { 90 | fmt.Printf("%s: %s\r\n", k, strings.Join(v, " ")) 91 | } 92 | fmt.Printf("\r\n") 93 | 94 | scanner := bufio.NewScanner(resp.Body) 95 | for scanner.Scan() { 96 | fmt.Printf("%s\r\n", scanner.Text()) 97 | } 98 | resp.Body.Close() 99 | 100 | cnt++ 101 | fmt.Printf("-------- %d --------\r\n", cnt) 102 | time.Sleep(10 * time.Second) 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /09_webclient/wioterminal.go: -------------------------------------------------------------------------------- 1 | //go:build wioterminal 2 | // +build wioterminal 3 | 4 | package main 5 | 6 | import ( 7 | "device/sam" 8 | "machine" 9 | "runtime/interrupt" 10 | "time" 11 | 12 | "tinygo.org/x/drivers/rtl8720dn" 13 | ) 14 | 15 | var ( 16 | uart UARTx 17 | ) 18 | 19 | func handleInterrupt(interrupt.Interrupt) { 20 | // should reset IRQ 21 | uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF))) 22 | uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC) 23 | } 24 | 25 | func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) { 26 | machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput}) 27 | machine.RTL8720D_CHIP_PU.Low() 28 | time.Sleep(100 * time.Millisecond) 29 | machine.RTL8720D_CHIP_PU.High() 30 | time.Sleep(1000 * time.Millisecond) 31 | waitSerial() 32 | 33 | uart = UARTx{ 34 | UART: &machine.UART{ 35 | Buffer: machine.NewRingBuffer(), 36 | Bus: sam.SERCOM0_USART_INT, 37 | SERCOM: 0, 38 | }, 39 | } 40 | 41 | uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt) 42 | uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400}) 43 | 44 | rtl := rtl8720dn.New(uart) 45 | rtl.Debug(debug) 46 | 47 | _, err := rtl.Rpc_tcpip_adapter_init() 48 | if err != nil { 49 | return nil, err 50 | } 51 | 52 | return rtl, nil 53 | } 54 | 55 | // Wait for user to open serial console 56 | func waitSerial() { 57 | for !machine.Serial.DTR() { 58 | time.Sleep(100 * time.Millisecond) 59 | } 60 | } 61 | 62 | type UARTx struct { 63 | *machine.UART 64 | } 65 | 66 | func (u UARTx) Read(p []byte) (n int, err error) { 67 | if u.Buffered() == 0 { 68 | time.Sleep(1 * time.Millisecond) 69 | return 0, nil 70 | } 71 | return u.UART.Read(p) 72 | } 73 | -------------------------------------------------------------------------------- /10_webserver/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | "machine" 6 | "strconv" 7 | "time" 8 | 9 | "tinygo.org/x/drivers/net/http" 10 | ) 11 | 12 | // You can override the setting with the init() in another source code. 13 | // func init() { 14 | // ssid = "your-ssid" 15 | // password = "your-password" 16 | // debug = true 17 | // } 18 | 19 | var ( 20 | ssid string 21 | password string 22 | debug = false 23 | ) 24 | 25 | var led = machine.LED 26 | var backlight = machine.LCD_BACKLIGHT 27 | 28 | func main() { 29 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 30 | backlight.Configure(machine.PinConfig{Mode: machine.PinOutput}) 31 | 32 | err := run() 33 | for err != nil { 34 | fmt.Printf("error: %s\r\n", err.Error()) 35 | time.Sleep(5 * time.Second) 36 | } 37 | } 38 | 39 | func run() error { 40 | rtl, err := setupRTL8720DN() 41 | if err != nil { 42 | return err 43 | } 44 | http.UseDriver(rtl) 45 | 46 | err = rtl.ConnectToAP(ssid, password) 47 | if err != nil { 48 | return err 49 | } 50 | 51 | time.Sleep(5 * time.Second) 52 | ip, subnet, gateway, err := rtl.GetIP() 53 | if err != nil { 54 | return err 55 | } 56 | fmt.Printf("IP Address : %s\r\n", ip) 57 | fmt.Printf("Mask : %s\r\n", subnet) 58 | fmt.Printf("Gateway : %s\r\n", gateway) 59 | 60 | http.HandleFunc("/", root) 61 | http.HandleFunc("/hello", hello) 62 | http.HandleFunc("/cnt", cnt) 63 | http.HandleFunc("/6", sixlines) 64 | http.HandleFunc("/off", LED_OFF) 65 | http.HandleFunc("/on", LED_ON) 66 | if err := http.ListenAndServe(":80", nil); err != nil { 67 | message(err.Error()) 68 | } 69 | return nil 70 | } 71 | 72 | func root(w http.ResponseWriter, r *http.Request) { 73 | access := 1 74 | 75 | cookie, err := r.Cookie("access") 76 | if err != nil { 77 | if err == http.ErrNoCookie { 78 | cookie = &http.Cookie{ 79 | Name: "access", 80 | Value: "1", 81 | } 82 | } else { 83 | http.Error(w, fmt.Sprintf("%s", err.Error()), http.StatusBadRequest) 84 | return 85 | } 86 | } else { 87 | v, err := strconv.ParseInt(cookie.Value, 10, 0) 88 | if err != nil { 89 | http.Error(w, fmt.Sprintf("invalid cookie.Value : %s", cookie.Value), http.StatusBadRequest) 90 | return 91 | } 92 | cookie.Value = fmt.Sprintf("%d", v+1) 93 | access = int(v) + 1 94 | } 95 | http.SetCookie(w, cookie) 96 | w.WriteHeader(http.StatusOK) 97 | 98 | fmt.Fprintf(w, ` 99 | 100 | 101 | TinyGo HTTP Server 102 | 115 | 116 | 117 |
TinyGo HTTP Server
118 | 119 |

120 | access: %d 121 |

122 | 123 | /hello
124 | /6
125 | 126 |

127 | LED
128 | /on
129 | /off
130 |

131 | 132 | 133 |

134 | /cnt
135 | cnt:
136 | incrCnt()
137 |

138 | 139 | 140 |
141 |

142 | 143 | 144 | `, access) 145 | } 146 | 147 | func sixlines(w http.ResponseWriter, r *http.Request) { 148 | // https://fukuno.jig.jp/3267 149 | fmt.Fprint(w, ``) 154 | } 155 | 156 | func LED_ON(w http.ResponseWriter, r *http.Request) { 157 | led.High() 158 | backlight.High() 159 | w.Header().Set(`Content-Type`, `text/plain; charset=UTF-8`) 160 | fmt.Fprintf(w, "led.High()") 161 | } 162 | 163 | func LED_OFF(w http.ResponseWriter, r *http.Request) { 164 | led.Low() 165 | backlight.Low() 166 | w.Header().Set(`Content-Type`, `text/plain; charset=UTF-8`) 167 | fmt.Fprintf(w, "led.Low()") 168 | } 169 | 170 | func hello(w http.ResponseWriter, r *http.Request) { 171 | w.Header().Set(`Content-Type`, `text/plain; charset=UTF-8`) 172 | fmt.Fprintf(w, "hello") 173 | } 174 | 175 | var counter int 176 | 177 | func cnt(w http.ResponseWriter, r *http.Request) { 178 | r.ParseForm() 179 | if r.Method == "POST" { 180 | c := r.Form.Get("cnt") 181 | if c != "" { 182 | i64, _ := strconv.ParseInt(c, 0, 0) 183 | counter = int(i64) 184 | } 185 | } 186 | 187 | w.Header().Set(`Content-Type`, `application/json`) 188 | fmt.Fprintf(w, `{"cnt": %d}`, counter) 189 | } 190 | 191 | func message(msg string) { 192 | println(msg, "\r") 193 | } 194 | -------------------------------------------------------------------------------- /10_webserver/wioterminal.go: -------------------------------------------------------------------------------- 1 | //go:build wioterminal 2 | // +build wioterminal 3 | 4 | package main 5 | 6 | import ( 7 | "device/sam" 8 | "machine" 9 | "runtime/interrupt" 10 | "time" 11 | 12 | "tinygo.org/x/drivers/rtl8720dn" 13 | ) 14 | 15 | var ( 16 | uart UARTx 17 | ) 18 | 19 | func handleInterrupt(interrupt.Interrupt) { 20 | // should reset IRQ 21 | uart.Receive(byte((uart.Bus.DATA.Get() & 0xFF))) 22 | uart.Bus.INTFLAG.SetBits(sam.SERCOM_USART_INT_INTFLAG_RXC) 23 | } 24 | 25 | func setupRTL8720DN() (*rtl8720dn.RTL8720DN, error) { 26 | machine.RTL8720D_CHIP_PU.Configure(machine.PinConfig{Mode: machine.PinOutput}) 27 | machine.RTL8720D_CHIP_PU.Low() 28 | time.Sleep(100 * time.Millisecond) 29 | machine.RTL8720D_CHIP_PU.High() 30 | time.Sleep(1000 * time.Millisecond) 31 | if debug { 32 | waitSerial() 33 | } 34 | 35 | uart = UARTx{ 36 | UART: &machine.UART{ 37 | Buffer: machine.NewRingBuffer(), 38 | Bus: sam.SERCOM0_USART_INT, 39 | SERCOM: 0, 40 | }, 41 | } 42 | 43 | uart.Interrupt = interrupt.New(sam.IRQ_SERCOM0_2, handleInterrupt) 44 | uart.Configure(machine.UARTConfig{TX: machine.PB24, RX: machine.PC24, BaudRate: 614400}) 45 | 46 | rtl := rtl8720dn.New(uart) 47 | rtl.Debug(debug) 48 | 49 | _, err := rtl.Rpc_tcpip_adapter_init() 50 | if err != nil { 51 | return nil, err 52 | } 53 | 54 | return rtl, nil 55 | } 56 | 57 | // Wait for user to open serial console 58 | func waitSerial() { 59 | for !machine.Serial.DTR() { 60 | time.Sleep(100 * time.Millisecond) 61 | } 62 | } 63 | 64 | type UARTx struct { 65 | *machine.UART 66 | } 67 | 68 | func (u UARTx) Read(p []byte) (n int, err error) { 69 | if u.Buffered() == 0 { 70 | time.Sleep(1 * time.Millisecond) 71 | return 0, nil 72 | } 73 | return u.UART.Read(p) 74 | } 75 | -------------------------------------------------------------------------------- /11_spi_ili9341/graphics.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | const tinygo_logo_s_png = "" + 4 | "\x89\x50\x4E\x47\x0D\x0A\x1A\x0A\x00\x00\x00\x0D\x49\x48\x44\x52\x00\x00\x00\x96\x00\x00\x00\x80\x08\x02\x00\x00\x00\x66\xEC\x07" + 5 | "\x33\x00\x00\x00\x09\x70\x48\x59\x73\x00\x00\x14\xEA\x00\x00\x14\xEA\x01\x71\x95\x86\x57\x00\x00\x20\x00\x49\x44\x41\x54\x78\x9C" + 6 | "\xED\x7D\x67\x60\x1B\x55\xBA\xF6\x9C\x69\x1A\x55\x4B\xB2\x2D\xC9\xB6\x5C\x54\x5C\x52\x9D\xD8\x71\x48\x2F\x90\x04\x36\xA1\x87\x40" + 7 | "\x20\x4B\x08\xB0\x0B\xF7\x2E\xB0\x2C\xB0\x2C\x7B\x77\x3F\x60\xD9\xA5\x6D\xB8\x6C\x96\x5E\x42\x0D\x2D\x37\x6C\x42\x48\x61\x37\xBD" + 8 | "\xC7\x09\x24\x26\xD5\xBD\xC9\xB6\x5C\xE4\x22\x59\xD5\x23\xCD\xCC\xF9\x7E\x9C\x44\x08\xB9\xC9\x2A\x4E\xB6\x3C\x3F\x12\x4B\x33\x73" + 9 | "\xE6\x68\xDE\x39\xE7\xBC\xE5\x79\xDF\x03\xB0\xD8\x00\x00\x20\x49\x92\x20\x08\x00\x40\x8C\x4D\x8D\x14\x10\x42\xBF\xDF\x2F\x08\x42" + 10 | "\x8C\xED\x00\x00\x44\x22\xD1\x25\xE9\x3F\xCF\xF3\x1C\xC7\x41\x08\x63\x69\x87\x8C\xFA\x4A\x86\x61\xB4\x5A\xAD\x52\xA9\x24\xC9\xE8" + 11 | "\x1B\x89\x05\x10\xC2\x9A\x9A\x1A\x97\xCB\x15\x63\x3B\x32\x99\x2C\x37\x37\x77\xF4\x45\x88\xC0\x71\x5C\x6F\x6F\x6F\x47\x47\x87\xCF" + 12 | "\xE7\x8B\xAE\x05\x22\xBA\xCB\x94\x4A\xA5\xD9\x6C\x96\xC9\x64\x38\x8E\x47\xD7\x42\xEC\x00\x00\x08\x82\xD0\xDB\xDB\x1B\x63\x3B\x3A" + 13 | "\x9D\x4E\x2A\x95\xC6\xA5\x4B\x51\x00\xC7\x71\x89\x44\xA2\x56\xAB\x7D\x3E\x1F\xCB\xB2\xD1\xB4\x10\xC5\x35\x24\x49\x66\x65\x65\x11" + 14 | "\x44\x94\xE2\x8F\x23\x54\x2A\x55\x8C\x4F\x5F\x2A\x95\xAA\x54\xAA\x78\xF5\x27\x6A\x10\x04\x91\x93\x93\x13\xDD\x7C\x16\x8D\x08\xA5" + 15 | "\x52\xE9\xA5\x9A\x3C\xC3\x40\x92\x64\x76\x76\x36\x4D\xD3\xD1\x5D\x4E\xD3\x74\x56\x56\xD6\x65\xF2\x5B\x08\x82\x88\xEE\x75\x8C\x46" + 16 | "\x84\x97\x6A\xD9\x18\x10\x62\xB1\xD8\x6C\x36\x8B\xC5\xE2\x28\x2E\x34\x99\x4C\x12\x89\x24\x11\xBD\x8A\x0E\xD1\xAD\x4A\xC3\xBF\x80" + 17 | "\xA8\xDD\x50\xAD\xE9\xB2\x12\x21\x86\x61\x62\xB1\x38\x3F\x3F\xBF\xA3\xA3\xC3\x66\xB3\xF1\x3C\x3F\xEC\xF9\x04\x41\x68\x34\x1A\xAD" + 18 | "\x56\x7B\x39\xAC\x05\x61\x08\x7D\xB6\xE8\xEF\x61\x55\xEE\x81\x85\x41\x10\x84\x58\x2C\xCE\xCD\xCD\xCD\xCE\xCE\xCE\xC9\xC9\x31\x18" + 19 | "\x0C\x0C\xC3\xA0\x43\x95\x95\x95\x9F\x7E\xFA\x69\x66\x66\xE6\xE5\x26\x48\x0C\xC3\x78\x9E\xB7\xDB\xED\x76\xBB\xDD\xE3\xF1\x20\x59" + 20 | "\xA2\x4E\xA2\xF7\x0F\xCD\x54\x6A\xB5\x5A\xA9\x54\x5E\x86\xC2\x83\x10\x36\x37\x37\xAF\x58\xB1\x62\xCC\x98\x31\xE8\x9B\x40\x20\x60" + 21 | "\xB1\x58\xEA\xEA\xEA\x9A\x9B\x9B\xAB\xAB\xAB\xDD\x6E\xF7\x80\x2F\x28\x49\x10\x04\xFA\x3D\x00\x80\xCC\xCC\x4C\xB3\xD9\x9C\x9E\x9E" + 22 | "\x6E\x32\x99\x52\x52\x52\x62\xEC\x50\x2C\x97\x47\x07\x1C\xC7\x93\x93\x93\x93\x93\x93\x21\x84\x2C\xCB\x06\x02\x01\xF4\x9B\x09\x82" + 23 | "\xA0\x69\x9A\xA6\xE9\xE0\x6B\x77\x49\xBA\x37\xD2\x97\x9E\xA2\x28\xB3\xD9\x6C\x36\x9B\xD1\xC7\xDE\xDE\xDE\xBA\xBA\x3A\x8B\xC5\x52" + 24 | "\x5B\x5B\xDB\xDC\xDC\x8C\x5D\xB4\x2C\xC9\xCC\xCC\xCC\xBB\xEF\xBE\x1B\x00\xA0\x56\xAB\x29\x8A\x8A\xB1\x97\x2C\xCB\x7A\xBD\x5E\x86" + 25 | "\x61\xD2\xD3\xD3\xE5\x72\xF9\x65\xF8\xB2\x5F\x12\xF0\x3C\xEF\x72\xB9\x5A\x5B\x5B\xFB\xFA\xFA\x24\x12\x89\x48\x24\x8A\xA2\x91\xA4" + 26 | "\xA4\xA4\xA2\xA2\xA2\xA2\xA2\x22\x0C\xC3\x02\x81\x80\xCD\x66\x13\x04\xE1\xB3\xCF\x3E\x23\x69\x9A\xD6\xE9\x74\xB1\xF7\xB2\xAF\xAF" + 27 | "\x8F\xE3\xB8\x45\x8B\x16\x2D\x5C\xB8\x30\x2D\x2D\xED\x32\x9C\x66\x2F\x39\x20\x84\xED\xED\xED\xBB\x76\xED\xDA\xB1\x63\x07\x45\x51" + 28 | "\xD1\x09\x12\x81\xA2\xA8\x8C\x8C\x0C\x0C\xC3\x44\x22\x51\x7C\x0C\x73\x87\xC3\x61\x34\x1A\xDF\x7A\xEB\xAD\xBB\xEE\xBA\x2B\x3D\x3D" + 29 | "\xFD\x3F\xF2\x1B\x10\x00\x80\xB4\xB4\xB4\x95\x2B\x57\xBE\xF5\xD6\x5B\x06\x83\xC1\xE1\x70\xC4\xA5\xD9\x38\x88\xD0\xE3\xF1\x14\x14" + 30 | "\x14\xFC\xEE\x77\xBF\x53\x28\x14\xB1\xB7\xF6\xEF\x00\x85\x42\xF1\xFB\xDF\xFF\xBE\xA0\xA0\xC0\xE3\xF1\xC4\xDE\x1A\x8E\x9C\xC5\x7E" + 31 | "\xBF\x3F\xEA\x15\xDE\xE5\x72\x3D\xF0\xC0\x03\xB1\xAF\xA3\xFF\x56\x20\x49\xF2\xC1\x07\x1F\x74\x3A\x9D\xD1\x5D\x0E\x21\x0C\x04\x02" + 32 | "\xC8\xCB\x4F\xD6\xD6\xD6\x3E\xFC\xF0\xC3\x18\x86\x29\x14\x8A\xFC\xFC\x7C\xBD\x5E\x6F\x34\x1A\xB3\xB3\xB3\x23\x14\x09\xCF\xF3\x06" + 33 | "\x83\x41\xA9\x54\x46\xD7\x95\x7F\x67\x28\x95\x4A\xA3\xD1\xE8\x76\xBB\x23\x54\xFA\x78\x9E\x6F\x69\x69\xA9\xAD\xAD\x6D\x6A\x6A\xAA" + 34 | "\xAA\xAA\x42\xCE\x61\x08\x21\x09\x21\x44\xE3\xCF\xE1\x70\x1C\x3F\x7E\xFC\xF8\xF1\xE3\x38\x8E\x03\x00\x32\x32\x32\x72\x73\x73\x33" + 35 | "\x33\x33\x73\x73\x73\x87\x30\x30\x78\x9E\x17\x8B\xC5\x97\xD0\xD9\xFD\xCF\x0B\xE4\xE0\xEE\xED\xED\x1D\x42\x84\x0E\x87\xA3\xBE\xBE" + 36 | "\xBE\xB1\xB1\xB1\xB1\xB1\xB1\xBE\xBE\x9E\xE7\xF9\xFE\x96\xFE\x00\xDE\x19\x74\x52\x53\x53\x53\x53\x53\x13\xBA\x93\x48\x24\x0A\x0E" + 37 | "\x4A\x8E\xE3\x62\x51\xA5\xFE\x83\x21\xC0\x71\xDC\xBB\xEF\xBE\x1B\xF4\xD9\x72\x1C\xC7\xB2\xEC\xB0\xFE\xA6\xE1\x1D\x6C\x82\x20\xF8" + 38 | "\x7C\xBE\xD0\x68\x56\xD4\x6E\xE5\xFF\x60\x58\x78\xBD\xDE\x91\x5E\x32\x94\x08\x71\x1C\x27\x08\x42\xAD\x56\xE7\xE5\xE5\x05\x47\x9E" + 39 | "\xDD\x6E\x6F\x6C\x6C\x8C\xAE\x7F\xFF\xC1\xD0\xC0\x71\xBC\xB8\xB8\x38\x18\xFC\x62\x59\xB6\xA6\xA6\xA6\xA7\xA7\x87\xE3\xB8\x21\x3C" + 40 | "\xA5\xE1\x22\x44\x2C\x0A\x93\xC9\x64\x30\x18\xB2\xB3\xB3\x8D\x46\xA3\x5C\x2E\x0F\x3D\xA1\xB2\xB2\x12\x4D\xB0\x97\x09\xD0\x42\x0E" + 41 | "\x21\xE4\x38\xCE\xED\x76\xDB\x6C\xB6\xDE\xDE\x5E\x9F\xCF\xEB\xF3\xF9\x58\xB6\x2F\x10\xE0\x20\x84\x24\x49\x8A\xC5\x0C\xC3\x88\xA5" + 42 | "\x52\x99\x5C\x2E\x4B\x4A\x52\x2A\x95\x4A\x91\x48\x84\x96\xF0\xCB\xC7\x8A\xC5\x71\x7C\xF6\xEC\xD9\x41\x1F\x29\x82\xC7\xE3\xB1\x58" + 43 | "\x2C\x8D\x8D\x8D\x16\x8B\xA5\xAA\xAA\x2A\x10\x08\x70\x1C\x17\x7A\x02\x29\x12\x89\x90\xCF\x3E\x2B\x2B\x4B\xAF\xD7\x9B\xCD\xE6\xC4" + 44 | "\xF9\x56\x78\x9E\xB7\xD9\x6C\x76\xBB\x9D\x61\x44\x3A\x5D\x9A\x58\x2C\x8E\xE2\x46\xC8\x31\x68\xB3\x75\x34\x36\x36\xB6\xB6\xB6\xB6" + 45 | "\xB5\xB5\xD9\x6C\x1D\x5D\x5D\xDD\x0E\x87\xBD\xAF\xAF\x2F\xE4\x44\x80\x81\x1F\xBC\xF8\x48\xD0\xC1\x63\x04\x41\x24\x25\x25\x69\x34" + 46 | "\xDA\x8C\x8C\xF4\xAC\xAC\x6C\xA3\xD1\x94\x93\x93\x23\x95\x4A\x2F\x1F\x71\x06\x21\x95\x4A\xC7\x8E\x1D\x3B\x76\xEC\x58\x0C\xC3\x20" + 47 | "\x84\x6D\x6D\x6D\xB5\xB5\xB5\x56\xAB\xD5\x62\xB1\xA0\xE7\x49\x66\x67\x67\x3F\xF6\xD8\x63\x89\xEE\x87\x20\x08\xBB\x77\xEF\xDA\xBC" + 48 | "\xF9\xAB\xF6\xF6\x76\x34\x6E\x44\x22\x51\x71\xF1\x94\x5B\x6E\x59\x66\x30\x18\x22\x6C\xA1\xBD\xBD\xFD\xD4\xA9\xB2\x33\x67\xCE\x56" + 49 | "\x55\x55\x5E\x74\x6D\x5C\x78\xE6\x22\x46\xAC\x4C\xD1\xA9\x53\x75\xA9\xBA\x0C\xB9\x52\x25\x62\x24\x22\x11\x43\x50\x14\xD2\xAE\x05" + 50 | "\x9E\xE7\xB8\x00\xCB\xF6\xF5\x79\x3D\x1E\xB7\xD3\xE5\xB0\xF7\xF6\x74\x76\xDB\xDA\xAA\x6B\xAA\xAB\x2A\x2B\x90\x60\x51\xF4\x78\xDC" + 51 | "\xB8\xF1\x85\x85\x85\x63\xC6\x8C\x1D\x69\x00\xD2\xEF\xF7\xD7\xD7\xD7\x5B\xAD\x56\x9E\xE7\x34\x1A\x4D\x5E\x5E\x7E\x22\x22\x91\x00" + 52 | "\x80\xF4\xF4\xF4\xF4\xF4\xF4\xE0\x37\x6B\xD6\xAC\x19\xA5\x80\xF5\xFA\xF5\x9F\x6F\xDC\xB8\x91\xA2\x99\x09\x53\x66\xAA\x35\x69\x7D" + 53 | "\x3E\x6F\x63\xF5\xB9\xD2\xD2\xA3\x65\x65\x27\xEF\xBC\x73\xE5\xD5\x57\x5F\x33\x98\x62\x0D\x21\x6C\x6A\x6A\x3A\x7A\xF4\xC8\xF1\xE3" + 54 | "\xC7\x9B\x9B\x9B\xD0\x92\xA0\x54\xA7\x14\x4E\x9D\x93\x61\x30\x6B\x33\xB2\xD4\xA9\x5A\x55\x8A\x56\x22\x95\x0F\x78\xF9\x10\x00\x00" + 55 | "\xF8\x59\xB6\xB3\xAD\xA5\xB5\xA9\xBE\xA5\xA1\xC6\x52\x5B\x61\xB1\xD4\xD6\xD5\xD5\x6D\xD9\xF2\xB5\x54\x2A\x9D\x38\xB1\x70\xE6\xCC" + 56 | "\x59\x45\x45\x45\xC3\xCA\x92\x65\xD9\xBF\xFF\xFD\x9B\x6D\xDB\xB6\x76\x77\x77\x07\xBF\x54\x28\x14\xB7\xDC\xB2\x6C\xC9\x92\x6B\x47" + 57 | "\xC1\xDC\x1A\x0D\x11\x56\x54\x54\x6C\xDD\xBA\x4D\x97\x69\xB8\xF7\xB1\x67\x54\x29\xDA\x0B\xDF\x42\x78\xEE\x64\xE9\xA6\x8F\xDF\x78" + 58 | "\xFF\xFD\xF7\xFA\xFA\xFA\x6E\xBC\xF1\xA6\xB0\x5F\xEB\xF1\xB8\x0F\x1D\x3A\xB4\x7B\xF7\xEE\x86\x86\x7A\x41\x10\x28\x9A\xCE\x9F\x38" + 59 | "\x65\xEC\xE4\x69\xF9\x13\x8A\x52\xB4\xE9\x58\xCC\x33\x1E\x84\x90\xA2\xE9\xF4\x6C\x63\x7A\xB6\x71\xCA\xEC\x05\x18\x86\xF9\xD9\xBE" + 60 | "\x86\xEA\xF3\x55\xA7\x4F\x9C\x2F\x2B\x2D\x2D\x3D\x5A\x5A\x7A\x54\x2E\x97\xCF\x9C\x39\x6B\xD1\xA2\x45\x39\x39\x86\x01\xE7\xD8\xCE" + 61 | "\x4E\xDB\x5F\xFE\xF2\x97\xCA\xCA\x0A\x89\x4C\x3E\xFD\xCA\x25\x7A\x43\x2E\x41\x92\xED\xCD\x8D\x27\x8F\xEC\xF9\xE8\xA3\x0F\x7B\x7B" + 62 | "\x7B\x7F\xFA\xD3\x3B\x63\xEC\xE7\xB0\x18\x0D\x11\xEE\xDE\xBD\xCB\xEF\xF7\x2F\x5E\xB6\x4A\x95\xAC\xF9\xE1\x5B\x00\xC6\x4F\x99\x91" + 63 | "\x9E\x6D\xFA\xE0\xE5\xA7\xD6\xAF\xFF\x42\xA3\xD1\xCC\x9A\x35\x1B\xC3\x30\x08\x61\x57\x57\xE7\xF6\xED\xDB\xF7\xEE\xDD\xEB\x72\xBB" + 64 | "\x68\x11\x33\xBE\x78\xC6\xA4\xE9\xF3\x0A\x0A\xA7\x30\xE2\xC4\xF2\xCC\x68\x11\x93\x3F\xA1\x38\x7F\x42\xF1\x75\x2B\xEE\x6B\x6F\x6E" + 65 | "\x3C\x75\xFC\xE0\xF7\x47\xF7\xEE\xD8\xB1\x63\xE7\xCE\x1D\x63\xC7\x8E\xBD\xFE\xFA\x1B\x27\x4F\x9E\x1C\x4A\xB4\xE9\xE8\x68\x7F\xEE" + 66 | "\xB9\x67\x5B\x5B\x5B\x8B\x67\x5E\x75\xDD\x8A\xFB\x14\x4A\x75\xF0\xD0\xBC\x6B\x97\xBD\xFF\xBF\x4F\x6D\xDB\xB6\xB5\xB0\xB0\x70\xC2" + 67 | "\x84\x89\x09\xED\x36\xD9\xD3\xD3\xF3\xCD\x37\xDF\x20\x77\x8C\xC9\x64\x62\x18\x06\xAD\x1F\xF1\xBA\x01\xC7\x71\x15\x15\xE5\xDA\x8C" + 68 | "\x2C\x75\xAA\x0E\x42\x18\x16\x74\x55\xA7\x6A\x57\x3C\xF0\x3F\x6F\xBF\xF0\xC4\xC7\x1F\x7F\x64\x32\x99\x65\x32\xD9\xD6\xAD\x5B\xBF" + 69 | "\xF9\x66\xBB\xD7\xEB\x51\x26\x6B\x96\x2C\xBE\xA5\x64\xCE\x22\x85\x2A\x39\x5E\x9D\x89\x10\x00\x80\xB4\x2C\x43\x5A\x96\x61\xD1\x4D" + 70 | "\x2B\xAA\xCE\x9E\x3C\xBC\x6B\x4B\xC5\xD9\xB2\xF3\xE7\x9F\xCB\xCF\x2F\xB8\xF5\xD6\x5B\x0B\x0B\x27\xE1\x38\xEE\x76\xBB\x5F\x7B\xED" + 71 | "\x35\x6B\x6B\xDB\xAC\x85\x37\xCC\xF9\xC9\xCD\x0A\xA5\x1A\x42\xE8\x75\xBB\xA4\x72\x05\x86\x61\x0A\xA5\xFA\x96\x7B\x7E\xF9\xEA\x1F" + 72 | "\x1E\xDE\xB5\x6B\x57\x1C\x45\x08\x21\x14\x04\xA1\xAF\xAF\x0F\xAD\xBB\x10\xC2\xEE\xEE\x6E\xB2\xAB\xAB\xEB\xEB\xAF\xBF\x46\xFD\x06" + 73 | "\x00\xA4\xA6\xA6\xE6\xE5\xE5\x69\xB5\xDA\xBC\xBC\xBC\xF4\xF4\x74\x82\x20\x62\x9C\xCD\xBD\x5E\xAF\xCF\xE7\xD3\x66\xA5\x63\x38\xE0" + 74 | "\x79\x8E\xC4\x2F\xB8\x05\xAA\xCF\x96\xD5\x55\x9E\x59\x74\xD3\x8A\xB4\xCC\x9C\x05\x37\xDC\xB1\xE5\xD3\xB7\x5F\x7D\xF5\x15\xA7\xB3" + 75 | "\xB7\xB5\xB5\x4D\x9D\xA2\xB9\xE6\xD6\x7B\x4A\xE6\x2C\xA4\x45\x4C\x1C\x7E\x77\x0C\x20\x48\x72\xEC\xE4\x2B\xC6\x4C\x9A\xDA\xD2\x58" + 76 | "\xB3\x77\xCB\x86\x73\x27\x8F\x3C\xF7\xDC\xB3\x53\xA6\x94\xDC\x71\xC7\x1D\x7B\xF7\xEE\x2D\x2F\x3F\x3F\x69\xFA\xBC\xE9\x57\x2D\x61" + 77 | "\xC4\x12\x0C\xC3\x1C\xDD\xB6\xB7\x9E\x7F\xE2\xB1\xE7\xDE\x14\x89\x25\x18\x86\x69\x33\xB2\xB2\x8C\xF9\x95\x95\x15\x1C\xC7\xC5\x42" + 78 | "\x92\x13\x04\x01\x42\x68\xB3\xD9\xAA\xAB\xAB\x9B\x9B\x9B\x6B\x6B\x6B\x6D\x36\x1B\x92\x25\x3A\xE1\x87\xA6\x91\xB3\xB4\xA3\xA3\xA3" + 79 | "\xA3\xA3\x03\xC3\x30\x44\xC8\x30\x18\x0C\x39\x39\x39\x59\x59\x59\x41\xEE\x4C\x73\x73\xF3\x88\x62\x1A\x00\x60\x18\x06\xA0\x00\x31" + 80 | "\x01\xBA\x7A\x1D\x38\x41\x08\x82\x40\x10\x84\xD3\xD1\x5D\x5F\x71\xA6\x7B\xE6\x55\x72\xA5\xDA\x90\x3F\x4E\x99\x9C\x5A\x59\x59\x41" + 81 | "\x8B\x98\xAB\x6E\x58\x7E\xE5\x75\xB7\x89\x25\x97\x8C\x9B\xDB\x1F\x00\x80\x4C\x43\xDE\x5D\x0F\xFF\xDE\x52\x57\xF5\xCD\xFA\x0F\xBE" + 82 | "\xFD\xF6\x78\x59\xD9\x49\x08\x61\x5A\x96\x71\xDE\xE2\x5B\x00\x00\x00\x07\x18\x86\x55\x9F\x2D\x4B\xD1\xA6\x23\xF9\x61\x18\x46\x90" + 83 | "\x94\x5C\xA9\xEE\xE9\x68\xF1\xF9\x7C\x61\xB6\xF5\x60\x80\x10\x36\x34\x34\x04\x3D\x6A\x2C\xCB\x36\x37\x37\x5B\xAD\xD6\xEA\xEA\xEA" + 84 | "\x20\x89\xA4\x3F\x06\x7D\x3B\x78\x9E\xE7\x79\xBE\xAA\xAA\xAA\xAA\xAA\x2A\xEC\xD0\x88\xE2\x12\x12\x89\x54\x2A\x95\x38\x7B\x7B\x02" + 85 | "\x01\x3F\x4E\x10\xE5\x65\xC7\x77\x7D\xFD\xD9\xB8\xA2\xE9\xE6\xB1\x85\x1E\x97\xD3\xEB\x76\x7A\x5C\xBD\x5B\xBF\x78\xAF\xDB\xD6\xA6" + 86 | "\xCB\x34\x2C\xBF\xEF\xD1\x2C\x53\x41\xE4\x8D\x8F\x2E\x40\xB6\xA9\xE0\xBE\xDF\xBE\x70\xFA\xD8\x81\x6D\x5F\xAC\x75\xF4\x74\x11\x24" + 87 | "\xE9\xF3\xB8\x45\x8C\xD8\xE7\xF1\x08\xBC\x50\x76\x74\xDF\xA4\x2B\xE6\x04\xCF\x86\x02\xEF\x67\xFB\x70\x1C\x8F\xDC\x1F\xC9\xF3\x3C" + 88 | "\x9A\x11\x47\x84\x88\x06\x78\xD8\xEA\x38\xA2\x95\x92\x20\x08\xB3\xD9\x7C\xF8\xF0\x11\x8F\xAB\x57\xC4\x88\xC7\x16\x5D\xA1\xD5\x67" + 89 | "\x1D\xD9\xB5\xE5\xEB\x4F\xDF\xF1\xF7\xF9\x1A\xAA\xCB\xBF\x3B\xB8\xB3\xC3\x6A\x29\x99\xBD\xE8\xA6\x55\x0F\x30\xE2\xCB\x88\xD5\x39" + 90 | "\x20\x08\x82\x28\x9A\x79\x65\xEE\xB8\xC9\x9B\x3F\x79\xEB\xFB\x63\xFB\x3F\x7D\xFD\x85\xC5\xB7\xDD\x63\x2C\x18\x5F\x79\xFA\x44\xB7" + 91 | "\xAD\x5D\x6F\xCC\xED\x6A\x6F\x15\x4B\x65\x12\x99\xDC\xCF\xB2\x1D\x2D\x16\x8D\x46\x33\xA2\xA8\x40\xA8\x71\x15\x3A\x5B\x0E\x81\x41" + 92 | "\x45\x18\xC6\x43\x0C\xBE\x4A\x16\x8B\x65\xCF\x9E\x3D\x91\xF7\x09\xC3\xB0\x92\x92\xA9\x47\x8E\x1C\x39\x7B\xE2\xE8\xDC\x6B\x6E\xC2" + 93 | "\x00\x48\xD6\xA4\x5D\xBF\xE2\xFE\xBA\x8A\x33\xDF\xFC\xDF\x07\xDB\xD7\xBF\x8F\x61\x70\xE1\x8D\x2B\x16\xDE\xBC\x82\x24\xFF\x69\x82" + 94 | "\xC6\x72\xA5\x6A\xC5\x2F\x9E\x30\x8F\x2D\xDC\xF2\xD9\x3B\x9B\x3E\x7E\x7D\xDA\x95\x8B\x2B\x4F\x7F\xE7\x76\xD9\xDF\x7A\xEE\x71\x8E" + 95 | "\xE3\x48\x8A\x5E\x7C\xEB\xDD\x29\xBA\x0C\x7B\xB7\x6D\xC1\x95\xF3\x22\x6F\x96\x20\x88\xA5\x4B\x97\xE6\xE4\xE4\xA0\x8F\x7E\xBF\xBF" + 96 | "\xA9\xA9\xC9\x6A\xB5\x56\x55\x55\xB9\x5C\xAE\xE1\x27\x52\x1C\xC7\x71\x1C\x0F\xF2\x10\x73\x73\x73\x53\x53\x53\xFB\x5F\x10\x08\x04" + 97 | "\x46\xAA\xAF\x16\x15\x15\xA7\xA5\xA5\x9D\x3E\x7E\xB0\x70\xEA\x2C\xE5\x45\xBB\x22\xCB\x94\x9F\x9A\xA6\x6F\xAC\x29\x5F\x78\xD3\x4F" + 98 | "\x17\xDE\x78\x87\xC7\xE5\xEC\x6A\xB7\xF6\xDA\xBB\xFB\xBC\x6E\x8E\xE3\x48\x92\x92\xCA\x15\xAA\x14\xAD\x26\x5D\x9F\x68\x5B\x22\x42" + 99 | "\x08\x3C\xEF\x71\x3B\x3D\x2E\x27\x17\xF0\x13\x24\xC9\x88\xA5\x53\x66\x2F\xD0\xE9\xB3\x3F\x79\xFD\x85\xC3\x3B\x36\x8B\xA5\xB2\x45" + 100 | "\x37\xAD\xD0\xE9\x0D\x0A\xA5\x9A\x16\x31\x52\x45\xD2\x86\xB5\x6B\xC4\x62\xF1\x15\x57\x5C\x11\xF9\x2D\x90\xF3\xC5\x64\x32\x05\xBF" + 101 | "\x09\xFA\x4B\x1D\x0E\x47\x4D\x4D\x8D\xC5\x62\xA9\xAF\xAF\xB7\x58\x2C\xC8\xCB\x88\x0E\x91\x5A\xAD\x76\xC1\x82\x05\x38\x8E\xEB\xF5" + 102 | "\x7A\xBD\x5E\x9F\x88\x04\x03\xB1\x58\xBC\x6C\xD9\xAD\xAF\xBD\xF6\xEA\xAE\xCD\x9F\xDF\x70\xE7\x7F\xD1\x34\x03\x21\xDC\xBB\x6D\x83" + 103 | "\xA5\xB6\x42\xA6\x50\x36\xD6\x9C\xFF\xE3\x43\x77\xB8\x5D\xBD\xC8\x8F\x19\x66\x75\x10\x24\xA9\xD3\xE7\x14\x4C\x2C\x99\x3C\x63\x9E" + 104 | "\x4E\x9F\x8D\xE3\xA3\xCA\x6A\xF4\xB3\x6C\x63\xCD\xF9\xF3\x65\xC7\x1A\xAB\xCB\x6D\xAD\xCD\x6C\xDF\x8F\x22\x41\x04\x41\x28\x54\xC9" + 105 | "\x68\xF2\x67\x7D\x5E\x5B\x9B\x75\xDC\xE4\xE9\x8C\x44\x9A\xA4\x4E\xA9\x2D\x3F\x7D\xBE\xAC\x74\x6A\x49\x89\xD1\x68\x1A\xA4\xED\x91" + 106 | "\x41\xA9\x54\x96\x94\x94\x94\x94\x94\x60\x18\xC6\x71\x5C\x4B\x4B\x4B\x4B\x4B\x8B\x20\x08\x7B\xF6\xEC\x21\x93\x92\x92\xE6\xCC\x99" + 107 | "\x33\x6C\x13\x31\x62\xE6\xCC\x59\x65\x65\x27\x0F\x1C\x38\xB0\xFB\xAB\x2F\xAE\xBA\x61\x79\xC5\xA9\x6F\xCF\x7C\x7B\x18\x42\xE8\x76" + 108 | "\x3A\xEA\x2B\xCE\x28\x95\xCA\xB1\x25\x53\xB3\xB2\x32\x53\x53\x35\x72\xB9\x1C\xCD\xA8\x2C\xEB\xB3\x5A\x5B\xCF\x9D\x3B\x57\x5B\x5B" + 109 | "\xB3\xD7\x52\xB7\x6F\xFB\x86\xFC\xF1\x45\x57\xDD\x70\x7B\x4E\xDE\xB8\x51\xF0\x5A\x79\x3D\xAE\x6F\xF7\xEF\x38\xBA\x67\x5B\x57\xBB" + 110 | "\x15\x00\x40\x51\x94\x46\xA3\x49\x4F\x9F\xA0\x52\xA9\x68\x5A\x24\x08\xBC\xCF\xE7\xEB\xEA\xEA\x6A\x6A\xB2\x74\xB6\x75\xA3\x34\xB9" + 111 | "\x13\x87\x76\xF1\x01\xFF\x15\xF3\x17\xFB\x3C\xEE\x6D\x5F\xAC\x65\x44\xA2\x9B\x6F\xBE\x39\x11\x7E\x73\x92\x24\x73\x72\x72\xD0\x7C" + 112 | "\x7B\xF2\xE4\xC9\x51\xF2\x91\xE2\x38\x7E\xEF\xBD\x3F\xB7\xDB\x1D\xA7\xBF\x3B\x54\x5F\x75\xC6\xE3\x76\x01\x0C\xCB\xCD\xCD\xBD\xF2" + 113 | "\xCA\xAB\xAE\xB8\x62\x1A\xA2\xEA\x30\x0C\x23\x12\x89\x44\x22\x11\x4D\xD3\xA1\x93\x81\xCD\x66\xDB\xBD\x7B\xD7\xFA\xF5\x5F\x9C\x3D" + 114 | "\x5B\x56\x7D\xFE\xD4\xD4\x39\x8B\x7E\x72\xEB\x2A\x99\x22\x51\x6C\x1D\x9E\xE7\xCF\x7E\x77\x78\xFB\xFA\xF7\xBB\x6D\x6D\x12\x89\x64" + 115 | "\xFE\xFC\x2B\xE7\xCE\x9D\x57\x58\x58\xA8\x54\x2A\x69\x9A\x96\x48\x24\x88\xCB\x8B\x5E\x23\x8E\xE3\x2C\x16\xCB\x89\x13\xDF\xED\xDB" + 116 | "\xB7\xEF\xE0\xC1\x03\x65\x47\xF7\x9D\x3B\x59\xAA\x49\xCF\x6A\x69\xA8\x5E\xB2\xE4\xDA\xDC\xDC\xFC\x04\x75\x32\x14\xA3\x97\x97\x25" + 117 | "\x95\x4A\x8B\x8B\x8B\xCB\xCB\xCF\x7B\x5C\xCE\x09\x13\x26\xAC\x5C\xB9\x6A\xD2\xA4\x49\x24\x49\x4A\xA5\x52\xB9\x5C\x3E\x44\xE0\x49" + 118 | "\xA3\xD1\xDC\x71\xC7\x8A\xDB\x6E\x5B\xBE\x67\xCF\xEE\x97\x5E\x7A\xA9\x74\xEF\xF6\xC6\x9A\xF2\xDB\xFF\xEB\x37\x7A\x83\x39\xEE\x9D" + 119 | "\xEC\xF3\x7A\xB6\x7E\xB1\xF6\xF8\xBE\x7F\xD0\x34\x75\xF3\xCD\x4B\x6F\xBD\xF5\x36\xAD\x56\x8B\xE3\xB8\x54\x2A\x55\x28\x14\x41\xE3" + 120 | "\x38\x08\x92\x24\x4D\x26\x93\xC9\x64\xBA\xED\xB6\xE5\x5D\x5D\x5D\x1B\x36\xFC\xDF\x07\x1F\x7C\xD0\x5C\x5F\x25\x12\x89\x26\x4E\x4C" + 121 | "\xAC\x5F\x2D\x88\x0B\x59\x4B\x41\x12\x54\x82\xC0\xF3\xFC\xBA\x75\xEB\x3E\xFE\xF8\x23\x86\x61\x1E\x79\xE4\xB1\x97\x5F\x5E\x53\x5C" + 122 | "\x5C\x2C\x97\xCB\xF5\x7A\xBD\x56\xAB\x95\x48\x24\xC1\xFC\x95\xC1\xBA\x41\x10\xC4\xA2\x45\x57\x6F\xDA\xF4\xD5\xAA\x55\x77\x77\xB5" + 123 | "\xB7\xBC\xF7\xBF\xFF\xAF\xAE\xE2\x4C\x7C\x3B\xE9\xEA\xB5\x7F\xFC\xEA\xB3\xA5\x7B\xB6\x9B\xCD\xA6\x35\x6B\x5E\x79\xE8\xA1\x5F\xEA" + 124 | "\x74\x3A\x99\x4C\xA6\xD7\xEB\x35\x1A\x4D\x50\x7E\x48\xD7\xEF\xDF\xCF\x94\x94\x94\x5F\xFC\xE2\x81\x9D\x3B\x77\xAD\x5C\x79\x17\xCF" + 125 | "\xF3\x7F\xF9\xCB\xCB\xBB\x77\xEF\x4E\xD0\x53\x85\x21\x20\x1B\x1A\x1A\x9E\x7A\xEA\x29\x1C\xC7\xB3\xB3\xB3\xF5\x7A\xBD\xC9\x64\x42" + 126 | "\x59\x93\x71\x9C\xC4\x05\x41\xF8\xF8\xE3\x8F\xB6\x6F\xDF\xA6\xD7\xEB\x9F\x7C\xF2\x69\xB3\xD9\x0C\x00\x48\x4E\x4E\x56\x28\x14\xC1" + 127 | "\xBB\x58\x2C\x96\xAF\xBE\xDA\x54\x5E\x5E\x2E\x16\x8B\xAF\xB9\xE6\x27\x0B\x16\x2C\x18\x90\x05\x29\x97\xCB\xFF\xF0\x87\x67\x72\x72" + 128 | "\x0C\x7F\xFE\xF3\x0B\x9F\xBE\xF1\xC2\xBD\x8F\xFD\x51\x6F\xC8\x8D\x4B\x27\x3D\x6E\xE7\x67\x6F\xBE\x58\x73\xEE\xFB\x39\x73\xE6\xFE" + 129 | "\xFA\xD7\xBF\x96\xCB\x15\x04\x41\x24\x27\x27\x87\x3A\x56\x38\x8E\x3B\x7C\xF8\xD0\xC6\x8D\x1B\x1B\x1A\x1A\x52\x52\x52\x96\x2D\x5B" + 130 | "\xF6\x93\x9F\x2C\x0E\x5B\x98\xD5\x6A\xF5\x1F\xFF\xF8\xA7\x59\xB3\x66\x3D\xF1\xC4\x6F\xDE\x7D\xF7\x6D\x96\xF5\x2D\x59\x72\x5D\x5C" + 131 | "\x7A\x88\x98\x09\xC8\xC7\x66\xB5\x5A\x1B\x1B\x1B\x05\x41\x70\x38\x1C\x24\x4A\xB0\xC0\x30\xAC\xBD\xBD\x3D\xC8\x40\x44\xE1\x7B\x64" + 132 | "\x60\xA4\xA4\xA4\xC4\x28\xCE\x6D\xDB\xB6\x7C\xF3\xCD\xF6\x9C\x9C\x9C\xE7\x9E\x7B\x5E\xA7\x4B\x43\xE9\x7D\xC1\x88\x28\x84\xF0\xE3" + 133 | "\x8F\x3F\x5A\xBD\x7A\xB5\xDB\x7D\xA1\xF0\xC1\xE6\xCD\x5F\x3D\xF8\xE0\x43\x8F\x3E\xFA\x28\x41\x0C\x30\xCF\xE3\x38\x7E\xF7\xDD\x77" + 134 | "\x63\x18\x7C\xFE\xF9\xE7\xD6\xBF\xFB\xF2\x7D\xBF\x79\x2E\x76\x3F\x78\x20\xE0\xDF\xFA\xD9\xBB\xD5\x67\xCB\xE6\xCF\xBF\xF2\xF1\xC7" + 135 | "\x7F\x23\x16\x8B\x29\x8A\xD2\x6A\xB5\xA1\x56\xB9\xD3\xE9\x7C\x77\xED\xDA\xC2\x92\x69\xE9\x59\x86\x2D\x5B\xBE\x86\x10\x1E\x3C\x78" + 136 | "\xE0\x89\x27\x9E\xB8\xFF\xFE\xFF\xEE\xDF\xC3\x6B\xAE\xF9\x89\x46\xA3\xB9\xEF\xBE\x9F\xAF\x5B\xB7\x2E\x29\x49\x89\x82\x30\x51\x00" + 137 | "\x42\x18\xE4\x21\x22\x73\xA2\x3F\x0F\x31\xFC\x19\xA1\xC3\x16\x8B\xC5\x62\xB1\x60\x17\xB9\x8E\xB9\xB9\xB9\x41\xD3\xDE\xE9\x74\x8E" + 138 | "\xA8\x4E\xC8\xB9\x73\xE7\xD6\xAF\x5F\x9F\x9C\x9C\xFC\xF4\xD3\xCF\xE8\x74\x69\x38\x8E\x6B\xB5\xDA\xD0\x38\xEA\x97\x5F\x6E\x78\xFB" + 139 | "\x9D\xB7\x5F\x7B\xE7\x7D\x97\xCB\xF9\xFB\xC7\x1F\x71\xB9\x5C\x10\xC2\x0F\x3E\x78\x7F\xC9\x92\x25\x63\xC7\x8E\x1B\xB0\x4D\x00\xC0" + 140 | "\x5D\x77\xAD\xB2\x5A\xAD\xEF\xBD\xB7\xF6\x1F\x7F\x5B\xB7\xF4\x9E\x87\x06\x14\x76\xE4\x38\x71\x68\xF7\x89\x43\xBB\x0A\x0B\x0B\x1F" + 141 | "\x79\xE4\x11\xB1\x58\x4C\x92\x64\x98\xFC\x02\x81\xC0\x73\xCF\x3D\xCB\x72\xC2\x7D\xD3\x67\xA6\x67\xE8\x3F\xFE\xE0\x5D\xAF\xC7\xC3" + 142 | "\x71\xDC\xDA\xB5\xEF\x5D\x7F\xFD\x8D\x69\x69\x69\xFD\xDB\x2C\x2A\x2A\x7E\xF3\xCD\xB7\xEE\xB9\xE7\xEE\xB5\x6B\xDF\xD5\xEB\x33\x83" + 143 | "\x06\xFB\x10\x10\x04\x61\xC7\x8E\x1D\xA5\xA5\xA5\xE8\xA3\xDF\xEF\xAF\xAB\xAB\x0B\xE6\x4A\x0E\x86\x61\x7E\xB9\x20\x08\x6E\xB7\xFB" + 144 | "\xFB\xEF\xBF\x0F\xFD\x32\x72\x1F\xA9\xC7\xE3\x79\xFF\xFD\xB5\x82\x20\xFC\xE6\x37\x4F\x64\x65\x65\x61\x18\xA6\x56\xAB\x43\xE5\xE7" + 145 | "\x70\xD8\x5F\x7F\xFD\x35\xAD\x2E\x7D\xEC\xF8\x89\x10\x42\xA5\x4A\x8D\x8A\x90\x78\x3C\x9E\x6F\xBF\xFD\x6E\x30\x11\x62\x18\x46\x10" + 146 | "\xC4\xC3\x0F\xFF\xEA\xCC\x99\x33\x27\x0E\xEF\x1E\x57\x3C\x7D\x5C\xD1\xB4\x08\xBB\xD4\x1F\x1D\xAD\xCD\x3B\x37\xAE\x4B\x4E\x4E\x79" + 147 | "\xF4\xD1\x5F\xCB\xE5\x0A\x34\xC9\x87\x79\xC5\xAA\xAA\x2A\x37\x6D\xDA\x28\x96\x48\xB2\xDF\xCE\x39\x77\xF6\x8C\xF7\x62\x2E\x84\xC3" + 148 | "\xE1\xA8\xA8\xA8\x18\x50\x84\x18\x86\x95\x94\x4C\x7D\xF6\xD9\xE7\x1F\x79\xE4\xE1\x77\xDE\x79\xFB\x99\x67\xFE\x38\xAC\xB3\x54\x10" + 149 | "\x84\x8A\x8A\x8A\x91\xF6\x7F\x18\x11\xE2\x38\x4E\x92\xA4\x42\xA1\x08\xDE\x9E\x65\xD9\xC8\x47\xE1\x3F\xFE\xF1\xF7\xA6\xA6\xA6\x9B" + 150 | "\x6F\x5E\x3A\x69\xD2\x64\x0C\xC3\x24\x12\x49\x58\xEA\x4C\x4D\x4D\x6D\x67\x67\x67\x73\x4B\xCB\x8B\x7F\x7A\xD2\xEB\xF1\xB6\xB6\x5A" + 151 | "\x83\x87\x86\xAD\x46\xA2\x50\x28\x7E\xFD\xEB\x5F\xDF\x73\xCF\x3D\xFB\xB6\x6D\x30\x8D\x99\x10\x9D\x13\x47\x10\xF8\x03\xDF\xFC\xCD" + 152 | "\xED\x74\xFC\xF2\x97\x0F\xA3\x97\x4C\x26\x93\xC9\x64\xB2\xB0\xD3\xCA\xCB\xCB\x59\x96\x65\x59\x76\xCD\x4B\x2F\x86\x7E\x3F\xB4\x1B" + 153 | "\x13\x00\xB0\x64\xC9\x92\x03\x07\xF6\x6F\xDE\xFC\xD5\xEE\xDD\xBB\x16\x2F\x5E\x32\x74\x67\xC2\xDE\x1E\xBF\xDF\xEF\x74\x3A\x51\xBC" + 154 | "\x61\x88\xAB\x06\x10\x21\x45\x51\x41\x1E\x62\x56\x56\x56\x18\x0F\x11\x25\x6A\x0F\xDD\x15\x04\x87\xC3\xF1\x8F\x7F\xFC\x3D\x39\x39" + 155 | "\xF9\xB6\xDB\x6E\x43\x71\x47\xB5\x5A\x1D\xB6\xAC\x92\x24\x89\xE3\x38\xCF\x71\x5F\xFD\xED\xCB\xB0\xCB\x93\x93\x87\x5F\xE1\xA6\x4C" + 156 | "\x29\x59\xB8\x70\xE1\xE6\xAF\x37\xD7\x9C\x3F\x35\x61\xCA\xCC\x48\x7A\x15\x86\xF6\x96\xC6\x33\xDF\x1E\xCA\xCF\xCF\x5F\xB8\x70\x21" + 157 | "\xEA\xCF\x80\x35\x4C\xA4\xD2\x70\xA1\x5E\xFC\x5E\x9A\x95\x95\x39\x44\xFB\x14\x45\x3D\xF2\xC8\xA3\xFB\xF6\xED\xFD\xFA\xEB\xAF\xE7" + 158 | "\xCC\x99\xDB\xFF\xE5\x08\x05\x41\x10\xA1\x89\xDA\x18\x86\xF9\x7C\xBE\xC6\xC6\xC6\x86\x86\x06\x94\x47\x11\x08\x04\x02\x81\x40\xD8" + 159 | "\x55\x24\x76\x31\x10\xA1\xD5\x6A\xF3\xF3\xF3\x91\x8F\x2E\x2E\x39\x82\x47\x8F\x1E\xE9\xE9\xE9\xB9\xEB\xAE\x55\xC9\xC9\x29\x18\x86" + 160 | "\x49\xA5\xD2\xFE\x33\x49\x6E\x6E\xAE\x56\xAB\xED\x5F\xC1\x89\x61\x98\x49\x93\x26\x0D\x7B\x0B\x82\x20\x56\xAC\xF8\xE9\xCE\x9D\x3B" + 161 | "\xBE\x3B\xB0\x73\xEC\xA4\x2B\x88\x91\x7B\x07\x4F\x1E\xDE\xCB\xFA\xBC\x37\xDC\x70\xA3\x58\x2C\xC1\x30\x4C\x2E\x97\x0F\xA8\x09\x17" + 162 | "\x16\x16\x6A\xB5\x5A\x14\x49\x0D\x45\x71\x71\x91\xD9\x3C\x8C\x4A\xAC\xD7\xEB\x97\x2F\xBF\xFD\xED\xB7\xDF\x3A\x7A\xF4\xC8\xA2\x45" + 163 | "\x57\x8F\xA8\x7B\x62\xB1\x78\xCC\x98\x31\x48\xA8\x10\xC2\xAE\xAE\xAE\x9A\x9A\x1A\x24\xCE\x8E\x8E\x8E\x0B\x46\x45\x5E\x5E\x5E\x22" + 164 | "\x48\x88\x82\x20\xEC\xDF\xBF\x5F\x2C\x16\x2F\x5A\xB4\x08\xF1\x01\x92\x92\x92\xFA\xBF\x16\x32\x99\x6C\xD5\xAA\x7B\xFE\xF0\x87\xA7" + 165 | "\xC2\xE8\xAD\xB3\x66\xCD\x0E\xE6\x98\x0F\x8D\xC2\xC2\xC2\xF1\xE3\x27\x9C\xAF\x28\xEF\xB6\xB5\x6A\xD2\xB3\x46\xD4\x49\xB7\xD3\x51" + 166 | "\x71\xEA\xDB\xB4\xB4\xB4\x29\x53\x4A\x30\x0C\x23\x08\x62\xB0\x51\x92\x91\x91\xF1\xE8\xA3\x8F\x3D\xF5\xD4\x93\xA1\x05\x9A\xF4\xFA" + 167 | "\xCC\xFF\xF9\x9F\xDF\x0F\xEB\xED\xC3\x71\x7C\xF9\xF2\xDB\x3F\xFC\xF0\xC3\xBD\x7B\xF7\x2C\x58\xB0\x30\x6A\xEF\x20\xE2\x54\xA4\xA6" + 168 | "\xA6\xCE\x98\x31\x23\xF8\xE5\x9A\x35\x6B\x12\xE5\x6C\xB4\x58\x2C\x56\x6B\x4B\x51\x51\x71\x4A\x4A\x2A\x86\x61\x0C\xC3\x0C\xB6\x98" + 169 | "\xDF\x7E\xFB\xED\x2B\x57\xAE\x0C\xF5\xA8\x65\x64\x64\x3C\xF1\xC4\x6F\xFB\xBB\x42\x06\x04\x4D\xD3\x0B\x16\x2C\x70\xF5\x3A\x1A\x6B" + 170 | "\x46\xAC\x08\xB4\xB7\x58\x3A\xDB\x9A\x8B\x8A\x8A\xD5\x6A\x35\x86\x61\x62\xB1\x78\xB0\x4E\x02\x00\x96\x2F\xBF\xFD\x93\x4F\x3E\x5D" + 171 | "\xB2\x64\x89\xC1\x60\xC8\xCB\xCB\x5B\xB1\xE2\xA7\x5F\x7C\xB1\x3E\x2F\x2F\x2F\x92\x1B\x65\x64\xA4\xCF\x9E\x3D\xCB\x62\xB1\x24\x82" + 172 | "\x08\x9F\x28\x07\x5B\x65\x65\x85\xCF\xE7\x9B\x36\x6D\x1A\x92\x4D\xD0\xFF\xD2\x1F\x14\x45\x3D\xFD\xF4\x33\xF3\xE7\x5F\xB5\x79\xF3" + 173 | "\x57\x36\x5B\x47\x5E\x5E\xFE\xDD\x77\xDF\x83\x34\x8B\x08\x51\x52\x52\x22\x93\xC9\xEA\x2A\x4E\x4F\x9D\x3B\xB2\x69\xAA\xAE\xE2\x0C" + 174 | "\x84\xB0\xA4\x64\x2A\xFA\x38\x74\xF1\x25\x00\xC0\xB4\x69\xD3\xA7\x4D\x9B\x3E\xA2\x5B\x20\x50\x14\xBD\x70\xE1\xA2\x5D\xBB\x76\x9D" + 175 | "\x3B\x77\x36\x12\xEB\x62\x44\x48\x94\x08\x2B\x2A\x2A\x70\x1C\x2F\x2C\x2C\x44\x1F\x87\xA6\x36\x03\x00\xE6\xCE\x9D\x3B\x77\xEE\xDC" + 176 | "\xE8\xEE\x95\x99\x99\xA5\xD1\x68\xDA\xAD\x4D\x7D\x3E\x6F\xE4\x71\x7F\x81\xE7\x9B\xEB\xAB\x94\x4A\x25\xD2\x47\x48\x92\x4C\x68\xD2" + 177 | "\xDD\xF4\xE9\x33\x70\x1C\x2F\x2F\x2F\xBF\xF6\xDA\xF8\x38\x6B\x82\x20\xBD\x5E\x6F\x65\x65\x25\x8E\xE3\xE9\xE9\xE9\x28\xD9\x33\x76" + 178 | "\x45\x06\x42\xD8\xD0\x50\x9F\x96\x96\x96\x94\xA4\xC4\x2E\xAA\xB8\xF1\xE8\xED\xC0\x50\xAB\xD5\x3A\x9D\xAE\xA2\xBA\xD6\xE3\xEA\x8D" + 179 | "\x5C\x84\x5E\x8F\xDB\xDE\x65\x53\x2A\x55\xA9\xA9\x1A\x0C\xC3\x08\x82\x48\x68\x31\x36\xB5\x5A\x65\x30\x18\x10\xAD\x39\x96\x60\x19" + 180 | "\x32\x63\x7C\x3E\x5F\x5B\x5B\x1B\xCF\xF3\x1E\x8F\x87\xB4\x5A\xAD\xAF\xBC\xF2\x0A\x76\x71\xB5\x34\x9B\xCD\x3A\x9D\x2E\x46\x06\xA2" + 181 | "\xC7\xE3\x71\xB9\x5C\xB9\xB9\x79\x68\x69\x41\x96\x43\xD4\x9D\x1E\x16\x38\x8E\xEB\xF5\x99\x65\xDF\x9F\xEA\xF3\x8E\xA0\xFA\x80\xCF" + 182 | "\xE3\x72\xBB\x7A\x33\xF3\x2E\xD4\x6F\xA3\x28\x2A\xA1\x39\x31\x34\x2D\xCA\xCE\xCE\x3E\x76\xEC\x78\x6F\x6F\xEF\x48\x6B\x2F\x0A\x82" + 183 | "\x20\x08\x82\xCD\x66\x43\xEA\x68\x6D\x6D\x6D\x67\x67\x27\x76\xD1\xD9\xFD\x43\xA2\x36\x86\x61\xED\xED\xED\xED\xED\xED\xD8\x8F\x19" + 184 | "\x88\x06\x83\xC1\x68\x34\x86\xDA\x9B\xC3\xDE\xB2\xB7\xB7\x97\xE3\x38\x95\x4A\x85\xDE\xEB\x51\xA8\x19\x9C\x9C\x9C\x1C\xF0\xFB\xFD" + 185 | "\xFE\x11\xD4\xF3\xEC\xEB\xF3\xFA\xFB\x7C\x6A\xF5\x05\xEB\x33\xD1\xF5\x10\x29\x8A\xD2\x6A\x75\x3C\xCF\xD9\xED\xF6\xC1\x44\x88\x4A" + 186 | "\x57\x04\xF3\xB3\x58\x96\x6D\x68\x68\x68\x6C\x6C\x44\x3C\xC4\xC1\x4A\x20\x0F\xDC\xEF\x50\x06\x22\x00\x00\xC7\xF1\xD0\xA0\x49\x52" + 187 | "\x52\xD2\xD0\xDD\xF5\xF9\x7C\x82\x20\xC8\x64\x52\x34\xF8\x46\x21\xC8\x2E\x91\x48\x04\x81\x0F\x8C\x44\x84\x9C\xDF\xCF\x71\x5C\x70" + 188 | "\x91\x4E\x74\x27\x01\x00\x2A\x95\x5A\x10\x84\x21\x0A\x95\xF0\x3C\xFF\xF6\xDB\x6F\x87\x5E\x32\x60\x54\x2B\x0C\xC3\xBF\x7A\xA1\x4C" + 189 | "\x9B\xE0\x37\x43\x5F\xC2\xF3\x3C\x84\x90\xA2\x46\x2F\x9F\x1B\xFE\x98\x77\x13\x09\x04\x41\xC0\x42\x12\x04\x46\x21\xB3\x50\x2C\x66" + 190 | "\x20\x84\x1C\x17\xEE\x5E\x09\xEF\xD5\x08\x31\x94\x08\x49\x92\x64\x18\x26\x2F\x2F\x2F\x33\x33\x33\xE8\xB3\xB0\xD9\x6C\xE7\xCF\x9F" + 191 | "\x1F\xBA\x51\x1C\x07\x18\x86\xF1\xFC\x05\x6B\x7D\x14\x6A\xD6\x79\x3C\x6E\x9C\x20\x28\x7A\x64\x8C\x4D\x9C\x20\x82\xB3\xD6\x28\x74" + 192 | "\x72\xD8\x5B\xA0\x2C\x5F\xAD\xF6\x42\xF2\x17\xC7\x71\x6D\x6D\x6D\x55\x55\x55\xA8\x06\xE2\x60\x97\xFF\x48\x84\x88\x87\x98\x91\x91" + 193 | "\x81\xD4\x19\xB3\xD9\xAC\xD1\x68\xC2\x2E\xA8\xAC\xAC\x1C\xD6\x9B\x8E\xA8\x25\x5E\xAF\x17\xE5\xC1\xA0\xD9\x20\xA1\xAF\xB9\xCD\xD6" + 194 | "\x49\x8B\x18\x91\x68\x04\x79\x9D\x24\x2D\xA2\x45\x22\x87\xC3\x8E\x3E\x86\xB9\x87\x12\x01\x8F\xC7\x83\xAA\xF1\x0F\x76\x02\xCA\xB5" + 195 | "\x0F\x4B\xD4\xC6\x2E\x32\x10\x5B\x5A\x5A\x50\xE0\x30\x2C\xF5\x9E\x54\xAB\xD5\x85\x85\x85\xA8\x12\x62\x30\x64\x1F\x63\x5F\x51\xC8" + 196 | "\x1B\x29\x35\x14\x45\xA1\x3A\xFE\x89\x13\x21\xC7\x71\xCD\xCD\x4D\x12\xA9\x9C\x19\x49\x61\x64\x11\x23\x66\x24\xB2\xAE\xAE\xAE\x40" + 197 | "\x20\x40\x51\x54\x7F\xF7\x71\x7C\x21\x08\x42\x4F\x4F\x37\x8E\xE3\x43\x7B\xBA\x07\x44\x18\x03\xB1\xA9\xA9\xA9\xAE\xAE\xAE\xA7\xA7" + 198 | "\x07\x42\x78\xE6\xCC\x19\x32\x25\x25\x65\xF9\xF2\xE5\xF1\xED\x6E\x52\x52\x92\x58\x2C\xB6\xD9\x6C\x7E\xBF\x1F\x3D\x1D\x9E\xE7\x13" + 199 | "\xA7\x2F\xD8\x6C\x36\x9B\xCD\x96\xA4\x4A\x96\xC9\xC3\xF5\x2C\x28\x08\xF0\x62\xD2\x56\xD8\x21\x86\x11\xCB\x15\x4A\x87\xA3\xBB\xBB" + 200 | "\xBB\x5B\xA7\xD3\x71\x1C\xC7\xF3\x7C\xE2\xEC\xD7\x40\x20\x60\xB5\xB6\x52\x14\x85\x9C\x79\x51\x83\x24\x49\xA3\xD1\x68\x34\x1A\xD1" + 201 | "\xC7\xB6\xB6\xB6\x84\x68\xD2\xC8\x50\xAB\xA8\x28\xF7\xF9\x7C\x52\xA9\x54\x10\x04\x96\x65\x13\x57\xA4\xCD\x62\x69\xB4\xD9\x6C\x53" + 202 | "\x66\x4F\x0A\xAE\x85\x01\x3F\x5B\x5F\x79\xB6\xE6\xFC\xA9\xAE\x76\x6B\x20\xE0\x97\x29\x92\xD2\x32\x8D\xF9\x13\x8B\x75\x19\xD9\xE0" + 203 | "\xE2\x9B\x04\x70\x22\x35\x2D\xF3\xB4\xA5\xB6\xB5\xD5\x8A\x44\xE8\xF7\xFB\xA3\xA8\xF1\x1D\x21\x58\x96\xB5\x58\x1A\x55\x2A\xD5\x60" + 204 | "\x71\xAB\xA8\x91\x28\x63\xC8\x6C\xCE\x2D\x2B\x3B\x59\x5F\x5F\x8F\x8A\x7F\x79\x3C\x9E\xC4\xD5\x93\x38\x7A\xF4\x28\xCB\xB2\xE6\x71" + 205 | "\x93\x30\x0C\x83\x10\x96\x7F\x7F\x6C\xEB\x67\xEF\xDA\xDA\x5A\xD0\x51\x80\x61\x18\x00\x10\x42\xFC\x0B\x62\x5C\xF1\xF4\xA5\xAB\x1E" + 206 | "\x0C\x72\x6D\xB2\xCD\x05\x27\x0E\xED\x3C\x75\xEA\x54\x51\x51\x31\x84\xD0\xEB\xF5\x26\x4E\x84\x1D\x1D\x1D\x56\xAB\x75\xEE\xDC\x79" + 207 | "\x71\x7F\x08\x89\x9A\xDC\x0A\x0A\xF2\x29\x8A\xFA\xEE\xBB\x6F\x91\x1E\xE5\xF3\xF9\x22\x29\x7C\x1E\x05\xDC\x6E\xD7\xDE\xBD\x7B\x95" + 208 | "\xC9\x1A\xBD\x21\x0F\xC3\xB0\xAA\xB3\x27\x3F\x7D\xFD\x85\xAE\x8E\x56\x65\x92\x32\x3B\x2B\x6B\x52\x61\xE1\x15\x53\xA7\x4E\x1C\x3F" + 209 | "\x3E\x53\xAF\x97\xCB\x65\x67\xBF\x3B\xBC\x69\xDD\x9B\x48\x17\xC0\x71\x3C\x35\x4D\xAF\x50\xAA\x8F\x1F\x3F\x86\x6A\x2E\x79\xBD\xDE" + 210 | "\xD8\xB7\x0F\x1A\x0C\x47\x8F\x1E\x01\x00\xF4\x57\x55\x62\x07\xD9\xD9\xD9\xF9\xF9\xE7\x9F\x23\x75\x06\xB1\xD6\xE2\xE2\x6A\xCA\xCB" + 211 | "\xCB\x57\x28\x14\x27\x4E\x7C\xE7\xF1\x78\x64\x32\x19\xCF\xF3\x6E\xB7\x3B\x11\x05\x13\x8F\x1D\x3B\x5E\x55\x55\x59\x38\x7D\x9E\x2A" + 212 | "\x25\x15\x00\xF0\xDD\xC1\x9D\x01\x3F\x9B\x91\x9E\x21\x95\x48\x14\x0A\x05\x4D\x53\x18\x86\x89\x44\x22\x8F\xC7\x93\xA5\xD7\x37\x61" + 213 | "\x58\x6B\x63\xAD\xCB\xD1\x93\xA4\x4E\x21\x29\x5A\xA1\x4C\xCE\x34\xE6\xD7\x9C\x3B\x79\xEE\xDC\xB9\xA9\x53\xA7\x06\x02\x01\xAF\xD7" + 214 | "\x1B\x85\xBA\x31\x2C\xFC\x7E\xFF\xDE\xBD\x7B\x44\x22\xD1\x10\x6C\xA0\x48\x80\x6A\x58\xB6\xB4\xB4\xA0\xAA\x50\x28\xFB\x97\xB4\xDB" + 215 | "\xED\x07\x0E\x1C\x40\x67\x84\xD5\x40\x44\x0C\x44\x2C\x2A\xB3\x17\x71\xB7\x77\xEE\xDC\x59\x59\x59\x81\x02\xAA\xBD\xBD\xBD\x32\x99" + 216 | "\x2C\xBE\x7E\x2C\xBF\x9F\x5D\xB7\xEE\x63\x0C\x80\xA9\x73\xAE\x06\x00\x87\x18\x84\x82\x80\x5D\xAC\xFB\x0F\xE1\x85\x21\x45\xD3\x74" + 217 | "\xA6\x5E\xDF\x6D\xB7\xB3\x2C\xEB\xF1\xFA\x76\x7E\xF5\xE9\xD5\x4B\x57\x4A\xE5\x49\x24\x49\x4D\x28\x99\x55\x79\xFA\xBB\x6D\xDB\xB6" + 218 | "\x4C\x99\x32\x05\xC7\x71\x87\xC3\x21\x91\x48\xE2\xAE\x79\x59\xAD\xD6\xD2\xD2\x52\xA3\xD1\x88\xAA\x31\x47\x8E\x60\x91\x4A\x64\x4E" + 219 | "\x20\x7F\x5B\x18\x0F\xF1\x47\x0F\x34\xAC\x06\x22\x41\x10\x0C\xC3\xE4\xE6\xE6\x66\x65\x65\x85\x9A\xF6\x11\xCE\x36\xB3\x67\xCF\x3D" + 220 | "\x70\xE0\xC0\xD6\xAD\x5B\x0A\x0B\x27\x21\xD3\xA2\xA7\xA7\x27\x35\x35\x35\x8E\x8B\xC1\xDE\xBD\xFB\x4A\x4B\x8F\xE6\x8D\x2F\xCE\x32" + 221 | "\x17\x40\x28\xEC\xDF\xBE\xE9\x7C\xD9\x31\x41\x10\xDA\x3A\xDA\x33\xD2\xD2\x71\x1C\xC7\x71\x82\xA2\x2E\x04\x2C\xAD\xAD\xAD\x2C\xCB" + 222 | "\x4A\xC4\xE2\xD2\x3D\xDB\x6B\xCF\x9F\x59\xF5\xC8\x53\x52\x99\x22\x3D\xCB\x94\x69\xCA\x3F\x71\xE2\xC4\xF7\xDF\x97\x15\x17\x4F\x61" + 223 | "\x59\xD6\x6E\xB7\x47\x42\xDB\x89\x1C\x10\xC2\xBF\xFD\xED\x4B\xBF\xDF\x3F\x6F\xDE\xFC\xA1\x7F\xBB\x20\x08\x27\x4F\x9E\x44\xD5\xEF" + 224 | "\x31\x0C\xE3\x38\xAE\xB5\xB5\x15\x6D\x2D\x36\xC4\x32\x34\xD4\x98\x40\xB1\x8C\x53\xA7\x4E\x9D\x3A\x75\x2A\xF4\xFB\x08\xE7\xC3\xB1" + 225 | "\x63\xC7\x9A\x4C\xE6\xD2\xD2\xD2\x9A\x9A\x6A\x34\x81\xB8\x5C\x2E\x9A\xA6\x07\x64\x60\x44\x81\xAE\xAE\xCE\x35\x6B\x5E\x06\x04\x39" + 226 | "\xFF\xBA\x5B\x29\x8A\x3E\xB6\xFF\xEF\xDF\xFC\xDF\x07\x0A\x99\xD8\x38\xC6\x74\xEA\x7C\x55\x53\x73\x93\x4C\x26\x97\xC9\xA4\x0C\xC3" + 227 | "\xF0\x82\x60\xB3\xD9\x7C\x3E\xDF\xCC\xA9\x93\xEF\x5F\xB9\xEC\x1F\x7B\x8F\x7C\xB9\x65\xC7\x27\xAF\x3F\x7F\xF7\xAF\x9E\xA6\x45\xA2" + 228 | "\xA9\x73\xAF\xD9\xF8\xE1\x2B\x1F\x7E\xF8\x61\x41\xC1\x18\xA9\x54\xDA\xDB\xDB\x4B\xD3\x74\x84\xD9\xF1\x91\xA0\xB3\xB3\xF3\xCB\x2F" + 229 | "\x37\xA8\xD5\xEA\xE9\xD3\x67\x0C\x7D\xA6\x20\x08\x87\x0E\x1D\x1A\x69\xFB\xC3\x9B\x41\x04\x41\xA0\x80\x1F\x02\x2A\x4F\xAA\x52\xA9" + 230 | "\x90\x18\x78\x9E\x97\xC9\x64\x57\x5E\x79\x65\xFF\xC9\x07\x00\x40\x51\xE4\xB1\x63\xC7\x3A\x3A\x3A\x66\xCF\x9E\x83\xA6\x50\x9F\xCF" + 231 | "\x47\x10\x44\xEC\xFB\x05\xFA\xFD\xFE\xA7\x9F\x7E\xFA\xD0\xA1\x83\xF3\x96\xDC\x52\x32\x7B\x81\xAD\xB5\x79\xFD\xDB\x2F\x31\x14\xBE" + 232 | "\xEC\xFA\xAB\xC7\x17\xE4\x66\xE8\x34\x9D\xDD\x3D\xF6\xDE\x5E\xA7\xCB\x65\x77\x38\x9C\x4E\x27\x49\x10\x37\x5C\x33\x7F\xD5\xF2\x1B" + 233 | "\xA5\x12\xF1\xD8\x3C\xA3\x48\x44\x1F\x3D\x76\x9C\x65\xFB\xF2\xC6\x17\xC9\xE4\x49\x1E\x97\xF3\xEC\xF7\xDF\x72\x1C\x57\x5C\x5C\x0C" + 234 | "\x00\xF0\xF9\x7C\xF1\x8A\x00\xF3\x3C\xFF\xCA\x2B\xAF\x1C\x3A\x74\x70\xE9\xD2\xA5\x85\x85\x3F\x22\x74\x41\x08\xF7\xED\xDB\x17\x5A" + 235 | "\x15\xD8\xE1\x70\xF0\x3C\x8F\x2A\x19\x06\xF7\x0F\x89\xD2\xCD\x4D\xD3\x34\x8E\xE3\x66\xB3\x19\x05\x9B\x72\x72\x72\x82\xBF\xA7\xAA" + 236 | "\xAA\x6A\xFD\xFA\xF5\x91\xFF\x06\x08\xE1\x89\x13\x27\xF6\xEC\xD9\xB5\x78\xF1\xB5\x48\x6C\x5D\x5D\x5D\x82\x20\x28\x95\xCA\xA8\xA5" + 237 | "\xC8\xF3\xFC\x9B\x6F\xBE\xB1\x79\xF3\x57\xA6\x31\x13\xE7\x2D\xB9\x05\x00\xFC\xE8\xEE\xAD\x6E\xA7\xE3\xBA\x45\xF3\x92\x55\x4A\x0C" + 238 | "\xC3\x72\x32\x33\x56\xDE\x76\x63\x77\x8F\xA3\xD7\xE9\x02\x00\x68\x52\xD4\x13\xC7\xE6\x69\x52\x2E\xD8\xD4\x00\x80\xAB\xE7\xCF\x38" + 239 | "\x79\xA6\xBC\xBC\xEC\xD8\x8C\xAB\xAE\x15\x4B\x64\x33\x16\x5C\xD7\xD2\x58\xBB\x79\xF3\xE6\xCC\xCC\xAC\x25\x4B\x96\x08\x82\xD0\xD5" + 240 | "\xD5\x05\x21\x8C\xBD\x60\xFC\xD9\xB3\x67\x3F\xFD\x74\x5D\x7A\x7A\xC6\xA2\x45\xD7\x0C\x7B\x32\x49\x92\xF7\xDF\x7F\x7F\x41\xC1\x85" + 241 | "\x82\x11\x2C\xCB\x22\x5A\x7D\x73\x73\x73\x55\x55\x95\xDF\xEF\x1F\xD0\x85\x44\x22\xBF\x28\xFA\x61\x1A\x8D\x26\x3F\x3F\x3F\x2D\x2D" + 242 | "\x6D\x88\x7A\x88\x23\xD2\x47\x10\x7B\x1F\x00\xB0\x76\xED\xDA\xBC\xBC\x82\xDC\xDC\x0B\x7C\x3D\x54\x63\x33\x39\x39\x39\x0A\xC5\x81" + 243 | "\xE7\xF9\x77\xDF\x7D\xE7\x8D\x37\x5E\x57\xA5\xE8\x6E\xB9\xF7\x57\x12\xA9\xDC\xED\x74\x54\x9D\x39\xA9\x49\x51\x1B\xB3\xF5\x17\x3B" + 244 | "\x49\x64\xEB\xD3\xA7\x15\x4D\x18\xEC\x2D\x61\x44\xA2\xAB\x66\x5D\xF1\xD7\x77\x3F\x69\x6B\xAA\x1F\x57\x3C\x03\x42\x78\xCD\xD2\xBB" + 245 | "\x36\x7E\xF4\xEA\x5B\x6F\xBD\x21\x95\x4A\xE6\xCD\x9B\x8F\xA4\x88\xA2\x9E\x51\xBF\x6A\x0E\x87\xE3\xC9\x27\x7F\xCF\xB2\xFE\x5B\x6E" + 246 | "\x59\x16\xE1\xAE\x68\x24\x49\x06\xD5\x0E\x8A\xA2\xC6\x8D\x1B\x37\x6E\xDC\x38\xEC\x22\x03\x31\x58\x98\x1B\xA5\xC1\xA0\x08\x3E\xA9" + 247 | "\xD7\xEB\x6F\xBF\xFD\x76\xB4\x85\x42\x84\xA4\xB1\xC8\xE1\x74\x3A\x21\x84\xF3\xAF\x5D\x76\x68\xC7\xD7\x2F\xBE\xF8\xC2\x8B\x2F\xFE" + 248 | "\x39\x98\xBF\xEF\x74\x3A\x59\x96\x4D\x4D\x4D\x1D\xD1\x7C\xE5\xF5\x7A\x5F\x7E\xF9\x7F\x3F\xFA\xE8\x43\x99\x32\xF9\xA7\x0F\xFE\x8F" + 249 | "\x26\x4D\x8F\x61\x58\x4F\x67\x47\xAF\xBD\x6B\xE2\x18\x93\x48\x74\x21\xBC\x95\x99\xAE\x4B\x51\x0F\xB3\x60\x67\xE9\xD3\x28\x8A\xEC" + 250 | "\xEA\x68\x93\xCA\xE4\x5C\x20\x90\x9E\x6D\x5C\x7C\xEB\xDD\x5B\xBF\x58\xFB\xD2\x4B\xAB\xDD\x6E\x37\xAA\x80\x67\xB7\xDB\x51\x27\xA3" + 251 | "\x50\xA4\x59\x96\x7D\xF6\xD9\x3F\x9E\x3E\x7D\x9A\xA2\xA8\xD8\x57\xD6\x20\x03\x71\xFA\xF4\xE9\x18\x86\xF5\xF5\xF5\xB5\xB7\xB7\x0B" + 252 | "\x82\xB0\x7E\xFD\x7A\x9C\x61\x18\xA3\xD1\x18\xBA\xB1\x56\x1C\xE1\x74\x3A\x49\x92\x9A\x7D\xF5\x8D\x33\x17\x5C\xD7\xD0\xD8\xF0\xA7" + 253 | "\x3F\x3D\x63\xB7\xDB\x83\x47\x59\x96\xB5\x5A\xAD\x3D\x3D\x3D\x11\x5A\xFD\x95\x95\x95\xAB\x56\xAD\x5C\xFB\xDE\xDA\x64\x6D\xC6\xBD" + 254 | "\x8F\x3D\x93\x69\xBC\x40\x00\x64\xFB\xBC\x01\x3F\x9B\x74\xF1\x31\x21\x8F\xA8\x20\x08\x10\x62\x17\xEB\xCD\x0E\xB0\xA0\x78\xBC\x3E" + 255 | "\x8E\xE3\x45\x0C\x03\x70\x5C\xAE\x54\x91\x14\x6D\x1A\x53\x78\xDD\x1D\xF7\x01\x82\x7A\xF5\xD5\x57\xFE\xFA\xD7\x35\x68\x07\x02\xAF" + 256 | "\xD7\x6B\xB5\x5A\x51\xB2\x4E\xE4\x3F\x3C\x10\x08\xAC\x59\xF3\x97\x0D\x1B\x36\x50\xB4\x48\x10\x04\x9F\x6F\xC4\xE5\x9A\x87\x06\xC3" + 257 | "\x30\x39\x39\x39\x46\xA3\x51\x2C\x16\x27\x96\x6D\xE0\x72\xB9\x44\x8C\x98\xA4\xE8\x25\xCB\xEF\xF5\xB8\x9D\x27\x0F\xEF\xFE\xDD\xEF" + 258 | "\x7E\xFB\xE4\x93\x4F\x07\x2B\x6A\x42\x08\xED\x76\xBB\xD3\xE9\x4C\x4A\x4A\x92\xCB\xE5\x83\xBD\xEC\x36\x9B\xED\xBD\xF7\xD6\x7E\xF2" + 259 | "\xC9\x3A\xAF\xD7\x3B\x61\xCA\x8C\xA5\xAB\x1E\x0A\x4D\x48\x13\x31\x12\x8A\x16\x75\xDB\x1D\xC1\x36\xEB\x2D\x2D\x75\x8D\xCD\xDD\xF6" + 260 | "\xDE\x86\xA6\x96\xEE\x1E\x07\x84\x50\xA9\x90\xEB\x34\x29\x63\xF3\x4D\x79\xA6\x1C\x46\x44\xBB\x3D\xDE\x4D\xDB\x77\x93\x14\x6D\xC8" + 261 | "\x1B\x87\x61\x18\x41\x10\x4A\x75\x72\xAF\xBD\xDB\x54\x30\xF1\xB6\x9F\x3F\xBA\x6D\xFD\xFB\x5B\xB7\x6E\x29\x2B\x3B\x79\xCF\x31\xF9" + 262 | "\x0F\x70\x00\x00\x0F\x52\x49\x44\x41\x54\x3D\xF7\xCE\x99\x33\x17\x75\xC0\xE9\x74\xAA\x54\xAA\x48\xCA\xE0\xB2\x2C\xBB\x7A\xF5\x9F" + 263 | "\xDF\x7B\x6F\xAD\x36\x3D\x73\xD6\xD5\x37\x6D\xFA\xE8\x35\xAF\x37\xCA\x7D\x7A\x23\x41\x62\x45\xE8\x76\xBB\x18\x89\x14\x00\x9C\xA4" + 264 | "\xA8\x65\xF7\xFE\x8A\x20\x88\xEF\x0E\xEE\x7C\xE8\xA1\x07\x56\xAE\xBC\xEB\xEA\xAB\xAF\x09\x8E\x7B\x9E\xE7\x7B\x7A\x7A\xEC\x76\x3B" + 265 | "\xC3\x30\x88\x8F\x4B\x51\x14\x8E\xE3\x3C\xCF\x9F\x3D\x7B\x76\xD3\xA6\xBF\x6D\xD9\xB2\xC5\xE9\x74\x26\xA9\x52\x6E\x5B\xF1\x5F\xC5" + 266 | "\xB3\x16\x84\x11\xEF\x35\xE9\x99\x9A\xF4\xAC\xF3\x55\xB5\x29\x2A\xE5\x98\x7C\x93\xDF\x1F\xA8\xAE\x6B\x3C\x57\x59\x63\xEB\xEA\x41" + 267 | "\x27\x84\xC6\xF4\x49\x92\x4C\x56\x25\xB9\xDC\x1E\xAF\xAF\x6F\xF2\xF4\xF9\x39\xF9\xE3\xD1\x39\x38\x41\x28\xD5\x29\x2E\x67\xAF\x36" + 268 | "\x23\x7B\xC5\x2F\x7E\x7B\x78\xE7\xE6\x53\xA5\xFB\x9F\x7D\xF6\x4F\x66\xF3\x17\x37\xDD\x74\x33\x12\x64\x5B\x5B\x1B\x4D\xD3\x32\x99" + 269 | "\x4C\x2A\x95\xF6\xF7\x61\xA1\x14\xCE\xDA\xDA\xDA\x17\x5E\x78\x6E\xFF\xFE\xFD\xA9\x3A\xFD\xCA\x87\x9F\xEC\xF3\x79\x21\x8C\xFF\x28" + 270 | "\x0C\x45\xA2\x45\xE8\x61\xC4\x12\xA4\x1C\x53\x34\xBD\xEC\xDE\x5F\x69\xD2\xB3\x76\x7E\xF5\xE9\x5F\xFF\xBA\x66\xDD\xBA\x8F\x67\xCC" + 271 | "\x98\x39\x69\xD2\x64\x93\xC9\x98\x9A\xAA\x41\x66\x86\xC3\xE1\x68\x6A\x6A\x6A\x6F\x6F\x6B\x68\x68\x28\x2F\x2F\x3F\x75\xEA\x7B\x54" + 272 | "\x32\x4E\xA1\x54\x5F\x73\xCB\x5D\x33\x17\x5D\x2F\x95\x0D\xA0\x22\x32\x62\xC9\x4F\x6E\x5D\xF5\xD9\x1B\x2F\xEC\x3A\x58\xBA\xF3\xC0" + 273 | "\x51\x24\x2C\x9A\xA6\x27\x4D\x9A\x64\x30\x18\x4F\x9E\x3C\xB1\x72\xE5\x5D\xA9\xA9\xA9\x3D\x3D\xF6\xD7\x5E\x7B\xD5\xE9\x72\xBA\x7C" + 274 | "\x7E\x46\xA6\x2C\x9E\x33\xFD\xAA\xEB\x97\x87\x46\x97\x00\x8E\x2B\x94\x2A\x5A\x24\xC2\x09\x62\xC1\x0D\x77\x4C\x98\x32\xF3\xC8\xAE" + 275 | "\x2D\xB5\x15\xA7\x57\xAF\xFE\xF3\x1B\x6F\xBC\x5E\x5C\x5C\x5C\x5C\x3C\x65\xDC\xB8\xF1\x7A\xBD\x9E\x61\x18\x54\x06\x03\x5D\xCE\xF3" + 276 | "\x7C\x67\x67\x67\x59\x59\xD9\xBE\x7D\x7B\x4A\x4B\x4B\x39\x8E\x33\x16\x4C\x58\x76\xEF\x23\xDA\x8C\xCC\xF6\x96\x46\xE4\x40\x4F\xDC" + 277 | "\x43\x26\xAB\xAB\xAB\xEF\xBF\xFF\x7E\xA4\x8E\x22\x45\x34\x37\x37\x37\x3D\x3D\x1D\xE5\x6A\xC7\x62\xBD\xA1\x35\x80\x51\x24\xE3\x17" + 278 | "\x1F\x13\x4E\x10\xF3\xAF\x5D\x36\x71\xEA\xAC\x43\x3B\x36\x7F\x7F\x74\xDF\x37\xDF\x6C\xDF\xB6\x6D\x2B\x86\x61\x00\x00\xC4\x72\xFB" + 279 | "\xC1\x75\x04\x00\x0E\x70\xB1\x54\x56\x78\xC5\x9C\x49\x57\xCC\xCD\x9F\x34\x65\xE8\x88\x7C\xDE\xF8\xA2\x9F\x3D\xFE\x6C\xD9\xD1\x7D" + 280 | "\x36\x6B\x93\xD7\xE3\x6E\xAE\xAF\xBA\xF9\xE6\xA5\x0B\x16\x2C\x74\xBB\xDD\xE7\xCF\x9F\x4F\x4E\x4E\x59\xB2\xE4\x5A\x9B\xCD\xF6\xC1" + 281 | "\x07\xEF\xA9\xB5\x19\xB7\xFE\xFC\x51\x00\x80\x58\x2A\x13\x0F\x54\x4B\x98\x11\x4B\x68\x91\xC8\xEB\x76\xE9\x32\x0D\x37\xAF\x7A\xB0" + 282 | "\xDB\xD6\x7E\xEE\xC4\xD1\xCA\x33\xDF\x1E\x3E\x72\xE4\xE0\xC1\x83\x18\x86\x51\x14\xA5\x52\xA9\x92\x92\x94\x0C\x23\x82\x10\xF3\x7A" + 283 | "\x3D\xDD\xDD\xDD\x48\x71\xC3\x71\x22\x35\x2D\x63\xFA\x95\x4B\xA6\xCC\x59\x88\x0A\x15\x8B\x18\x31\x86\x81\xA8\x37\x3C\x0F\x7D\x98" + 284 | "\x88\x87\x58\x5D\x5D\x8D\x42\xBE\x28\x2D\x06\x0B\x8E\xC2\xB0\x1A\x88\x38\x8E\x1B\x8D\xC6\x9C\x9C\x1C\xB4\x5B\x4C\xA8\x42\x15\xB9" + 285 | "\x2F\x9F\xE3\x38\x96\xF5\x2B\x44\x0C\xF8\xB1\xE5\x90\xAC\x49\xBB\xF1\xCE\xFF\x5E\x7C\xEB\xDD\x96\x9A\x0A\x4B\x5D\xA5\xAD\xAD\xA5" + 286 | "\xB7\xA7\x8B\xF5\x79\x21\x84\x24\x4D\xCB\xE4\x0A\x55\xB2\x26\x35\x3D\x53\x9F\x6D\x4A\xCB\x32\xD1\x91\xE9\xAB\x38\x8E\xEB\x0D\x79" + 287 | "\xEA\x54\x1D\xEB\xF3\x35\xD6\x94\x7F\xF1\xF6\x6A\x0C\xC3\x00\x00\x93\x26\x15\x4A\xA5\x52\x9D\x4E\x4B\xD3\xB4\xDF\xEF\x67\x59\x56" + 288 | "\x91\x22\x61\x24\x52\xA9\x7C\x28\x0F\x11\x8E\x13\x32\x85\x52\x22\x95\xFB\xBC\x1E\x9C\x20\xE7\x2E\x5E\x3A\xFB\x9A\x9B\x3A\xDB\x5B" + 289 | "\x5A\x1A\xAA\xDB\x5B\x1A\xBB\xDA\xDB\x9C\x8E\x6E\xBB\xA3\xF1\x62\xC4\x83\x90\xC8\xE4\x86\xBC\xF1\xE9\xD9\x46\x43\xFE\x04\x43\xDE" + 290 | "\x58\x79\x92\x2A\x38\xD5\x93\x14\x4D\x84\x30\x74\x86\x85\x20\x08\xA1\xCA\x9D\xD7\xEB\x45\xDE\xD1\xE6\xE6\xE6\x9A\x9A\x9A\x01\x79" + 291 | "\x88\x03\x4C\xA4\x61\x0C\x44\x00\x80\x42\xA1\x08\x1A\x2B\x91\x17\xF0\xF2\xFB\xFD\x3C\xCF\x89\x18\x66\xC0\x92\x4D\xB4\x88\xC9\x1D" + 292 | "\x3F\x39\x77\xFC\xE4\x08\x7F\xDB\xB0\x20\x08\x42\x9E\xA4\x92\xCA\x93\x6C\xAD\x4D\x04\x49\xB9\x5C\x2E\x86\x61\xB4\x5A\x9D\x44\x22" + 293 | "\x41\xBA\xA5\xDB\xED\x72\x3A\x9D\xE6\x89\xA9\x12\xA9\x3C\x92\x9F\x80\x13\x84\x54\xAE\x90\xC8\xE4\x01\x3F\xCB\xF6\xF5\x51\xB4\x49" + 294 | "\x1B\x92\x39\xC5\x71\x1C\xCF\x05\x30\x0C\xA3\x28\x9A\x20\x09\x9C\x20\x45\x8C\x98\x11\x4B\xC8\x1F\x47\xB6\x71\x9C\x20\x29\x9A\x65" + 295 | "\x23\x12\x21\xAA\x0B\x12\xFA\xA8\xD1\xE0\x1E\x5A\x19\x1E\x66\x2D\x44\xD7\x87\xED\xB4\x17\xA1\x8F\x94\x65\xFB\x04\x41\xA0\x68\x66" + 296 | "\x34\x77\x74\xC2\x71\x3C\x25\x4D\x2F\x95\x29\x50\xAD\x00\x94\xA2\x8C\xF2\x17\xAB\xAA\xAA\x7C\x3E\x5F\xB6\xB9\x00\x1F\x09\xBB\x02" + 297 | "\x00\x40\x8B\x18\x54\xDC\x96\xE7\x79\x9E\x0B\xF0\x3C\x2F\xF0\x3C\x62\x03\x01\x1C\x27\x08\x92\xA2\x48\x7C\xF0\x64\x7F\x8A\x16\x45" + 298 | "\x38\x0A\xFB\x3F\xEA\x48\x30\x8C\x08\x49\x92\x44\xE5\x12\x82\x06\xB8\xD3\xE9\x6C\x6B\x6B\x8B\xA4\x69\x96\x65\x21\x84\x22\x86\x19" + 299 | "\x05\x8A\x66\x28\x52\x34\x69\x19\x39\xA6\x9A\xF2\x53\x07\x0F\x1E\x1C\x3F\x7E\x3C\xCF\xF3\x10\x62\x56\xAB\xF5\xF3\xCF\x3F\x93\x29" + 300 | "\x94\xB1\x14\x39\x09\xFA\x2D\x23\x07\x00\x80\xA2\x68\xBF\x3F\x22\x6E\x15\x8E\xE3\xE3\xC6\x8D\x0B\x32\xAD\x59\x96\xAD\xAD\xAD\x45" + 301 | "\xE5\x12\x86\x18\x88\xE1\x22\x44\x6A\x85\x5E\xAF\x47\x21\x43\xA3\xD1\x18\x56\x0F\x31\xF2\x44\x6D\xBF\x3F\x80\x46\x61\x24\x27\xC7" + 302 | "\x11\x38\x41\x2C\xB8\xF1\x0E\x4B\x6D\xE5\x3B\xEF\xBC\xB5\x71\xE3\x97\x1E\x8F\xE7\xE8\xD1\x23\x88\x36\x30\x73\xE1\xF5\x3A\x7D\xCE" + 303 | "\x68\x76\x06\x00\x40\x52\x54\x24\x59\x0C\x18\x86\xE1\x38\xBE\x70\xE1\xC2\xB0\xC8\xBE\xC3\xE1\x40\x61\x42\xB4\x17\x73\xFF\xD4\x7B" + 304 | "\x12\x71\xAA\xFA\x97\x0E\x8A\xBD\xF7\x68\xED\xA5\x47\x42\xCF\x8D\x17\x72\x72\xC7\xFE\xFC\x37\xCF\xEE\xDA\xFC\x79\x53\x5D\xA5\x00" + 305 | "\x31\x8A\xA4\x33\x72\x32\x26\x94\xCC\x9A\xBD\xE8\xC6\x51\x9E\x12\x00\x00\x04\x49\x06\x02\x11\x89\x70\x40\x28\x95\xCA\xC9\x93\x27" + 306 | "\x4F\x9E\x3C\x19\xBB\x40\xB7\x6C\xAE\xAB\xAB\x6B\x69\x69\x41\xA5\x83\xEC\x76\x3B\x69\x30\x18\x12\xB4\x5B\x0C\xDA\x99\x94\xBA\x44" + 307 | "\x3B\xE5\x65\x99\x0A\xEE\x79\xF4\x19\x2E\xE0\xE7\x79\x1E\x20\xCD\x30\xC1\x89\x2F\x03\x03\x00\x82\xA4\xE2\xC5\x33\x26\x49\xD2\x60" + 308 | "\x30\x84\xEE\xAF\x93\xD8\xDD\x62\x38\x2E\x00\x21\xBC\x24\xA3\x10\x01\x00\x40\xD1\xA2\x4B\x5B\x6A\x18\x99\xBC\x81\x40\x5F\xE2\xC8" + 309 | "\xD0\x09\xD4\x15\x03\x01\x4E\x10\x04\xF2\xDF\x7B\xB3\x43\x00\x00\x4E\x10\xC1\xF4\x92\x44\x20\x81\x22\x44\xA3\x70\x34\xF3\x9B\x2E" + 310 | "\x4F\xE0\x38\x91\x20\x02\x26\x02\x69\xB7\xDB\x77\xEF\xDE\x8D\xE3\x78\x56\x56\x56\xB0\x06\x62\x5C\x86\x3C\x4A\xA5\xF8\x27\x2A\x9A" + 311 | "\x9E\x08\xA0\xEC\xCC\x78\x25\x06\x21\x33\x1D\xA5\x55\x34\x35\x35\x09\x82\xD0\xD3\xD3\x43\x76\x76\x76\x7E\xF9\xE5\x97\xC1\x9B\xA1" + 312 | "\x72\x4F\x48\x35\x45\x6C\xB3\x58\xE8\x11\x10\xC2\x4B\xA3\x44\x5C\x4E\x40\x09\xB6\x51\x27\xBF\x05\xBD\x2B\xF5\xF5\xF5\xF5\xF5\xF5" + 313 | "\x0D\x0D\x0D\xA8\xBC\xFA\xC0\xBB\xC5\xF0\x3C\xDF\xD0\xD0\xD0\xD0\xD0\x80\x5D\x64\x20\x06\xE9\x33\x41\xA6\x7A\x70\x03\xC2\x61\xC1" + 314 | "\x71\x3C\x86\x61\xFF\xEE\x22\x04\x00\x5C\x10\xA1\x30\x2C\xD9\x0C\x42\xD8\xDE\xDE\x1E\x7C\xD4\x7D\x7D\x7D\x28\x4B\x3B\x98\x62\x38" + 315 | "\xE0\x55\x43\xED\x16\xE3\xF1\x78\x4E\x9F\x3E\x7D\xFA\xF4\xE9\xB0\xB1\x18\x21\x29\x48\x10\x78\x08\x61\x8C\x65\x26\xFF\xD9\x01\x7E" + 316 | "\x18\x85\xC3\x9F\xCC\xF3\xFC\x86\x0D\x1B\x82\x1F\x23\x1C\xBB\x11\x3D\xDF\xE8\xE6\x01\xF4\xD6\x8C\xC8\x21\xF9\xAF\x08\x00\x40\x70" + 317 | "\x14\x0E\x8F\x78\x26\x6A\xA3\x32\xF5\x26\x93\x29\x3B\x3B\x3B\x74\xDB\xAD\xA6\xA6\xA6\xFD\xFB\xF7\x47\xDE\x9B\xD1\x17\x21\xC0\x30" + 318 | "\x0C\x60\x24\x81\x13\x38\x8E\x5F\x98\x3C\xA0\x20\x40\x4E\x80\x3C\x2F\x24\x3C\x1D\x3B\xAC\x33\x00\x43\xEA\x8C\x10\xC1\x9D\xD1\x6E" + 319 | "\x31\xD9\xD9\xD9\xE8\x23\xCB\xB2\x2D\x2D\x2D\x68\x22\x65\x59\x76\x30\x2F\x1D\x19\x7A\x3D\x41\x10\xA9\xA9\xA9\x05\x05\x05\x3A\x9D" + 320 | "\xCE\x64\x32\xA5\xA5\xA5\xF5\x0F\x32\x44\xAE\x59\xA1\x51\x48\x8C\xD6\xE6\x20\x24\x81\x4B\x44\x24\x43\x91\x34\x45\xD0\xE4\x60\xDB" + 321 | "\xCA\x62\x2C\xC7\xB1\x7E\xDE\xEB\x0F\xF4\xF9\x87\xF2\x1D\xC7\x0D\x00\xE0\x38\x31\x74\xD9\xD2\x90\x73\x41\x66\x66\x66\x7E\xFE\x0F" + 322 | "\x5B\x23\xA0\x32\xFB\x41\x06\x62\x73\x73\x73\x75\x75\x75\x47\x47\x87\x20\x08\x41\x8F\x0F\x99\x9A\x9A\x3A\x7F\xFE\x7C\x44\x42\x8C" + 323 | "\x2F\x8F\x4D\x10\x04\x0C\x83\x20\xC1\x91\x26\x1C\x00\x29\x43\xC9\xC5\x34\x43\x0F\xBF\x28\x00\x80\x31\x14\xC9\x50\x64\x92\x54\xC4" + 324 | "\xF3\xD0\xE5\xF3\x3B\x7D\x2C\xC7\x27\x2A\x21\x0D\x43\xD3\x28\x49\x22\x4B\x20\x96\x46\xC2\x18\x88\x0D\x0D\x0D\x6D\x6D\x6D\x10\xC2" + 325 | "\xFD\xFB\xF7\x93\x2A\x95\xEA\xAA\xAB\xAE\x8A\x5F\x9F\x7F\x00\x5A\x40\x13\x17\x2C\x04\x00\x28\xC4\x74\x92\x54\x44\x12\xD1\xDC\x82" + 326 | "\x20\x80\x52\x26\x4A\x92\xD2\x4E\x2F\x6B\x77\xB3\x42\xA2\x46\x24\x20\x08\xA2\x7F\xE1\x97\x58\xC0\x30\x4C\xB0\x48\xE9\x99\x33\x67" + 327 | "\x12\xA8\x2E\x5E\xE4\x8D\x25\x44\x84\x62\x9A\x4C\x56\x48\x68\x32\xD6\xC6\x01\x00\x49\x52\x46\x22\xA2\x3B\x9D\xDE\x3E\x7F\xFC\xDD" + 328 | "\x60\x00\x00\xA4\x93\x27\xCE\x41\x93\xD0\x59\x6E\xC4\xE5\x7C\x22\x01\x00\x20\x59\x2E\xD6\xA9\x64\xB1\xCB\x2F\x08\x8A\xC4\x75\x2A" + 329 | "\xA9\x5C\x9C\x10\x5F\x20\x4E\x90\xF1\x1D\x85\x61\xF8\x27\x33\xDA\x08\x1C\xD7\x28\x25\xE2\x08\x96\xBD\x91\x02\x07\x20\x45\x21\x06" + 330 | "\x00\x38\xBD\x23\xA8\x02\x36\x2C\x50\xA4\x22\xB1\x22\x6C\x6A\x6A\x7A\xF1\xC5\x17\x51\xC5\x20\x14\xAC\x1F\x2C\x21\xE6\x92\x83\x22" + 331 | "\x71\xAD\x52\x3A\x98\xB6\x19\x3B\x00\x00\x6A\x39\xC3\xF1\x82\x97\x8D\x67\x0D\x9A\x20\xD7\x34\xF6\xA6\x20\x84\x6D\x6D\x6D\xB5\xB5" + 332 | "\xB5\xC1\xCD\xEF\xDA\xDB\xDB\x49\xA4\xDE\x60\x18\x56\x57\x57\x87\x85\x30\x10\x91\xD7\x3B\x37\x37\x57\xA1\x50\x84\xAA\x24\xA3\xA1" + 333 | "\x88\x0F\x04\x8A\xC0\x75\x4A\x19\x15\xBF\xC9\x73\x40\xA0\xB1\xD8\xDA\xC3\xC7\x51\x4D\x25\x08\x12\x42\x28\x08\x11\x89\x30\xCC\x8B" + 334 | "\x82\xCA\xEE\x21\xD7\x68\x4B\x4B\x4B\x6D\x6D\x6D\x7F\x1E\x62\xF8\x8C\x14\xB6\x0B\x33\x8E\xE3\x2A\x95\xCA\x6C\x36\x07\xE9\x4F\xBD" + 335 | "\xBD\xBD\x89\x2B\x0B\x31\x18\x08\x1C\xD7\x28\xA5\x89\x96\x1F\x02\x49\xE0\xC9\x72\xC6\xE6\xF0\xC6\xEB\x55\xC5\x09\x1C\x42\x8C\x8F" + 336 | "\xE0\x9D\x40\x35\xE9\x83\x1B\xBB\xF8\xFD\xFE\xDA\xDA\x5A\xBB\xDD\x3E\x74\x3D\xC4\xE1\x77\x8B\xE9\xEE\xEE\xEE\xEE\xEE\x0E\xFD\x32" + 337 | "\x11\x85\x2B\x86\x00\x00\x20\x45\x21\x16\x51\xA3\xE7\xE5\x91\x88\x28\x09\x43\x79\xFA\xE2\x33\x9D\xE2\x04\x89\x61\x11\xAD\x85\x82" + 338 | "\x20\x9C\x3E\x7D\x7A\xA4\xED\x0F\xAF\x17\xA0\x7A\x88\x41\x7E\x2A\xC7\x71\x11\xAF\x94\x17\xF6\xB3\x1B\x69\x9F\xC2\x90\x24\xA6\xA5" + 339 | "\xCC\xA8\x06\x1D\x01\x00\x2A\x19\xE3\xF3\x73\x91\x78\xC5\x86\x05\x8E\x13\x10\x46\xE4\xFC\x04\x00\xC8\x64\xB2\x50\x2A\x30\xCB\xB2" + 340 | "\x28\xEC\x3A\xC4\x55\x03\x88\x10\x2D\x87\xA8\x1E\xA2\x5E\xAF\x37\x1A\x8D\xA1\x9B\xA7\x45\x4E\x42\x04\x20\x0E\x22\x14\x91\x44\x92" + 341 | "\x6C\xB4\x69\x8C\x18\x86\xD1\x24\x21\x63\x28\xA7\x37\x7A\xE6\x59\x10\x38\x8E\x63\x58\x44\x0E\x36\x82\x20\x7E\xF6\xB3\x9F\x85\x92" + 342 | "\x10\x11\x03\xD1\x62\xB1\x20\x06\x22\x2A\x14\x17\x76\x15\x19\xAC\xA7\xAE\x50\x28\x0A\x0A\x0A\x32\x32\x32\x0C\x06\x03\xDA\x99\x35" + 343 | "\xF6\xDE\x03\x80\x45\xE8\xA1\x1F\xEC\x72\x95\x9C\x21\xF0\x4B\xA3\x1E\x2B\x24\x22\xB7\x2F\x10\xBB\xD7\x06\x29\x83\xD1\x3D\x87\x30" + 344 | "\x06\xA2\xD5\x6A\xAD\xAB\xAB\x6B\x6A\x6A\xAA\xAC\xAC\x44\x59\x06\x10\x42\xD2\x68\x34\x3E\xF0\xC0\x03\x38\x8E\xC7\x3D\xCB\x17\xC7" + 345 | "\x71\x0C\x03\x30\x06\xDD\x47\x4C\x53\x62\xFA\x92\xF1\x36\x28\x92\x90\x88\x28\x77\x5F\xAC\x03\x11\xC4\x16\xB5\x0F\x82\x24\xC9\xEC" + 346 | "\xEC\xEC\xD0\x38\x06\xCF\xF3\x6F\xBE\xF9\x26\x89\x76\x28\x8C\xB1\xF5\x01\x81\x6A\x03\x47\xAD\xBE\x02\x00\x94\x32\xE6\x12\x1A\xA8" + 347 | "\x00\xC3\x64\xE2\x78\x88\x10\x5C\xD8\x6D\x37\x1E\x9D\xFA\x01\xC8\x46\x20\x88\xA8\x1C\xC4\x11\x02\x25\x34\x09\xD1\x4E\xA4\x62\x9A" + 348 | "\x14\x25\xCC\x8A\x8F\x10\x22\x8A\xA0\x62\x7E\x44\xE8\x2D\x4C\x9C\x3D\x9D\x40\x11\x5E\x50\x67\xA2\x55\xEA\x14\x62\xFA\x92\xFB\x88" + 349 | "\x08\x1C\x8F\xDD\x98\x01\x17\xD6\xC2\x78\x74\x68\x20\x90\x28\x34\x0C\x00\x48\x49\x49\x41\xF9\xE3\xF1\xF2\xAE\xA1\x65\x3C\x42\xAF" + 350 | "\x44\x18\x68\x92\x10\x25\xC0\x11\x1A\x05\x44\x14\xE9\x8E\x93\x81\x18\x17\xA0\x65\x35\x10\x08\xA0\xE2\x46\x2C\xCB\x92\xCD\xCD\xCD" + 351 | "\xCF\x3F\xFF\x3C\x3A\x8C\xB8\x87\xE9\xE9\xE9\x79\x79\x79\x31\x32\x10\xB1\xD8\x44\xC8\xD0\xE4\xA5\x52\x44\xC3\x30\x9A\x2E\x85\xC1" + 352 | "\x10\xE4\x21\x56\x57\x57\x5B\x2C\x96\xFA\xFA\xFA\xE6\xE6\x66\x00\x00\xFA\x9E\x0C\x55\x37\x82\xBB\x30\x07\x19\x88\x88\x56\x9A\x93" + 353 | "\x93\x13\xD4\x57\x23\x57\x4F\x90\xB9\x12\x9D\x46\x3A\xCA\xB6\xFC\x10\x20\x08\x1C\xC7\x41\x2C\x36\xFE\x85\xFA\x9A\x91\xBD\x90\x28" + 354 | "\xA7\x1E\xFD\x1D\x08\x04\x50\x7E\x36\xDA\x2D\x66\x30\x1E\xE2\xA0\xBB\xC5\x04\x19\x88\xFD\x99\xAC\x11\x3A\xD8\x2E\x8E\xC2\x91\x53" + 355 | "\xB2\x08\x3C\x76\x25\x22\x5E\x20\x00\xA0\x08\x9C\x8D\x6A\x2E\x41\x08\x2D\x99\x32\x34\x38\x8E\x7B\xF5\xD5\x57\x83\x1F\x83\x35\x90" + 356 | "\x86\xBE\x6A\xF8\x27\x15\xC9\x9E\x33\x03\x37\x1D\xAD\x08\x69\x92\x20\x46\x31\xB7\x7B\x68\xE0\x38\x88\x31\xBC\x85\x14\xBA\x28\x96" + 357 | "\xA4\x08\x49\x53\x43\xA9\x0C\x88\xD3\x86\x78\x88\x41\x67\x4D\x57\x57\x57\x75\x75\x75\x24\x3D\x00\x00\x07\x00\x44\xB1\x16\xD2\x14" + 358 | "\x71\xC9\x75\xD1\x50\x30\x14\xE9\xF2\x45\x6F\x1D\x0A\x02\x87\x92\xF2\x87\x3D\x13\xC7\xF1\x69\xD3\xA6\x05\xD3\xAA\x51\x49\x59\xB4" + 359 | "\xE1\x56\xA4\x25\x65\x83\x3C\x44\x54\xA4\xDB\x64\x32\xE9\x74\xBA\x30\xFE\x52\x65\x65\x65\x6D\x6D\x6D\x24\x5D\xBF\x30\x0A\x47\x1E" + 360 | "\x78\xBB\xE4\xE6\x60\x18\x44\x34\x89\x74\x87\xE8\x2E\xE7\x79\x1E\xC3\x40\x24\x34\x30\x24\xC2\xB0\x44\xED\x20\x03\x11\xC5\x0B\x5B" + 361 | "\x5B\x5B\xC3\x72\xB5\x49\x95\x4A\x35\x6E\xDC\x38\x64\x54\xE4\xE4\xE4\x84\x6A\x2E\x31\x02\xC7\x41\x74\xEA\xCC\xE8\xC4\x05\x23\x07" + 362 | "\x81\x03\x8A\xC4\xFD\x81\x28\x97\x43\x8E\x0B\x00\x10\xFD\xE6\x7A\x41\x06\x22\xFA\x88\x12\x2D\x1A\x1B\x1B\xBB\xBB\xBB\x05\x41\x28" + 363 | "\x2F\x2F\x27\x53\x53\x53\xEF\xBC\xF3\xCE\xE8\x5A\x1F\x1A\xD1\x19\x15\x21\x14\xEC\xCB\x05\x04\x0E\x44\x24\x11\xB5\x08\xF9\x40\x00" + 364 | "\x15\x48\x8E\x4B\x67\x18\x86\x29\x28\x28\x08\x96\x9D\x8D\xC3\x8E\xDA\x43\xAC\xD2\x68\x2D\x1C\xE9\x28\x24\xF0\xB8\xF9\x16\xE2\x88" + 365 | "\x48\x78\xC6\x83\x21\xE0\xF7\x03\x00\x06\xCC\xB3\x8C\x4B\xD2\x61\xAC\x22\x24\x49\x12\x55\xCF\x1D\xA0\x69\xE4\xE6\x1E\xA1\x8F\x34" + 366 | "\x1E\x7B\x09\xC7\x1F\x51\x1B\xF8\x10\x42\xBF\x9F\xC5\x71\xBC\xFF\x76\xEB\x1C\xC7\x75\x75\x75\xC5\x5E\x5C\x24\x0E\xA3\xB0\xAD\xAD" + 367 | "\x6D\xC0\xED\xF0\xA2\xF3\x91\x02\x00\x00\x76\xD9\xC9\x10\x07\x20\x3A\xCE\x38\x14\x84\x80\x9F\x05\x00\x30\x4C\x78\xD9\x88\x8A\x8A" + 368 | "\x8A\xB6\xB6\xB6\xD8\x5F\x58\xB2\xBB\xBB\x7B\xE3\xC6\x8D\x18\x86\x25\x27\x27\x23\x06\xE2\x48\x29\xF4\x3A\x9D\xEE\xA5\x97\x5E\x5A" + 369 | "\xBD\x7A\xB5\x5E\xAF\xFF\xF1\x91\x0B\x59\x45\x23\x6A\x0D\x04\xAF\xBB\x9C\x80\x03\x80\xE3\x00\x1B\xF9\x6A\x28\x08\x3C\xDB\xE7\x25" + 370 | "\x49\x32\xAC\xF2\x87\xD5\x6A\x5D\xBD\x7A\xB5\x4E\xA7\x1B\x79\x83\x42\x5B\x5B\x5B\x4D\x4D\x0D\x22\x34\x75\x75\x75\x91\xDD\xDD\xDD" + 371 | "\x3B\x77\xEE\x44\x87\x11\xE5\xC2\x64\x32\x21\xD5\xD4\x6C\x36\x47\x52\x54\x1A\x79\xE3\x1E\x7F\xFC\xF1\x9F\xFD\xEC\x67\xF3\xE7\xCF" + 372 | "\x0F\xBE\x01\x48\x23\x1D\xA9\x6B\x0A\x42\x18\xE0\x2E\x3E\x2A\x18\xFC\x27\xE4\x78\xC8\xA1\x1F\x1D\x18\xFE\x94\xB0\x70\x41\xC8\x69" + 373 | "\xB0\xDF\xB7\x3F\xEE\x12\x84\x58\x74\x3E\x36\x41\x10\x7C\x1E\x8F\x58\x2C\x0E\x1A\xD6\x82\x20\xEC\xDB\xB7\x6F\xED\xDA\xB5\x12\x89" + 374 | "\x24\xC2\x72\x60\xA8\x1E\x62\x43\x43\x03\xAA\xAD\x1E\x08\x04\x06\xDD\x2D\x06\x19\x1C\xD5\xD5\xD5\x35\x35\x35\x28\x3F\x0D\x91\x83" + 375 | "\x43\xB7\x78\x19\xD0\xC6\xA4\x28\x8A\x65\xD9\xF5\xEB\xD7\xFB\xFD\xFE\x39\x73\xE6\x30\x0C\x13\xE4\x73\x88\x49\x4C\x4A\x8C\xE0\xED" + 376 | "\x25\x20\x64\xBD\x3F\x5A\x3E\xE1\x40\xFF\x0D\xF0\x21\xF8\xE5\x80\x82\x0A\xF9\x00\xFB\x1D\x19\xD0\xE4\x0B\x3B\x2C\xC2\xA0\x68\xE4" + 377 | "\x0B\x22\x01\x38\xC8\x07\x44\x17\xAB\xF0\xF5\xF5\xF5\x1D\x3C\x78\x70\xD3\xA6\x4D\x68\xF7\x8F\xFE\xE7\xF3\x3C\x1F\xAA\x58\x20\xD7" + 378 | "\x76\x73\x73\x33\x92\xDF\x80\xFE\x9A\xE1\xE7\x2C\x82\x20\xD0\xE6\x17\xC1\x7B\x48\x24\x12\x83\xC1\x30\xE0\x24\xEE\xF1\x78\x58\x96" + 379 | "\xCD\xCE\xCE\xD6\x6A\xB5\x81\x80\xFF\xF0\xE1\xC3\x53\xA6\x94\x8C\x74\x1B\xF7\x7F\x25\x08\x82\x70\xEA\xD4\xF7\x34\x4D\x17\x14\x8C" + 380 | "\xE9\xE8\xE8\xB0\x58\x2C\x22\x91\x68\xC0\x0D\x0F\x20\x84\x0D\x0D\x0D\x5E\xAF\x37\xF4\x51\x0F\xC8\x77\x0A\x43\x34\xCB\x8E\x52\xA9" + 381 | "\x34\x1A\x8D\x97\xA3\xE2\xF8\xCF\x0C\x24\xC2\xD0\x1D\x04\x22\x44\x54\x5A\xD6\x25\xE2\xE4\xFF\xCB\x23\x3A\x9E\x51\x34\x22\x4C\xE8" + 382 | "\x56\x8D\xFF\xB6\xE0\x79\x3E\xBA\x2A\xEC\xD1\x58\xAC\x82\x20\xF8\xFD\xFE\x78\x6D\x80\xF6\x1F\x60\x18\x06\x21\x6C\x6A\x6A\xF2\x78" + 383 | "\x3C\x51\x5C\x1B\xA5\xD3\xC1\xE7\xF3\xB9\x5C\x2E\x92\x24\x69\x9A\xFE\x8F\x20\x63\x81\x20\x08\x4E\xA7\xB3\xA1\xA1\x01\x51\x7B\xA3" + 384 | "\x40\xCC\x0E\x3A\x1C\x17\x89\x44\x89\xDB\x4B\xFC\x5F\x1B\x82\x20\xF4\xF5\xF5\xC5\xB8\x2A\xFD\x7F\x4C\x18\xE0\x52\x80\x11\xA5\x37" + 385 | "\x00\x00\x00\x00\x49\x45\x4E\x44\xAE\x42\x60\x82" 386 | 387 | const eye_open_rgbbitmap = "" + 388 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 389 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xE7\x1C\x8C\x71\x63\x2C\x6B\x6D\xB5\xB6\xFF\xDF\xFF\xFF\xFF\xFF" + 390 | "\xFF\xFF\xFF\xFF\xFF\xFF\x9C\xF3\x29\x45\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x8C\x51\xFF\xFF\xFF\xFF" + 391 | "\xFF\xFF\xFF\xFF\xAD\x55\x31\xC6\xBE\x18\xAD\xB6\x29\x45\x18\xE3\x18\xE3\x29\x44\xD6\xBA\xFF\xFF" + 392 | "\xFF\xFF\xEF\x7D\x39\xE7\x4A\x8A\xE7\x7E\xE7\x7E\x39\xC7\x18\xE3\x18\xE3\x18\xE3\x9C\xF3\xFF\xFF" + 393 | "\xFF\xFF\xCE\x59\x29\x44\x21\x03\x6B\x8E\x63\x2C\x21\x03\x18\xE3\x18\xE3\x18\xE3\x94\x92\xFF\xFF" + 394 | "\xFF\xFF\xCE\x79\x29\x45\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\xA5\x14\xFF\xFF" + 395 | "\xFF\xFF\xF7\x9E\x42\x07\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x21\x24\xD6\x9A\xFF\xFF" + 396 | "\xFF\xFF\xFF\xFF\xA5\x14\x21\x03\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x18\xE3\x63\x0C\xF7\xBE\xFF\xFF" + 397 | "\xFF\xFF\xFF\xFF\xFF\xDF\x7B\xEF\x21\x03\x18\xE3\x18\xE3\x18\xE3\x39\xC6\xDE\xDB\xFF\xFF\xFF\xFF" + 398 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xC6\x18\x73\x8D\x5A\xCB\x84\x0F\xE7\x1C\xFF\xFF\xFF\xFF\xFF\xFF" + 399 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 400 | 401 | const eye_close_rgbbitmap = "" + 402 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 403 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 404 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 405 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 406 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 407 | "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF" + 408 | "\xFF\xFF\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xFF\xFF" + 409 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 410 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 411 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 412 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" + 413 | "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF" 414 | -------------------------------------------------------------------------------- /11_spi_ili9341/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "image/color" 5 | "image/png" 6 | "log" 7 | "machine" 8 | "strings" 9 | "time" 10 | 11 | "tinygo.org/x/drivers/ili9341" 12 | "tinygo.org/x/tinydraw" 13 | "tinygo.org/x/tinyfont" 14 | "tinygo.org/x/tinyfont/freemono" 15 | ) 16 | 17 | var ( 18 | white = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF} 19 | red = color.RGBA{R: 0xFF, G: 0x00, B: 0x00, A: 0xFF} 20 | green = color.RGBA{R: 0x00, G: 0xFF, B: 0x00, A: 0xFF} 21 | blue = color.RGBA{R: 0x00, G: 0x00, B: 0xFF, A: 0xFF} 22 | black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF} 23 | ) 24 | 25 | func main() { 26 | display := InitDisplay() 27 | 28 | // body 29 | display.FillRectangle(20, 20, 280, 200, white) 30 | 31 | // lcd 32 | display.FillRectangle(25, 25, 270, 160, black) 33 | 34 | // speaker 35 | for i := int16(0); i < 4; i++ { 36 | display.FillRectangle(40+i*15, 190, 5, 20, black) 37 | } 38 | 39 | // buttons 40 | for i := int16(0); i < 3; i++ { 41 | display.FillRectangle(40+i*60, 15, 40, 5, blue) 42 | } 43 | 44 | // 5-way key 45 | tinydraw.FilledCircle(display, 260, 180, 20, blue) 46 | 47 | // text 48 | tinyfont.WriteLine(display, &freemono.Regular9pt7b, 30, 40, "Booting Wio Terminal...", green) 49 | 50 | // tinygo logo 51 | { 52 | img, err := png.Decode(strings.NewReader(tinygo_logo_s_png)) 53 | if err != nil { 54 | log.Fatal(err) 55 | } 56 | 57 | w := img.Bounds().Dx() 58 | h := img.Bounds().Dy() 59 | for y := 0; y < h; y++ { 60 | for x := 0; x < w; x++ { 61 | r, g, b, _ := img.At(x, y).RGBA() 62 | display.SetPixel((320-int16(w))/2+int16(x), (240-int16(h))/2+int16(y), color.RGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: 0xFF}) 63 | } 64 | } 65 | } 66 | 67 | initEyes() 68 | 69 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 70 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 71 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 72 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 73 | 74 | redraw := true 75 | xofs := int16(0) 76 | yofs := int16(0) 77 | eye := eyeClose 78 | eyeCh := make(chan struct{}, 1) 79 | go func() { 80 | for { 81 | eyeCh <- struct{}{} 82 | time.Sleep(1500 * time.Millisecond) 83 | eyeCh <- struct{}{} 84 | time.Sleep(300 * time.Millisecond) 85 | } 86 | }() 87 | 88 | for { 89 | if !machine.WIO_5S_UP.Get() { 90 | if 0 < yofs { 91 | yofs-- 92 | redraw = true 93 | } 94 | } else if !machine.WIO_5S_LEFT.Get() { 95 | if -4 < xofs { 96 | xofs-- 97 | redraw = true 98 | } 99 | } else if !machine.WIO_5S_RIGHT.Get() { 100 | if xofs < 7 { 101 | xofs++ 102 | redraw = true 103 | } 104 | } else if !machine.WIO_5S_DOWN.Get() { 105 | if yofs < 20 { 106 | yofs++ 107 | redraw = true 108 | } 109 | } 110 | 111 | select { 112 | case <-eyeCh: 113 | if eye == eyeOpen { 114 | eye = eyeClose 115 | } else { 116 | eye = eyeOpen 117 | } 118 | redraw = true 119 | default: 120 | } 121 | 122 | if redraw { 123 | drawEye(display, 127+xofs, 91+yofs, eye) 124 | drawEye(display, 181+xofs, 91+yofs, eye) 125 | redraw = false 126 | } 127 | time.Sleep(50 * time.Millisecond) 128 | } 129 | } 130 | 131 | const ( 132 | eyeOpen = iota 133 | eyeClose 134 | eyeClear 135 | ) 136 | 137 | func drawEye(display *ili9341.Device, x, y int16, mode int) { 138 | switch mode { 139 | case eyeOpen: 140 | display.DrawRGBBitmap(x, y, eyeOpenRGB[:], 12, 12) 141 | case eyeClose: 142 | display.DrawRGBBitmap(x, y, eyeCloseRGB[:], 12, 12) 143 | case eyeClear: 144 | display.FillRectangle(x, y, 12, 12, white) 145 | } 146 | } 147 | 148 | var ( 149 | eyeOpenRGB [144]uint16 150 | eyeCloseRGB [144]uint16 151 | ) 152 | 153 | func initEyes() { 154 | for i := 0; i < len(eye_open_rgbbitmap)/2; i++ { 155 | eyeOpenRGB[i] = uint16(eye_open_rgbbitmap[i*2])<<8 + uint16(eye_open_rgbbitmap[i*2+1]) 156 | } 157 | 158 | for i := 0; i < len(eye_close_rgbbitmap)/2; i++ { 159 | eyeCloseRGB[i] = uint16(eye_close_rgbbitmap[i*2])<<8 + uint16(eye_close_rgbbitmap[i*2+1]) 160 | } 161 | } 162 | func InitDisplay() *ili9341.Device { 163 | machine.SPI3.Configure(machine.SPIConfig{ 164 | SCK: machine.LCD_SCK_PIN, 165 | SDO: machine.LCD_SDO_PIN, 166 | SDI: machine.LCD_SDI_PIN, 167 | Frequency: 48000000, 168 | }) 169 | 170 | // configure backlight 171 | backlight := machine.LCD_BACKLIGHT 172 | backlight.Configure(machine.PinConfig{machine.PinOutput}) 173 | 174 | display := ili9341.NewSPI( 175 | machine.SPI3, 176 | machine.LCD_DC, 177 | machine.LCD_SS_PIN, 178 | machine.LCD_RESET, 179 | ) 180 | 181 | // configure display 182 | display.Configure(ili9341.Config{}) 183 | 184 | backlight.High() 185 | 186 | display.SetRotation(ili9341.Rotation270) 187 | display.FillScreen(color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF}) 188 | 189 | return display 190 | } 191 | -------------------------------------------------------------------------------- /11_spi_ili9341/tinygo-logo-eye-closed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/11_spi_ili9341/tinygo-logo-eye-closed.png -------------------------------------------------------------------------------- /11_spi_ili9341/tinygo-logo-eye.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/11_spi_ili9341/tinygo-logo-eye.png -------------------------------------------------------------------------------- /LICENSE.txt: -------------------------------------------------------------------------------- 1 | Copyright 2021 sago35 2 | Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: 3 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. 4 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # お知らせ 2 | 3 | TinyGo 0.26 + Wio Terminal という組み合わせで技術書「基礎から学ぶ TinyGoの組込み開発」 (2022/11/12 発売) を執筆しました。本ページと合わせて確認してみてください。 4 | 5 | * https://sago35.hatenablog.com/entry/2022/11/04/230919 6 | 7 | ---- 8 | 9 | ![image.png](./images/15.png) 10 | https://gocon.connpass.com/event/226098/ 11 | 12 | このページは 2021/11/13 に開催される Go Conference 2021 Autumn 内の Wio Terminal を使った TinyGo ハンズオン用の記事です。不明点は、このページのコメントや [twitter:sago35tk](https://twitter.com/sago35tk) で質問いただければサポートします。 13 | Twitter のハッシュタグは [#gocon](https://twitter.com/hashtag/gocon) および [#goconT](https://twitter.com/hashtag/goconT) です。 14 | 15 | ![image.png](./images/11.png) 16 | 17 | # ダウンロード 18 | 19 | ダウンロードに時間がかかる可能性があるので、最初にダウンロードリンクを記載します。すぐにダウンロードを開始してください。明確にインストール済みである場合でも (実際には使用しないかもしれませんが) ダウンロードするようにしてください。 20 | Go は Go 1.16 以降が入っていれば問題ありませんし、 Git はインストールされていればかなり古い Version でもおそらく問題ありません。しかし、もしものために説明を聞きつつダウンロードは進めてください。 21 | 22 | ## Windows 環境 23 | 24 | 以下の 3 ファイルをダウンロードしてください。 25 | 26 | * [Git](https://gitforwindows.org/) 27 | * https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/Git-2.33.1-64-bit.exe 28 | * Download をクリックして Git-2.33.1-64-bit.exe のようなファイルをダウンロード 29 | * [Go](https://golang.org/dl/) 30 | * https://golang.org/dl/go1.17.3.windows-amd64.msi 31 | * 他 version の Go が入っている場合などは [zip 版](https://golang.org/dl/go1.17.3.windows-amd64.zip) を使っても良いですが、原則 msi 版を使ってください 32 | * [TinyGo](https://tinygo.org/getting-started/install/windows/) 33 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.windows-amd64.zip 34 | 35 | ハンズオンでは (WSL2 ではなく) Windows Native 版の Go および TinyGo を使用します。 Windows Native 環境に Git / Go などがインストールされていない場合はインストールが必要です。 36 | 37 | ## macOS 環境 38 | 39 | 以下の 2 ファイルをダウンロードしてください。 40 | 41 | * [Go](https://golang.org/dl/) 42 | * https://golang.org/dl/go1.17.3.darwin-amd64.pkg 43 | * apple M1 chip の mac についても darwin/amd64 をインストールしてください 44 | * [TinyGo](https://tinygo.org/getting-started/install/macos/) 45 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.darwin-amd64.tar.gz 46 | 47 | ## Linux 環境 48 | 49 | 以下の 2 ファイルをインストールしてください。 50 | また Git がインストールされていない場合、後述の `apt install git` を実行してください。 51 | 52 | * [Go](https://golang.org/dl/) 53 | * https://golang.org/dl/go1.17.3.linux-amd64.tar.gz 54 | * [TinyGo](https://tinygo.org/getting-started/install/linux/) 55 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo_0.21.0_amd64.deb 56 | 57 | Git がインストールされていない場合、以下を実行してください。 58 | 59 | * Git 60 | * `sudo apt install git` 61 | 62 | # はじめに 63 | 64 | 2021/11/13 の Go Conference 2021 Autumn Online 当日に TinyGo ハンズオンを行います。ハンズオンでは、組込ソフトとしての側面にフォーカスし、 L チカ (LED を光らせる) などを行います。 65 | 66 | 今回ハンズオンを実施するにあたり、 Seeed株式会社様より Wio Terminal ボードをスポンサー していただきました。この connpass イベントに参加申し込みをし、当選した人には TinyGo ハンズオンで使用する Wio Terminal ボードを事前に送付 いたします。 67 | https://www.seeed.co.jp/ 68 | 69 | このイベントは日本語で開催されます。 70 | This event will be held in Japanese. 71 | 72 | # 対象としている読者 73 | 74 | 以下を対象としています。 75 | もちろん、すでに TinyGo + Wio Terminal で遊び倒している人でも問題ありません。 76 | 77 | * Go を少し触ったことがある 78 | * 組込マイコンで遊んだことがない 79 | * TinyGo を使ったことがない 80 | * Wio Terminal は今回が初めて 81 | 82 | # TinyGo とは 83 | 84 | マイコンや WASM などの Small Places 向けの Go Compiler です。 85 | 大雑把な理解としては Go の文法でマイコン開発や WASM 開発ができるもの、という程度の認識でよいです。 86 | 87 | * [TinyGo - Go on Microcontrollers and WASM](https://tinygo.org/) 88 | 89 | 90 | # Go と TinyGo の違い 91 | 92 | 基本的な構文は Go と同じですが、パソコンを前提として作られている Go とは異なり、より小さいリソースで動作するような割り切りがあります。 93 | また、マイコンで使うためのいくつかのディレクティブが追加されています。 94 | 95 | * 0.21.0 時点で goroutine は GOMAXPROCS = 1 時のときの動作に近い 96 | * 例えば `time.Sleep()` 等のブロックする命令が呼ばれない限り goroutine は切り替わらない 97 | * runtime package などいくつかの標準 package は TinyGo 側のものが使われる 98 | * 一方で fmt や encoding などは Go のものが使われる 99 | * マイコンやターゲットボード向けの標準 package が追加されている 100 | * マイコンやボード毎の差異を吸収するための machine package や runtime package など 101 | * volatile アクセスのための runtime/volatile package 102 | * reflect package が完全ではない 103 | * これにより、よく話題にあがる encoding/json が動かない、などが発生している 104 | * 未使用変数や未使用関数等は最適化により削除される 105 | 106 | # 必要な環境 107 | 108 | このハンズオンでは PC と Wio Terminal 以外の外付けの部品は使用しません。 109 | 必要なのは TinyGo が動く PC と Wio Terminal のみです。 110 | 111 | * 機材 112 | * PC (Windows / macOS / Linux のいずれか) 113 | * 詳しくはオフィシャルページの [Getting Started / Quick install](https://tinygo.org/getting-started/install/) を参照 114 | * 手元で Windows 10 および Ubuntu 20.04 の環境は試しています 115 | * Wio Terminal 116 | * 公式: https://www.seeedstudio.com/Wio-Terminal-p-4509.html 117 | * 例えば以下から購入できます 118 | * https://akizukidenshi.com/catalog/g/gM-15275/ 119 | * https://www.switch-science.com/catalog/6360/ 120 | * https://www.marutsu.co.jp/pc/i/1633550/ 121 | * https://www.amazon.co.jp/studio-MicroPython-Raspberry-ATSAMD51%E3%83%99%E3%83%BC%E3%82%B9-%E3%83%87%E3%83%A5%E3%82%A2%E3%83%AB%E3%83%90%E3%83%B3%E3%83%89WiFi/dp/B08CHBV88D 122 | * ソフトウェア 123 | * [Getting Started / Quick install](https://tinygo.org/getting-started/install/) に従い以下をインストールする 124 | * Go 1.17 125 | * goenv 等は使用しないほうが環境立ち上げで失敗しにくい 126 | * TinyGo 0.21.0 127 | * 上記以外 128 | * Git 129 | * シリアル通信ソフト 130 | * このハンズオンでは、このハンズオン用に作成した `github.com/sago35/yterm` を使います 131 | * 例) Windows : [Tera Term](https://ttssh2.osdn.jp/) など 132 | * 例) macOS / Linux : [Minicom](https://salsa.debian.org/minicom-team/minicom) や [GNU Screen](https://www.gnu.org/software/screen/) など 133 | 134 | 135 | # Wio Terminal とは 136 | 137 | Wio Terminal は Seeed 社のディスプレイ付きの開発ボードです。320 x 240 のディスプレイ、 WiFi / BLE 搭載、ボタンに加速度センサに MicroSD カードスロットに、と非常に多機能です。 138 | 139 | マイコンは Microchip 社の ATSAMD51P19 (Arm Cortex-M4 120MHz) が搭載されています。 140 | 141 | 公式 : https://www.seeedstudio.com/Wio-Terminal-p-4509.html 142 | 日本語 wiki : https://wiki.seeedstudio.com/jp/Wio-Terminal-Getting-Started/ 143 | 英語 wiki : https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/ 144 | 145 | ![image.png](./images/01.png) 146 | 147 | ![image.png](./images/02.png) 148 | 149 | ※画像は [公式サイト](https://www.seeedstudio.com/Wio-Terminal-p-4509.html) より 150 | 151 | # 環境設定/インストール 152 | 153 | `tinygo version` で version が表示できるところまで環境設定を行います。 154 | 初回実行時は (特に Windows で) 少し時間がかかりますが、これは cached GOROOT を作るのに時間がかかるから、です。 155 | 二回目以降の tinygo コマンド実行時は cache されているので時間はかかりません。 156 | cached GOROOT は、 Go と TinyGo それぞれの標準パッケージをマージした GOROOT を作成しています。 157 | cached GOROOT の場所は以下のコマンドで確認できます。 158 | 159 | ``` 160 | $ tinygo info wioterminal 161 | LLVM triple: thumbv7em-unknown-unknown-eabi 162 | GOOS: linux 163 | GOARCH: arm 164 | GOARM: 7 165 | build tags: cortexm baremetal linux arm atsamd51p19a atsamd51p19 atsamd51 sam wioterminal tinygo math_big_pure_go gc.conservative scheduler.tasks serial.usb 166 | garbage collector: conservative 167 | scheduler: tasks 168 | cached GOROOT: %LOCALAPPDATA%\tinygo\goroot-go1.17.3-e453cdef992707f5207f1d88a470047697dbe3a2e9e9d25eeaf1604099de8d75-syscall 169 | ``` 170 | 171 | ## Windows 172 | 173 | ### Git 174 | 175 | 以下からダウンロードしてインストールしてください。 176 | 177 | * https://gitforwindows.org/ 178 | * https://github.com/git-for-windows/git/releases/download/v2.33.1.windows.1/Git-2.33.1-64-bit.exe 179 | 180 | 181 | インストールしたら、以下を実行してインストールできていることを確認してください。 182 | 183 | ``` 184 | $ git version 185 | git version 2.33.1.windows.1 186 | ``` 187 | 188 | ### Go 189 | 190 | 以下からダウンロードしてインストールしてください。 191 | 192 | * https://golang.org/dl/ 193 | * https://golang.org/dl/go1.17.3.windows-amd64.msi 194 | 195 | 196 | インストールしたら、以下を実行してインストールできていることを確認してください。 197 | 198 | ``` 199 | $ go version 200 | go version go1.17.3 windows/amd64 201 | ``` 202 | 203 | ### TinyGo 204 | 205 | 以下をダウンロードして生成される `tinygo` フォルダを `C:\tinygo` となるように解凍/コピーしてください。最終的に `C:\tinygo\bin\tinygo.exe` に `tinygo.exe` が存在すればよいです。 206 | 207 | * https://tinygo.org/getting-started/install/windows/ 208 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.windows-amd64.zip 209 | 210 | 環境変数 PATH を通しておきます。このハンズオンでは cmd.exe もしくは Git に含まれる bash.exe を使用してください。 211 | 212 | ``` 213 | # cmd.exe を使う場合 214 | $ set PATH=C:\tinygo\bin;%PATH 215 | 216 | # Git に含まれる bash.exe を使う場合 217 | $ export PATH=/C/tinygo/bin:$PATH 218 | ``` 219 | 220 | インストールしたら、以下を実行してインストールできていることを確認してください。 221 | 222 | ``` 223 | $ tinygo version 224 | tinygo version 0.21.0 windows/amd64 (using go version go1.17 and LLVM version 11.0.0) 225 | ``` 226 | 227 | 228 | ### yterm 229 | 230 | 以下を実行してください。 231 | Windows / macOS / Linux のそれぞれで実行可能です。 232 | 233 | ``` 234 | $ go install github.com/sago35/yterm@latest 235 | ``` 236 | 237 | インストールしたら、以下を実行してインストールできていることを確認してください。 238 | 239 | ``` 240 | $ yterm --help 241 | (略) 242 | ``` 243 | 244 | コマンドが実行できない場合は `%GOPATH%\bin` を PATH を通してから再度実施してください。 245 | 246 | ``` 247 | # GOPATH を確認する 248 | $ go env GOPATH 249 | C:\Users\tinygo\dev 250 | 251 | $ set PATH=%PATH%;C:\Users\tinygo\dev 252 | ``` 253 | 254 | ## macOS 255 | 256 | ### Git 257 | 258 | macOS の人はもしインストールされていない場合は以下でインストールしてください。 259 | 260 | * `brew install git` 261 | * https://qiita.com/suke_masa/items/4bed855628f7414293f8 262 | 263 | ``` 264 | $ git version 265 | git version 2.33.1 266 | ``` 267 | 268 | ### Go 269 | 270 | 以下からダウンロードしてインストールしてください。 271 | 272 | * https://golang.org/dl/ 273 | * intel chip : https://golang.org/dl/go1.17.3.darwin-amd64.pkg 274 | * apple m1 chip : https://golang.org/dl/go1.17.3.darwin-arm64.pkg 275 | 276 | ``` 277 | $ go version 278 | go version go1.17.3 279 | ``` 280 | 281 | ### TinyGo 282 | 283 | 以下をダウンロードして生成される `tinygo` フォルダを `~/tinygo` に解凍/コピーしてください。最終的に `~/tinygo/bin/tinygo` に `tinygo` の実行体が存在すればよいです。 284 | 285 | * https://tinygo.org/getting-started/install/macos/ 286 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo0.21.0.darwin-amd64.tar.gz 287 | 288 | 環境変数 PATH を通しておきます。 289 | 290 | ``` 291 | $ export PATH=~/tinygo/bin:$PATH 292 | ``` 293 | 294 | インストールしたら、以下を実行してインストールできていることを確認してください。 295 | 296 | ``` 297 | $ tinygo version 298 | tinygo version 0.21.0 darwin/amd64 (using go version go1.17 and LLVM version 11.0.0) 299 | ``` 300 | 301 | ### yterm 302 | 303 | 以下を実行してください。 304 | Windows / macOS / Linux のそれぞれで実行可能です。 305 | 306 | ``` 307 | $ go install github.com/sago35/yterm@latest 308 | ``` 309 | 310 | インストールしたら、以下を実行してインストールできていることを確認してください。 311 | 312 | ``` 313 | $ yterm --help 314 | (略) 315 | ``` 316 | 317 | コマンドが実行できない場合は `%GOPATH%\bin` を PATH を通してから再度実施してください。 318 | 319 | ``` 320 | $ export PATH=$PATH:`go env GOPATH`/bin 321 | ``` 322 | 323 | ## Linux 324 | 325 | ### Git 326 | 327 | 以下でインストールしてください。 328 | 329 | * `sudo apt install git` 330 | 331 | Git をインストールしたら、以下を実行してインストールできていることを確認してください。 332 | 333 | ``` 334 | $ git version 335 | git version 2.33.1 336 | ``` 337 | 338 | ### Go 339 | 340 | 以下からダウンロードしてインストールしてください。 341 | 342 | * https://golang.org/dl/ 343 | * https://golang.org/dl/go1.17.3.linux-amd64.tar.gz 344 | 345 | インストール方法は以下に記載されています。 346 | 347 | * https://golang.org/doc/install 348 | 349 | Go をインストールしたら、以下を実行してインストールできていることを確認してください。 350 | 351 | ``` 352 | $ go version 353 | go version go1.17.3 354 | ``` 355 | 356 | ### TinyGo 357 | 358 | 以下をダウンロードして、後述の dpkg でインストールしてください。 359 | 360 | * https://tinygo.org/getting-started/install/linux/ 361 | * https://github.com/tinygo-org/tinygo/releases/download/v0.21.0/tinygo_0.21.0_amd64.deb 362 | 363 | ``` 364 | $ sudo dpkg -i tinygo_0.21.0_amd64.deb 365 | ``` 366 | 367 | 環境変数 PATH を通しておきます。 368 | 369 | ``` 370 | $ export PATH=$PATH:/usr/local/tinygo/bin 371 | ``` 372 | 373 | インストールしたら、以下を実行してインストールできていることを確認してください。 374 | 375 | ``` 376 | $ tinygo version 377 | tinygo version 0.21.0 linux/amd64 (using go version go1.17 and LLVM version 11.0.0) 378 | ``` 379 | 380 | ### yterm 381 | 382 | 以下を実行してください。 383 | Windows / macOS / Linux のそれぞれで実行可能です。 384 | 385 | ``` 386 | $ go install github.com/sago35/yterm@latest 387 | ``` 388 | 389 | インストールしたら、以下を実行してインストールできていることを確認してください。 390 | 391 | ``` 392 | $ yterm --help 393 | (略) 394 | ``` 395 | 396 | コマンドが実行できない場合は `%GOPATH%\bin` を PATH を通してから再度実施してください。 397 | 398 | ``` 399 | $ export PATH=$PATH:`go env GOPATH`/bin 400 | ``` 401 | 402 | ## TinyGo のインストール確認1 (build) 403 | 404 | 以下のコマンドで、正常にビルドが出来ることを確認してください。以下のように何らかの情報が表示されれば、 TinyGo のインストールは正常にできていて、少なくとも Wio Terminal の開発は可能となります。他のボード/マイコンについては別途追加インストールが必要になる場合があります。 405 | 406 | ``` 407 | $ tinygo build -o blinky.uf2 --target wioterminal --size short examples/blinky1 408 | code data bss | flash ram 409 | 7556 36 6336 | 7592 6372 410 | ``` 411 | 412 | ## TinyGo のインストール確認2 (手動でのマイコン書き換え) 413 | 414 | 上記で `blinky.uf2` を作った場合は以下の方法で書き込むことができます。 415 | docker を使っている場合は、このやり方がシンプルな書き込み方法になります。 416 | 417 | * ブートローダーに遷移させる 418 | * 素早くリセットを 2 回実行します (参考: [Wio TerminalのUSB書き込みエラーの回復方法](https://qiita.com/carcon999/items/ec8045adc1309b2e5361)) 419 | * うまく遷移出来た場合、下記画像の青色 LED がやさしく光ります 420 | * また、この時 OS からはマスストレージデバイスとして認識されます 421 | * マスストレージデバイスとして OS から認識されるので、 uf2 をルートドライブにコピーする 422 | * Windows の場合は例えば `cmd.exe` から `copy blinky.uf2 D:` 等で書き込みできます 423 | 424 | 書き込みが完了したら、 USB 端子付近の青色 LED が 1 秒周期で点滅します。この時マスストレージデバイスのマウントが解除されますが、正常な動作です。 425 | 426 | ![image.png](./images/03.png) 427 | 428 | > tips: マスストレージデバイスとして認識されない場合 429 | > セキュリティソフト/ポリシーなどによりマスストレージデバイス (※) のマウントを禁止している場合があります。この場合はハンズオンを継続することができません。 430 | > ※ USB フラッシュメモリ等 431 | 432 | ## TinyGo のインストール確認3 (tinygo flash による書き換え) 433 | 434 | 以下のコマンドを実行することで、ビルドしつつ書き換えすることができます。基本的にはこのやり方を使って開発のサイクルを回していきます。書き換えに成功したことが分かるように、先ほどとは違うものを書き込んでみましょう。 435 | 436 | ``` 437 | $ tinygo flash --target wioterminal --size short examples/button 438 | code data bss | flash ram 439 | 7584 36 6336 | 7620 6372 440 | ``` 441 | 442 | `examples/button` は、 `machine.BUTTON` (別名: `machine.WIO_KEY_A`) が押された時だけ LED を点灯します。 443 | `WIO_KEY_A` は Wio Terminal の上部に 3 つあるボタンの一番右 (内側) のボタンです。 444 | 445 | > tips: examples の場所 446 | > TinyGo をインストールした場所の `src/examples` 以下に色々な例があります。> もしくは、 [github.com/tinygo-org/tinygo/tree/release/src/examples](https://github.com/tinygo-org/tinygo/tree/release/src/examples) からもダウンロードできます。 すべてが Wio Terminal で実行できるわけではないことに注意が必要です。 Wio Terminal で動く形でまとめたものは以下にありますので適宜参照してください 447 | > 448 | > * [Wio Terminal の周辺デバイスを使用する](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#wio-terminal-%E3%81%AE%E5%91%A8%E8%BE%BA%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B) 449 | 450 | ### tinygo flash が失敗する場合 451 | 452 | panic してしまうような実行体をマイコンに書き込んだ場合などは、 tinygo flash が失敗します。 453 | この場合は、手動でブートローダーモードに入れてから `tinygo flash` を使ってください。 454 | 455 | 参考: [COM ポートが見つからない場合](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#com-%E3%83%9D%E3%83%BC%E3%83%88%E3%81%8C%E8%A6%8B%E3%81%A4%E3%81%8B%E3%82%89%E3%81%AA%E3%81%84%E5%A0%B4%E5%90%88) 456 | 457 | 458 | # L チカから始める開発の進め方 459 | 460 | `hello world` の組込み版といえば `L チカ` といって LED を点滅させるプログラムになります。 461 | ここでは、 `L チカ` を動作させてから、少しずつコードを改造していきます。 462 | 463 | > Tips: 464 | > TinyGo ではターゲットボード (`-target` オプションで指定するもの) 毎の差異を `machine` パッケージである程度吸収しています。ボード上に LED が存在する場合は、ほとんどの場合 `machine.LED` という名前で定義されています。 465 | > 例えば wioterminal の定義は以下にあります。 466 | > 467 | > * https://github.com/tinygo-org/tinygo/blob/release/src/machine/board_wioterminal.go 468 | 469 | ## プロジェクトを開始する 470 | 471 | 新しい場所に workshop という名前のフォルダを作成してください。 472 | その後 `go mod init` を実行してください。 473 | 474 | ``` 475 | $ cd (任意の場所) 476 | 477 | $ mkdir workshop 478 | 479 | $ cd workshop 480 | 481 | $ go mod init workshop 482 | ``` 483 | 484 | その後、 `./01_blinky` というフォルダを作り `./01_blinky/main.go` というファイルを以下の内容で作成してください。 485 | 486 | [./01_blinky/main.go](https://github.com/sago35/tinygo-workshop/blob/29c966607ddade5711ad5813595e0e57f68d679f/01_blinky/main.go) 487 | ```go:./01_blinky/main.go 488 | package main 489 | 490 | import ( 491 | "machine" 492 | "time" 493 | ) 494 | 495 | func main() { 496 | //led := machine.LED 497 | led := machine.LCD_BACKLIGHT 498 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 499 | for { 500 | led.Low() 501 | time.Sleep(time.Millisecond * 500) 502 | 503 | led.High() 504 | time.Sleep(time.Millisecond * 500) 505 | } 506 | } 507 | ``` 508 | 509 | 以下で書き込むことができます。 510 | `examples/blinky1` とは異なり液晶全体を LED として点滅させるコードになっています。 511 | 512 | ``` 513 | $ tinygo flash --target wioterminal --size short ./01_blinky/ 514 | code data bss | flash ram 515 | 7556 36 6336 | 7592 6372 516 | 517 | ``` 518 | 519 | うまく書き込みが出来たら、上記ソース内の `led` の定義を `machine.LCD_BACKLIGHT` から `machine.LED` に切り替えてみたり、 `time.Sleep` の待ち時間を変更して周期を変えてみましょう。 520 | ソース変更 → `tinygo flash` → 確認というのが、基本的な開発サイクルになります。 521 | 522 | > tips: tinygo flash や tinygo build 時の package 指定方法 523 | > go build と同じで、現在フォルダの package を build / flash する場合は省略もしくは `.` で指定できます。例えば一つフォルダが深い場合は `./01_blinky` のような指定が必要ですが、同じ階層であれば `.` と書くか省略することができます。単一ファイルから構成されるソースをビルドする場合は、 `./01_blinky/main.go` のような指定もできます 524 | 525 | ## LSP / gopls 対応 526 | 527 | TinyGo は、 machine package などを GOROOT に配置しているため設定を行うまでは gopls 等でエラーが表示され machine.LED の定義元へのジャンプ等が出来ません。 TinyGo は machine package など (Go を良く知っていても) 慣れていない package 構成であったり、 build-tag による分岐などが多いため LSP の設定をしておいた方が無難です。 528 | 529 | ![image.png](./images/04.png) 530 | 531 | 公式ドキュメントは以下にあります。 532 | 533 | * https://tinygo.org/docs/guides/ide-integration/ 534 | 535 | VSCode の場合は `TinyGo` という拡張をインストールすると良いです。 536 | Vim (+ vim-lsp) の場合は github.com/sago35/tinygo.vim を使ってみてください。 537 | 538 | 日本語の情報としては以下に記載しています。 539 | 540 | * [TinyGo + 'VSCode or Vim (もしくはそれ以外の LSP 対応エディタ)' で gopls 連携する方法](https://qiita.com/sago35/items/c30cbce4a0a3e12d899c) 541 | * [TinyGo + Vim で gopls するための設定](https://qiita.com/sago35/items/f0b058ed5c32b6446834) 542 | 543 | ## 基本的な printf debug の方法 544 | 545 | デバッグ方法が分からないと次のステップに進みにくいです。 546 | 組込み環境のデバッグ方法にもいろいろありますが、ここでは `printf debug` を用いた方法を学びます。 547 | 548 | > tips: メリットデメリット 549 | > このやり方は外部にデバッグ用のハードが不要なのが良いところです。一方で、 panic してしまうようなソースコードに対しては確認が困難です。そのような場合は Wio Terminal の外側に専用のデバッガを追加する形で対応しますが、ここでは扱いません。 550 | 551 | ### println と fmt.Print 552 | 553 | TinyGo では `println` や `fmt.Print` 等で出力される先は USB-CDC or UART となっていて、 Wio Terminal は USB-CDC を使うように初期設定されています。シリアル通信ソフトを用いてマイコンからの出力を PC で受け取ったり、 PC からの出力をマイコンで受け取ったりすることができます。 554 | ここでは、 `printf debug` に必要なマイコン側から PC に出力するためのソースコードを紹介します。 555 | 先ほどのコードに `cnt` 変数を追加しつつ `fmt.Printf()` で値を確認してみましょう。 556 | ※追加した行には、 `// ← 追加` というコメントを記載しています 557 | 558 | [./01_blinky/main.go](https://github.com/sago35/tinygo-workshop/blob/00ee52475c538857d48e0d6e918265585032946d/01_blinky/main.go) 559 | ```go:./01_blinky/main.go 560 | package main 561 | 562 | import ( 563 | "fmt" // ← 追加 564 | "machine" 565 | "time" 566 | ) 567 | 568 | func main() { 569 | //led := machine.LED 570 | led := machine.LCD_BACKLIGHT 571 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 572 | cnt := 0 // ← 追加 573 | for { 574 | cnt++ // ← 追加 575 | fmt.Printf("cnt %d\r\n", cnt) // ← 追加 576 | led.Low() 577 | time.Sleep(time.Millisecond * 500) 578 | 579 | led.High() 580 | time.Sleep(time.Millisecond * 500) 581 | } 582 | } 583 | ``` 584 | 585 | > tips: シリアル通信の改行コード 586 | > シリアル通信は基本的には LF でもよいですが CRLF にしたほうが無難です。 `println()` で CRLF にする場合は面倒ですが `println("hello", "\r")` のようにすることができます。 587 | 588 | シリアルポートを開くと以下のように 1 秒毎に 1 行表示されると思います。例えば wioterminal に接続する場合は以下のように実行します。もし、うまく接続できない場合は後述のポート名を指定するやり方を試してください。シリアルポートのモニターが不要となった時は、 Ctrl-C で閉じてください。 589 | 590 | ``` 591 | $ yterm --target wioterminal 592 | ... 593 | cnt : 6 594 | cnt : 7 595 | cnt : 8 596 | cnt : 9 597 | cnt : 10 598 | ... 599 | ``` 600 | 601 | うまくいかない場合は、シリアルポートとして認識されているか、マイコンは動いているか、を確認してください。マイコンが動いているかどうかは、例えば LED 点灯状態により確認できます。上記のソースコードのように `L チカ` のようなコードを埋め込むと良いです。 602 | 603 | 604 | > tips: TinyGo の main() 関数は終了しないようにする 605 | > main() 関数を抜けた場合、プログラムは完全に停止します。この状態では `tinygo flash` に失敗するなどあまり良くない状態となります。なので、基本的には `for { time.Sleep(time.Hour) }` などで `main()` 関数を抜けないようにするのが TinyGo 流となります。 606 | 607 | ### ポートを指定して yterm で接続する 608 | 609 | Wio Terminal が複数接続されている場合等はポートを指定して yterm に接続する必要があるかもしれません。まずはポート名を調べるために、 `yterm list` を実行します。 610 | 611 | ``` 612 | $ yterm list 613 | COM8 2886 002D wioterminal 614 | ``` 615 | 616 | 上記の場合は COM8 に wioterminal が存在するため以下を実行します。 617 | 618 | ``` 619 | $ yterm --port COM8 620 | ``` 621 | 622 | Windows の場合は `COM8` のような名前ですが他の OS では `/dev/cu.usb1` や `/dev/ttyACM1` のような名前でポートを指定できます。 623 | 624 | > tips: なぜ yterm を使うか 625 | > Windows だと、ポートを開放しないとマイコン書き換え (`tinygo flash`) に失敗するため、説明することが増えるし、 OS 毎の説明を書くと複雑になるため。慣れている人は好きなソフトを使ってください。 626 | 627 | ### Windows OS での注意点 628 | 629 | Windows では何らかのソフトがシリアルポートを開いている時は、他のソフトはアクセスできません。 630 | yterm や Tera Term 等で接続しているときに `tinygo flash` しようとすると以下のようなエラーとなります。 631 | 通信ソフトを閉じるか、ブートローダーに遷移させてください。 632 | 633 | ``` 634 | $ tinygo flash --target wioterminal --size short ./01_blinky/ 635 | code data bss | flash ram 636 | 46096 1384 6336 | 47480 7720 637 | error: failed to reset port %TEMP%\tinygo914402091\main.uf2: opening port: Serial port busy 638 | ``` 639 | 640 | ## 外部 package を使用する1 (例を実行する) 641 | 642 | Go と基本的には同じで `import` に外部 package を追加した上で `go get` が必要になります。ここでは `tinygo.org/x/drivers/examples/ili9341/pyportal_boing` を動かす過程で `go get` を使います。以下を実行すると `go get` を促されます。 643 | 644 | ``` 645 | $ tinygo flash --target wioterminal --size short tinygo.org/x/drivers/examples/ili9341/pyportal_boing 646 | no required module provides package tinygo.org/x/drivers/examples/ili9341/pyportal_boing; to add it: 647 | go get tinygo.org/x/drivers/examples/ili9341/pyportal_boing 648 | ``` 649 | 650 | しかし、指示通りに `go get` してもうまく行く場合もありますが、失敗する場合もあります。 651 | 失敗時はエラーメッセージが表示の通り TinyGo のみに存在する標準 package を見つけることができずエラーになります。 652 | 653 | ``` 654 | $ go get tinygo.org/x/drivers/examples/ili9341/pyportal_boing 655 | go: downloading tinygo.org/x/drivers v0.18.0 656 | tinygo.org/x/drivers/examples/ili9341/pyportal_boing imports 657 | tinygo.org/x/drivers/ili9341 imports 658 | machine: package machine is not in GOROOT (c:\go\src\machine) 659 | ``` 660 | 661 | この場合は以下のように実施してください。 662 | 663 | ``` 664 | $ go get tinygo.org/x/drivers 665 | go get: added tinygo.org/x/drivers v0.18.0 666 | ``` 667 | 668 | これで実行できるようになりました。 669 | 670 | ``` 671 | $ tinygo flash --target wioterminal --size short tinygo.org/x/drivers/examples/ili9341/pyportal_boing 672 | code data bss | flash ram 673 | 29964 36 37504 | 30000 37540 674 | ``` 675 | 676 | この状態で `tinygo.org/x/drivers` への依存が `go.mod` に書き込まれているため、 `tinygo.org/x/drivers` 以下の package を使用することが出来るようになります。 677 | 678 | ```:go.mod 679 | module workshop 680 | 681 | go 1.17 682 | 683 | require tinygo.org/x/drivers v0.18.0 // indirect 684 | ``` 685 | 686 | pyportal_boing のソースコードは以下にあります。 687 | 688 | * https://github.com/tinygo-org/drivers/tree/release/examples/ili9341/pyportal_boing 689 | 690 | ## 外部パッケージを使用する2 (ブザーを鳴らす) 691 | 692 | Wio Terminal にはブザーが搭載されています。 693 | 搭載されているブザーは High / Low の周期で音を制御することができます。 694 | 例えば周期として 440Hz で High / Low を変化させることで[ラの音 (A4)](https://ja.wikipedia.org/wiki/A440) を鳴らすことができます。 695 | 696 | ![image.png](./images/05.png) 697 | 698 | > tips: 回路図を確認する 699 | > 組込みにおいて各種センサー等がどこにどのように繋がっているかを確認しておく必要があります。 Wio Terminal の場合は以下にまとまっているので確認しておくと良いです。上記の図は、下記 pdf からの抜粋になります。 700 | > https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/ 701 | > https://files.seeedstudio.com/wiki/Wio-Terminal/res/Wio-Terminal-SCH-v1.2.pdf 702 | 703 | ブザーは tinygo.org/x/drivers/buzzer を使って動作させることができます。 704 | 上記で `go get tinygo.org/x/drivers` を実行している場合はそのまま動きます。 705 | `tinygo.org/x/drivers/buzzer` は現状 time.Sleep() を用いた周波数制御であまり精度が良くないため綺麗な音は鳴らないのですが、 main.go を以下のように書き換えることで最低限の動作をさせることができます。 706 | 変更箇所は `// ↓ 追加` と `// ↑ 追加` の間、もしくは `// ← 追加` が書かれた行となります。 707 | 708 | [./01_blinky/main.go](./01_blinky/main.go) 709 | ```go:./01_blinky/main.go 710 | package main 711 | 712 | import ( 713 | "fmt" 714 | "machine" 715 | "time" 716 | 717 | "tinygo.org/x/drivers/buzzer" // ← 追加 718 | ) 719 | 720 | // ↓ 追加 721 | type note struct { 722 | tone float64 723 | duration float64 724 | } 725 | // ↑ 追加 726 | 727 | func main() { 728 | //led := machine.LED 729 | led := machine.LCD_BACKLIGHT 730 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 731 | cnt := 0 732 | 733 | // ↓ 追加 734 | bzrPin := machine.WIO_BUZZER 735 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) 736 | bzr := buzzer.New(bzrPin) 737 | 738 | notes := []note{ 739 | {buzzer.C3, buzzer.Quarter}, 740 | {buzzer.D3, buzzer.Quarter}, 741 | {buzzer.E3, buzzer.Quarter}, 742 | } 743 | // ↑ 追加 744 | 745 | for { 746 | cnt++ 747 | fmt.Printf("cnt %d\r\n", cnt) 748 | led.Low() 749 | time.Sleep(time.Millisecond * 500) 750 | 751 | led.High() 752 | time.Sleep(time.Millisecond * 500) 753 | 754 | // ↓ 追加 755 | for _, n := range notes { 756 | bzr.Tone(n.tone, n.duration) 757 | time.Sleep(10 * time.Millisecond) 758 | } 759 | // ↑ 追加 760 | } 761 | } 762 | ``` 763 | 764 | ## 外部パッケージを使用する3 (ブザーを PWM で鳴らす) 765 | 766 | (2022/05/23 追記しました) 767 | 768 | tinygo.org/x/drivers/tone を使うと PWM でブザーを鳴らすことができます。 769 | Wio Terminal は `machine.WIO_BUZZER` ピンを `machine.TCC0` として使う事で音を鳴らすことができます。 770 | 771 | ```go 772 | bzrPin := machine.WIO_BUZZER 773 | pwm := machine.TCC0 774 | speaker, err := tone.New(pwm, bzrPin) 775 | speaker.SetNote(tone.C6) 776 | ``` 777 | 778 | コードは以下にあります。 779 | 780 | https://github.com/sago35/tinygo-examples/blob/main/wioterminal/buzzer/main.go 781 | 782 | # ハンズオン 783 | 784 | 残りの時間で以下を実行してみましょう。すべてを実行するには時間が足りないと思うので、好きなものからチャレンジしてみてください。 785 | 786 | `USB-CDC 送受信` と `SPI / ILI9341 ディスプレイ` と `SPI / ILI9341 ディスプレイ 2` あたりを実行すると楽しみやすいと思います。 787 | 788 | 困った時は以下の記事も参考になると思います。 789 | 790 | * [Wio Terminal の周辺デバイスを使用する](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef#wio-terminal-%E3%81%AE%E5%91%A8%E8%BE%BA%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%82%92%E4%BD%BF%E7%94%A8%E3%81%99%E3%82%8B) 791 | 792 | ## GPIO 793 | 794 | ![image.png](./images/06.png) 795 | 796 | 797 | GPIO は machine.Pin を入力 (machine.PinInput 等) に設定することで入力端子として使用することができます。あるいは既に登場している LED のように machine.PinOutput に設定することで出力端子として使用することができます。実際には以下のようなコードになります。 798 | 799 | ```go 800 | // ボタン A (WIO_KEY_A) を入力モードで初期化 801 | machine.WIO_KEY_A.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 802 | 803 | // 現在の状態 (High / Low) を取得 804 | status := machine.WIO_KEY_A.Get() 805 | ``` 806 | 807 | ```go 808 | // 液晶 (LCD_BACKLIGHT) を出力モードで初期化 809 | machine.LCD_BACKLIGHT.Configure(machine.PinConfig{Mode: machine.PinOutput}) 810 | 811 | // 出力を変化させる 812 | machine.LCD_BACKLIGHT.High() 813 | machine.LCD_BACKLIGHT.Low() 814 | machine.LCD_BACKLIGHT.Toggle() 815 | ``` 816 | 817 | * https://tinygo.org/docs/reference/microcontrollers/machine/wioterminal/#type-pin 818 | * https://github.com/tinygo-org/tinygo/blob/v0.21.0/src/machine/machine_atsamd51.go#L23-L48 819 | 820 | ここでは、 Wio Terminal に存在する以下のボタン/キーに対応するアプリケーションを作成します。 821 | 822 | * `WIO_KEY_A` ~ `WIO_KEY_B` が押されたら液晶を On にしつつシリアルにボタン名を出力 823 | * 十字キーの上下左右 (`WIO_5S_*`) が押されたら液晶を On にしつつシリアルにキー名を出力 824 | * 十字キー自身が押された (`WIO_5S_PRESS`) ら液晶を On にしつつシリアルにキー名を出力 825 | 826 | [./02_gpio/main.go](./02_gpio/main.go) 827 | ```go:./02_gpio/main.go 828 | package main 829 | 830 | import ( 831 | "fmt" 832 | "machine" 833 | "time" 834 | ) 835 | 836 | const ( 837 | led = machine.LCD_BACKLIGHT 838 | ) 839 | 840 | func main() { 841 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 842 | 843 | machine.WIO_KEY_A.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 844 | machine.WIO_KEY_B.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 845 | machine.WIO_KEY_C.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 846 | 847 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 848 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 849 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 850 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 851 | machine.WIO_5S_PRESS.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 852 | 853 | for { 854 | if !machine.WIO_KEY_A.Get() { 855 | led.Low() 856 | fmt.Printf("machine.WIO_KEY_A pressed\r\n") 857 | } else if !machine.WIO_KEY_B.Get() { 858 | led.Low() 859 | fmt.Printf("machine.WIO_KEY_B pressed\r\n") 860 | } else if !machine.WIO_KEY_C.Get() { 861 | led.Low() 862 | fmt.Printf("machine.WIO_KEY_C pressed\r\n") 863 | } else if !machine.WIO_5S_UP.Get() { 864 | led.Low() 865 | fmt.Printf("machine.WIO_5S_UP pressed\r\n") 866 | } else if !machine.WIO_5S_LEFT.Get() { 867 | led.Low() 868 | fmt.Printf("machine.WIO_5S_LEFT pressed\r\n") 869 | } else if !machine.WIO_5S_RIGHT.Get() { 870 | led.Low() 871 | fmt.Printf("machine.WIO_5S_RIGHT pressed\r\n") 872 | } else if !machine.WIO_5S_DOWN.Get() { 873 | led.Low() 874 | fmt.Printf("machine.WIO_5S_DOWN pressed\r\n") 875 | } else if !machine.WIO_5S_PRESS.Get() { 876 | led.Low() 877 | fmt.Printf("machine.WIO_5S_PRESS pressed\r\n") 878 | } else { 879 | led.High() 880 | } 881 | 882 | time.Sleep(time.Millisecond * 10) 883 | } 884 | } 885 | ``` 886 | 887 | > tips: ボタンが押されている時の電圧は回路によって決まる 888 | > ボタンを押している時に High で離した時に Low になる場合と、その逆になる場合の両方のパターンがあります。これは回路によって決まります。 Wio Terminal はすべてのボタンが Pull-Up されていて離している時は High になっています。 889 | 890 | ## USB-CDC 送受信 891 | 892 | 上記の printf debug にて USB-CDC 経由で Wio Terminal からのデータを PC で受け取ることが出来ました。ここでは PC から Wio Terminal にデータを送って操作してみましょう。 893 | 894 | 題材は以下とします。 895 | 896 | * 仕様 897 | * シリアルから `on\n` と入力すると液晶を ON にする 898 | * シリアルから `off\n` と入力すると液晶を OFF にする 899 | * シリアルから `toggle\n` もしくは `t\n` と入力すると液晶の ON と OFF を切り返る 900 | 901 | `println` や `fmt.Printf` を実行した場合、 Go だと `os.Stdout` に出力されますが、 TinyGo の場合は `machine.Serial` に出力されます。Wio Terminal の `machine.Serial` のデフォルト値は `*machine.USBCDC` 型なので USBCDC への出力となります。 902 | では入力はどうすればよいか。 `*machine.USBCDC` が `io.Reader` インターフェースを持つため普通に読み書きそうなのですが goroutine スイッチの兼ね合いにより TinyGo 0.21.0 時点では bufio.Scanner 等ではうまく動かないので以下のように書く必要があります。 903 | 904 | 下記は `usbcdc.Buffered()` で Wio Terminal が受信したデータがあるかどうかを調べ、データがある場合のみ `usbcdc.ReadByte()` しています。このように書くことで、単に echo するだけのサーバーが出来上がります。 905 | 906 | [./03_usbcdc/main.go](https://github.com/sago35/tinygo-workshop/blob/efb627c1b927d6d81948347bb239e3a806510015/03_usbcdc/main.go) 907 | ```go:./03_usbcdc/main.go 908 | package main 909 | 910 | import ( 911 | "machine" 912 | ) 913 | 914 | func main() { 915 | usbcdc := machine.Serial 916 | 917 | for { 918 | if usbcdc.Buffered() > 0 { 919 | data, _ := usbcdc.ReadByte() 920 | 921 | // just echo the character 922 | usbcdc.WriteByte(data) 923 | } 924 | } 925 | } 926 | ``` 927 | 928 | あとは USBCDC 経由で `on\r\n` もしくは `on\n` と入力された場合等に所定のコマンド等を実行するようにします。改行文字が入力されるまでは buffer していくようにするとうまく処理できます。 929 | 930 | 完成形は以下になります。 931 | 932 | [./03_usbcdc/main.go](./03_usbcdc/main.go) 933 | ```go:./03_usbcdc/main.go 934 | package main 935 | 936 | import ( 937 | "machine" 938 | "time" 939 | ) 940 | 941 | func main() { 942 | led := machine.LCD_BACKLIGHT 943 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 944 | led.High() 945 | 946 | usbcdc := machine.Serial 947 | usbcdc.Configure(machine.UARTConfig{}) 948 | 949 | input := make([]byte, 64) 950 | i := 0 951 | for { 952 | if usbcdc.Buffered() > 0 { 953 | data, _ := usbcdc.ReadByte() 954 | 955 | switch data { 956 | case 13: 957 | // return key 958 | usbcdc.Write([]byte("\r\n")) 959 | 960 | switch string(input[:i]) { 961 | case "on": 962 | led.High() 963 | case "off": 964 | led.Low() 965 | case "toggle", "t": 966 | led.Toggle() 967 | } 968 | i = 0 969 | default: 970 | // just echo the character 971 | usbcdc.WriteByte(data) 972 | input[i] = data 973 | i++ 974 | } 975 | } 976 | time.Sleep(10 * time.Millisecond) 977 | } 978 | } 979 | ``` 980 | 981 | ## タイマー割込み 982 | 983 | TinyGo では `time.Sleep()` や `time.Tick()` を用いてある程度の精度での周期処理等を実現できます。が、正確に刻みたい場合は systick を使うと良いです。以下は examples/systick と同じです。使うときは channel と組み合わせると良いです。 984 | 985 | * https://github.com/tinygo-org/tinygo/blob/release/src/examples/systick/systick.go 986 | 987 | [./04_systick/main.go](./04_systick/main.go) 988 | ```go:./04_systick/main.go 989 | package main 990 | 991 | import ( 992 | "device/arm" 993 | "machine" 994 | ) 995 | 996 | var timerCh = make(chan struct{}, 1) 997 | 998 | func main() { 999 | //led := machine.LED 1000 | led := machine.LCD_BACKLIGHT 1001 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 1002 | 1003 | // timer fires 10 times per second 1004 | arm.SetupSystemTimer(machine.CPUFrequency() / 10) 1005 | 1006 | for { 1007 | led.Low() 1008 | <-timerCh 1009 | led.High() 1010 | <-timerCh 1011 | } 1012 | } 1013 | 1014 | //export SysTick_Handler 1015 | func timer_isr() { 1016 | select { 1017 | case timerCh <- struct{}{}: 1018 | default: 1019 | // The consumer is running behind. 1020 | } 1021 | } 1022 | ``` 1023 | 1024 | ## PWM / ブザー 1025 | 1026 | ![image.png](./images/07.png) 1027 | 1028 | ここでは、 buzzer package を使ってドレミの歌を作ってみましょう。以下の buzzer package を使って音の高さと長さを処理することができます。 1029 | 1030 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/buzzer 1031 | 1032 | 完成版 (と言っても最初のフレーズのみですが) は以下。 1033 | 1034 | [./05_buzzer/main.go](./05_buzzer/main.go) 1035 | ```go:./05_buzzer/main.go 1036 | package main 1037 | 1038 | import ( 1039 | "machine" 1040 | "time" 1041 | 1042 | "tinygo.org/x/drivers/buzzer" 1043 | ) 1044 | 1045 | type note struct { 1046 | tone float64 1047 | duration float64 1048 | } 1049 | 1050 | func main() { 1051 | bzrPin := machine.WIO_BUZZER 1052 | bzrPin.Configure(machine.PinConfig{Mode: machine.PinOutput}) 1053 | bzr := buzzer.New(bzrPin) 1054 | 1055 | notes := []note{ 1056 | {buzzer.C3, buzzer.Quarter}, 1057 | {buzzer.Rest, buzzer.Eighth}, 1058 | {buzzer.D3, buzzer.Eighth}, 1059 | {buzzer.E3, buzzer.Quarter}, 1060 | {buzzer.Rest, buzzer.Eighth}, 1061 | {buzzer.C3, buzzer.Eighth}, 1062 | {buzzer.E3, buzzer.Quarter}, 1063 | {buzzer.C3, buzzer.Quarter}, 1064 | {buzzer.E3, buzzer.Half}, 1065 | } 1066 | 1067 | for _, n := range notes { 1068 | bzr.Tone(n.tone, n.duration) 1069 | time.Sleep(10 * time.Millisecond) 1070 | } 1071 | 1072 | for { 1073 | time.Sleep(time.Hour) 1074 | } 1075 | } 1076 | ``` 1077 | 1078 | > tips: buzzer の音が綺麗に鳴らない 1079 | > 綺麗な音を鳴らすには buzzer に対してある程度正確に ON / OFF 信号を与える必要があります。現時点の buzzer package はソフトウェアで時間を計算しているためあまり正確ではありません。いずれこの部分はハードウェア PWM 機能を使うことで改善していくはずです。 1080 | 1081 | 追記) tinygo.org/x/drivers/tone を使うことで PWM 制御となり綺麗な音が鳴るようになります 1082 | 1083 | ## ADC / 光センサー 1084 | 1085 | ![image.png](./images/08.png) 1086 | 1087 | Wio Terminal には本体背面の透明窓の中に光センサーが搭載されています。この光センサーは光の強さを電圧に変換する動きであるため、 Wio Terminal からは電圧を読むと光の強さを知ることができます。光が強い時は 0xFFFF に近い値となり、光が弱いときは 0x0000 に近い値となります。光センサーは `machine.WIO_LIGHT` という名前でアクセスできます。 1088 | 1089 | AD 値の読み取りを行う場合は、以下のように設定した上で使う必要があります。 TinyGo の ADC 初期設定は 12bit ADC で、左寄せとなっているため 0x0000 ~ 0xFFF0 の値を取ります。 1090 | 1091 | ```go 1092 | // machine.ADC 型の変数を作り、 Configure() をコールする 1093 | sensor := machine.ADC{Pin: machine.WIO_LIGHT} 1094 | sensor.Configure(machine.ADCConfig{}) 1095 | 1096 | // AD 値を読み取る 1097 | val := sensor.Get() 1098 | ``` 1099 | 1100 | ここでは、光の強さに対応する電圧値 (0x0000 - 0xFFFF) をシリアルに出力しつつ、 0x8000 以上であれば led (液晶画面) を ON にするプログラムを作成します。 1101 | 1102 | ADC については以下に記載があります。 1103 | 1104 | * https://tinygo.org/docs/reference/microcontrollers/machine/wioterminal/#type-adc 1105 | 1106 | [./06_light_sensor/main.go](./06_light_sensor/main.go) 1107 | ```go:./06_light_sensor/main.go 1108 | package main 1109 | 1110 | import ( 1111 | "fmt" 1112 | "machine" 1113 | "time" 1114 | ) 1115 | 1116 | func main() { 1117 | machine.InitADC() 1118 | 1119 | led := machine.LCD_BACKLIGHT 1120 | led.Configure(machine.PinConfig{Mode: machine.PinOutput}) 1121 | 1122 | sensor := machine.ADC{Pin: machine.WIO_LIGHT} 1123 | sensor.Configure(machine.ADCConfig{}) 1124 | 1125 | for { 1126 | val := sensor.Get() 1127 | fmt.Printf("%04X\r\n", val) 1128 | if val < 0x8000 { 1129 | led.Low() 1130 | } else { 1131 | led.High() 1132 | } 1133 | time.Sleep(time.Millisecond * 100) 1134 | } 1135 | } 1136 | ``` 1137 | 1138 | ## I2C / 加速度センサー 1139 | 1140 | ![image.png](./images/09.png) 1141 | 1142 | Wio Terminal には 3 軸加速度センサーである LIS3DH が搭載されています。 X / Y / Z 軸それぞれの加速度を読み取ることで傾き検知等が可能です。これは I2C 接続されているため、事前に I2C のセットアップが必要です。 I2C は回路図表記の `I2C0` ではなく `machine.I2C1` を使用します。 1143 | 1144 | ```go 1145 | machine.I2C1.Configure(machine.I2CConfig{SCL: machine.SCL1_PIN, SDA: machine.SDA1_PIN}) 1146 | ``` 1147 | 1148 | LIS3DH の driver は以下にあります。I2C で所定のコマンドを発行すると値を読み取ることが出来るため、とても簡単に使用することができます。 1149 | 1150 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/lis3dh 1151 | 1152 | [./07_lis3dh/main.go](./07_lis3dh/main.go) 1153 | ```go:./07_lis3dh/main.go 1154 | package main 1155 | 1156 | import ( 1157 | "machine" 1158 | "time" 1159 | 1160 | "tinygo.org/x/drivers/lis3dh" 1161 | ) 1162 | 1163 | var i2c = machine.I2C1 1164 | 1165 | func main() { 1166 | i2c.Configure(machine.I2CConfig{SCL: machine.SCL1_PIN, SDA: machine.SDA1_PIN}) 1167 | 1168 | accel := lis3dh.New(i2c) 1169 | accel.Address = lis3dh.Address0 // address on the Wio Terminal 1170 | accel.Configure() 1171 | accel.SetRange(lis3dh.RANGE_2_G) 1172 | 1173 | println(accel.Connected()) 1174 | 1175 | for { 1176 | x, y, z, _ := accel.ReadAcceleration() 1177 | println("X:", x, "Y:", y, "Z:", z) 1178 | 1179 | //rx, ry, rz := accel.ReadRawAcceleration() 1180 | //println("X (raw):", rx, "Y (raw):", ry, "Z (raw):", rz) 1181 | 1182 | time.Sleep(time.Millisecond * 100) 1183 | } 1184 | } 1185 | ``` 1186 | 1187 | 1188 | ## SPI / ILI9341 ディスプレイ 1189 | 1190 | ![image.png](./images/10.png) 1191 | 1192 | 画面を使った処理はパソコン上のプログラムとは異なる感動があると思います。 Wio Terminal には SPI 接続の ili9341 ディスプレイが搭載されています。解像度は 320x240 です。 1193 | 1194 | 所定の初期化を実施した後は、比較的簡単に扱うことができます。ここでは単純な図形を表示してみます。初期化は以下のように行います。 1195 | `InitDisplay()` では ili9341 に接続されている SPI3 / LCD_SCK_PIN / LCD_SDO_PIN / LCD_SDI_PIN / LCD_BACKLIGHTの初期化を行い `*ili9341.Device` を返しています。以降は `*ili9341.Device` を用いて画面に描画していきます。 1196 | 1197 | ```go 1198 | func InitDisplay() *ili9341.Device { 1199 | machine.SPI3.Configure(machine.SPIConfig{ 1200 | SCK: machine.LCD_SCK_PIN, 1201 | SDO: machine.LCD_SDO_PIN, 1202 | SDI: machine.LCD_SDI_PIN, 1203 | Frequency: 48000000, 1204 | }) 1205 | 1206 | // configure backlight 1207 | backlight := machine.LCD_BACKLIGHT 1208 | backlight.Configure(machine.PinConfig{machine.PinOutput}) 1209 | 1210 | display := ili9341.NewSPI( 1211 | machine.SPI3, 1212 | machine.LCD_DC, 1213 | machine.LCD_SS_PIN, 1214 | machine.LCD_RESET, 1215 | ) 1216 | 1217 | // configure display 1218 | display.Configure(ili9341.Config{}) 1219 | 1220 | backlight.High() 1221 | 1222 | display.SetRotation(ili9341.Rotation270) 1223 | 1224 | return display 1225 | } 1226 | ``` 1227 | 1228 | `tinygo.org/x/drivers.Displayer` インターフェースは以下のように定義されていますので、基本的には `SetPixel()` で描画していくことになります。 1229 | 1230 | ```go 1231 | type Displayer interface { 1232 | // Size returns the current size of the display. 1233 | Size() (x, y int16) 1234 | 1235 | // SetPizel modifies the internal buffer. 1236 | SetPixel(x, y int16, c color.RGBA) 1237 | 1238 | // Display sends the buffer (if any) to the screen. 1239 | Display() error 1240 | } 1241 | ``` 1242 | 1243 | しかし、 `SetPixel()` だけでは遅いし大変なので、多くの場合は `tinygo.org/x/tinydraw` や `tinygo.org/x/drivers/ili9341` の各種関数を用いて描画していきます。 1244 | 1245 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/ili9341 1246 | * https://pkg.go.dev/tinygo.org/x/tinydraw 1247 | * https://pkg.go.dev/tinygo.org/x/tinyfont 1248 | 1249 | ということで、 tinydraw と tinyfont を `go get` しておきましょう。 1250 | 1251 | ``` 1252 | $ go get tinygo.org/x/tinydraw 1253 | go get: added tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c 1254 | 1255 | $ go get tinygo.org/x/tinyfont 1256 | ``` 1257 | 1258 | ここでは以下のような画面を作っていきましょう。この画面は [基礎から学ぶ 組込みRust](https://www.c-r.com/book/detail/1403) で作成する題材の TinyGo 版になります。 1259 | 1260 | ![image.png](./images/11.png) 1261 | 1262 | 画面の構成要素は以下の通りです。 1263 | 1264 | * body : x=20 y=20 の位置から w=280 h=200 を白い四角で塗りつぶす (ili9341.Device.FillRectangle) 1265 | * lcd : x=25 y=25 の位置から w=270 h=160 を黒い四角で塗りつぶす (ili9341.Device.FillRectangle) 1266 | * speaker : x=40+i*15 y=190 の位置から w=5 h=20 を黒い四角で塗りつぶす (ili9341.Device.FillRectangle) 1267 | * buttons : x=40+i*60 y=40 の位置から w=40 h=5 を青い四角で塗りつぶす (ili9341.Device.FillRectangle) 1268 | * 5-way key : x=260 y=180 r=20 の青い円で塗りつぶす (tinydraw.FilledCircle) 1269 | * text : x=30 y=40 の位置にテキストを緑色で表示する (tinyfont.WriteLine) 1270 | * 中心に TinyGo のロゴ (60x51) を表示する (drivers.Displayer.SetPixel) 1271 | 1272 | 上記の画像は以下のようにして出力できます。なお、下記ソース内の `tinygo_logo_s_png` については、 png のデータから `const string` に変換したものを用意する必要があります。 以下の `graphics.go` を各自コピーして使ってください。 1273 | 1274 | * [./08_spi_ili9341](./08_spi_ili9341) 1275 | 1276 | [./08_spi_ili9341/main.go](./08_spi_ili9341/main.go) 1277 | ```go:./08_spi_ili9341/main.go 1278 | package main 1279 | 1280 | import ( 1281 | "image/color" 1282 | "image/png" 1283 | "log" 1284 | "machine" 1285 | "strings" 1286 | "time" 1287 | 1288 | "tinygo.org/x/drivers/ili9341" 1289 | "tinygo.org/x/tinydraw" 1290 | "tinygo.org/x/tinyfont" 1291 | "tinygo.org/x/tinyfont/freemono" 1292 | ) 1293 | 1294 | var ( 1295 | white = color.RGBA{R: 0xFF, G: 0xFF, B: 0xFF, A: 0xFF} 1296 | red = color.RGBA{R: 0xFF, G: 0x00, B: 0x00, A: 0xFF} 1297 | green = color.RGBA{R: 0x00, G: 0xFF, B: 0x00, A: 0xFF} 1298 | blue = color.RGBA{R: 0x00, G: 0x00, B: 0xFF, A: 0xFF} 1299 | black = color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF} 1300 | ) 1301 | 1302 | func main() { 1303 | display := InitDisplay() 1304 | 1305 | // body 1306 | display.FillRectangle(20, 20, 280, 200, white) 1307 | 1308 | // lcd 1309 | display.FillRectangle(25, 25, 270, 160, black) 1310 | 1311 | // speaker 1312 | for i := int16(0); i < 4; i++ { 1313 | display.FillRectangle(40+i*15, 190, 5, 20, black) 1314 | } 1315 | 1316 | // buttons 1317 | for i := int16(0); i < 3; i++ { 1318 | display.FillRectangle(40+i*60, 15, 40, 5, blue) 1319 | } 1320 | 1321 | // 5-way key 1322 | tinydraw.FilledCircle(display, 260, 180, 20, blue) 1323 | 1324 | // text 1325 | tinyfont.WriteLine(display, &freemono.Regular9pt7b, 30, 40, "Booting Wio Terminal...", green) 1326 | 1327 | // tinygo logo 1328 | { 1329 | img, err := png.Decode(strings.NewReader(tinygo_logo_s_png)) 1330 | if err != nil { 1331 | log.Fatal(err) 1332 | } 1333 | 1334 | w := img.Bounds().Dx() 1335 | h := img.Bounds().Dy() 1336 | for y := 0; y < h; y++ { 1337 | for x := 0; x < w; x++ { 1338 | r, g, b, _ := img.At(x, y).RGBA() 1339 | display.SetPixel((320-int16(w))/2+int16(x), (240-int16(h))/2+int16(y), color.RGBA{R: uint8(r >> 8), G: uint8(g >> 8), B: uint8(b >> 8), A: 0xFF}) 1340 | } 1341 | } 1342 | } 1343 | 1344 | for { 1345 | time.Sleep(time.Hour) 1346 | } 1347 | } 1348 | 1349 | func InitDisplay() *ili9341.Device { 1350 | machine.SPI3.Configure(machine.SPIConfig{ 1351 | SCK: machine.LCD_SCK_PIN, 1352 | SDO: machine.LCD_SDO_PIN, 1353 | SDI: machine.LCD_SDI_PIN, 1354 | Frequency: 48000000, 1355 | }) 1356 | 1357 | // configure backlight 1358 | backlight := machine.LCD_BACKLIGHT 1359 | backlight.Configure(machine.PinConfig{machine.PinOutput}) 1360 | 1361 | display := ili9341.NewSPI( 1362 | machine.SPI3, 1363 | machine.LCD_DC, 1364 | machine.LCD_SS_PIN, 1365 | machine.LCD_RESET, 1366 | ) 1367 | 1368 | // configure display 1369 | display.Configure(ili9341.Config{}) 1370 | 1371 | backlight.High() 1372 | 1373 | display.SetRotation(ili9341.Rotation270) 1374 | display.FillScreen(color.RGBA{R: 0x00, G: 0x00, B: 0x00, A: 0xFF}) 1375 | 1376 | return display 1377 | } 1378 | ``` 1379 | 1380 | > tips: 画像表示について 1381 | > png 画像は小さいサイズであれば Go 標準の image/png を使うことができます。解像度が大きくなってくると RAM サイズの制限で描画できない事が多いです。例えば 320 x 240 サイズの `image.Image` 型に Decode された状態だと内部では `*image.RGBA` 型となり最低でも 320 x 240 x 4 = 76800 byte のメモリが必要となります。実際には計算途中のテンポラリ RAM などを含めると Wio Terminal が持つ 192KB の RAM では足りないことが多いです。 1382 | > このあたりを軽減するための package を `tinygo.org/x/drivers/image` に作っていますがまだ release されていません。 1383 | 1384 | ## SPI / ILI9341 ディスプレイ 2 1385 | 1386 | `SPI / ILI9341 ディスプレイ` では静止画の表示のみでした。ここでは少し動きを加えていきます。 1387 | 1388 | 以下のソースに瞬きを実装しているのでベースのソースコードとして go ファイルを 2 つダウンロードしてください。 1389 | 1390 | * [./11_spi_ili9341](https://github.com/sago35/tinygo-workshop/tree/de94799a9c6182bbee778366472ca5061819de7e/11_spi_ili9341) 1391 | * [main.go](https://github.com/sago35/tinygo-workshop/tree/de94799a9c6182bbee778366472ca5061819de7e/11_spi_ili9341/main.go) 1392 | * [graphics.go](https://github.com/sago35/tinygo-workshop/tree/de94799a9c6182bbee778366472ca5061819de7e/11_spi_ili9341/graphics.go) 1393 | 1394 | 上記ソースの状態で以下のようにして、目を閉じたり開いたりを実装しています。 1395 | 1396 | ```go 1397 | initEyes() 1398 | 1399 | for { 1400 | drawEye(display, 127, 91, eyeOpen) 1401 | drawEye(display, 181, 91, eyeOpen) 1402 | time.Sleep(1500 * time.Millisecond) 1403 | drawEye(display, 127, 91, eyeClose) 1404 | drawEye(display, 181, 91, eyeClose) 1405 | time.Sleep(300 * time.Millisecond) 1406 | } 1407 | ``` 1408 | 1409 | ここに対して以下を実装してみましょう。普通に実装しても良いですが、瞬きの時間管理とキー操作の管理を goroutine で分けると組込みでも Go が使えるのか、という実感がわくと思います。 1410 | 1411 | * 上下左右キーで目線を動かす (GPIO の例を参考に) 1412 | * 一定時間で瞬きする 1413 | 1414 | 実際のコードは以下です。 1415 | 1416 | * [./11_spi_ili9341/main.go](./11_spi_ili9341/main.go) 1417 | 1418 | コードの抜粋は以下です。 goroutine を使って瞬きを実現しています。 (もちろん、 goroutine を使わずに実現することもできます) 1419 | 1420 | ```go 1421 | initEyes() 1422 | 1423 | machine.WIO_5S_UP.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 1424 | machine.WIO_5S_LEFT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 1425 | machine.WIO_5S_RIGHT.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 1426 | machine.WIO_5S_DOWN.Configure(machine.PinConfig{Mode: machine.PinInputPullup}) 1427 | 1428 | redraw := true 1429 | xofs := int16(0) 1430 | yofs := int16(0) 1431 | eye := eyeClose 1432 | eyeCh := make(chan struct{}, 1) 1433 | go func() { 1434 | for { 1435 | eyeCh <- struct{}{} 1436 | time.Sleep(1500 * time.Millisecond) 1437 | eyeCh <- struct{}{} 1438 | time.Sleep(300 * time.Millisecond) 1439 | } 1440 | }() 1441 | 1442 | for { 1443 | if !machine.WIO_5S_UP.Get() { 1444 | if 0 < yofs { 1445 | yofs-- 1446 | redraw = true 1447 | } 1448 | } else if !machine.WIO_5S_LEFT.Get() { 1449 | if -4 < xofs { 1450 | xofs-- 1451 | redraw = true 1452 | } 1453 | } else if !machine.WIO_5S_RIGHT.Get() { 1454 | if xofs < 7 { 1455 | xofs++ 1456 | redraw = true 1457 | } 1458 | } else if !machine.WIO_5S_DOWN.Get() { 1459 | if yofs < 20 { 1460 | yofs++ 1461 | redraw = true 1462 | } 1463 | } 1464 | 1465 | select { 1466 | case <-eyeCh: 1467 | if eye == eyeOpen { 1468 | eye = eyeClose 1469 | } else { 1470 | eye = eyeOpen 1471 | } 1472 | redraw = true 1473 | default: 1474 | } 1475 | 1476 | if redraw { 1477 | drawEye(display, 127+xofs, 91+yofs, eye) 1478 | drawEye(display, 181+xofs, 91+yofs, eye) 1479 | redraw = false 1480 | } 1481 | time.Sleep(50 * time.Millisecond) 1482 | } 1483 | ``` 1484 | 1485 | ## WiFi 1486 | 1487 | ![image.png](./images/12.png) 1488 | 1489 | Wio Terminal には Realtek 社の RTL8720DN という WiFi / BLE に対応したチップが搭載されています。 TinyGo からもそのチップを使ってネットワークに接続したいですが、通常の Go の net/http package は大きすぎるため使用できません。そこで、機能制限がありますが TinyGo で使用できる Version を以下に作成しています。 1490 | 1491 | * https://pkg.go.dev/tinygo.org/x/drivers@v0.17.1/rtl8720dn 1492 | 1493 | RTL8720DN を使うためには、最初に firmware の Version Up が必要です。後述の手順に従い Version Up を実施してください。 1494 | 1495 | WiFi の例はコードが非常に長くなるため省略しますが、以下のようにアクセスすることができます。基本的な機能 (`http.Get()` や `http.Post()` など) は Go の標準 package と同じように使うことができます。以下はまだ release branch には merge されていないため `go get tinygo.org/x/drivers@dev` を実行し dev branch を使用するように変更してください。 1496 | 1497 | ```go 1498 | res, err := http.Get(url) 1499 | res, err := http.Post(url, "application/json", body) 1500 | 1501 | req, err := http.NewRequest(method, url, body) 1502 | res, err := http.Do(req) 1503 | ``` 1504 | 1505 | cookie も扱うことができます。 1506 | 1507 | ```go 1508 | import "tinygo.org/x/drivers/net/http/cookiejar" 1509 | 1510 | jar, err := cookiejar.New(nil) 1511 | if err != nil { 1512 | return err 1513 | } 1514 | client := &http.Client{Jar: jar} 1515 | http.DefaultClient = client 1516 | 1517 | res, err := http.Get(url) 1518 | ``` 1519 | 1520 | [./09_webclient](./09_webclient) には HTTP アクセスを行う例があります。 10 秒毎に 1 回 `http://tinygo.org` にアクセスして結果を返します。 ssid と password を変更することで、自身の WiFi アクセスポイントに接続してください。 2.4GHz でも 5GHz でも接続可能です。 1521 | 1522 | [./10_webserver](./10_webserver) は Wio Terminal を Web Server にしてブラウザ経由で操作することができます。以下のような画面で LED の ON / OFF などを試すことができます。 ssid と password を変更することを忘れずに。 Wio Terminal の IP アドレスは USB-CDC 経由で表示させることができます。起動後 5 以内に USB-CDC メッセージを受信できるようにしておいてください。 1523 | 1524 | ![image.png](./images/13.png) 1525 | 1526 | `/6` にアクセスすると以下のようにテトリスで遊ぶことができます。左右キーとスペースキーで操作できます。このテトリスは [たった464文字のテトロミノ落ち物パズル!創る力を拡大しよう、高専インカレ&PCNサミットオンライン] (https://fukuno.jig.jp/3267) で紹介されていたものです。 Wio Terminal は実質的には js ファイルを serve しているだけでゲームには関わっていません。 (ゲーム自体は、アクセスした PC 側で処理されています) 1527 | 1528 | ![image.png](./images/14.png) 1529 | 1530 | その他の例は以下にあるので色々と試してみてください。ソースコード内の ssid と password を設定するのを忘れずに。 1531 | 1532 | * https://github.com/tinygo-org/drivers/tree/dev/examples/rtl8720dn 1533 | 1534 | ### RTL8720DN firmware の Version Up 1535 | 1536 | 以下に従い Version Up を行います。 1537 | 1538 | * https://wiki.seeedstudio.com/Wio-Terminal-Network-Overview/ 1539 | 1540 | #### Windows 1541 | 1542 | 最低限のコマンドを記載します。これでうまくいかない場合は上記の Wiki に詳細があるので確認してください。 1543 | 1544 | ``` 1545 | $ cd %USERPROFILE% 1546 | $ git clone https://github.com/Seeed-Studio/ambd_flash_tool 1547 | $ cd ambd_flash_tool 1548 | $ .\ambd_flash_tool.exe erase 1549 | $ .\ambd_flash_tool.exe flash 1550 | ``` 1551 | 1552 | #### Linux 1553 | 1554 | 最低限のコマンドを記載します。これでうまくいかない場合は上記の Wiki に詳細があるので確認してください。 1555 | 1556 | ``` 1557 | $ cd ~ 1558 | $ git clone https://github.com/Seeed-Studio/ambd_flash_tool 1559 | $ python3 ambd_flash_tool.py erase 1560 | $ python3 ambd_flash_tool.py flash 1561 | ``` 1562 | 1563 | # Bluetooth LE 1564 | 1565 | (現時点の TinyGo は BLE に対応していません) 1566 | 1567 | # まとめ 1568 | 1569 | これでハンズオンは終了となります。開発環境の立ち上げから printf debug までを体験してもらい、その後外部 package の使い方を体験してもらいました。 Wio Terminal はネットワークにもアクセスできるため色々な題材に使うことができます。是非色々なものを作ってみてください。 1570 | 1571 | * https://tinygo.org/ 1572 | * https://tinygo.org/docs/reference/microcontrollers/wioterminal/ 1573 | * https://wiki.seeedstudio.com/Wio-Terminal-Getting-Started/ 1574 | * https://www.seeed.co.jp/ 1575 | * [Wio Terminal で TinyGo プログラミングを始めよう](https://qiita.com/sago35/items/92b22e8cbbf99d0cd3ef) 1576 | * [TinyGo + 'VSCode or Vim (もしくはそれ以外の LSP 対応エディタ)' で gopls 連携する方法](https://qiita.com/sago35/items/c30cbce4a0a3e12d899c) 1577 | * [TinyGo + Vim で gopls するための設定](https://qiita.com/sago35/items/f0b058ed5c32b6446834) 1578 | 1579 | # よくある質問 1580 | 1581 | ## JSON はどうやって扱うの? 1582 | 1583 | TinyGo は現状 reflect package のサポートが十分ではないため encoding/json は限定的にしか使えません。 1584 | JSON 関連は、以下の package を使うと良いです。 1585 | 1586 | * Unmarshal 1587 | * https://github.com/tidwall/gjson 1588 | * https://github.com/buger/jsonparser 1589 | * Marshal 1590 | * https://github.com/moznion/go-json-ice 1591 | 1592 | # LICENSE 1593 | 1594 | MIT 1595 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module workshop 2 | 3 | go 1.17 4 | 5 | require ( 6 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e // indirect 7 | golang.org/x/text v0.3.6 // indirect 8 | tinygo.org/x/drivers v0.17.2-0.20211106202608-3637033fec1c // indirect 9 | tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c // indirect 10 | tinygo.org/x/tinyfont v0.2.1 // indirect 11 | ) 12 | -------------------------------------------------------------------------------- /go.sum: -------------------------------------------------------------------------------- 1 | github.com/bgould/http v0.0.0-20190627042742-d268792bdee7/go.mod h1:BTqvVegvwifopl4KTEDth6Zezs9eR+lCWhvGKvkxJHE= 2 | github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= 3 | github.com/frankban/quicktest v1.10.2/go.mod h1:K+q6oSqb0W0Ininfk863uOk1lMy69l/P6txr3mVT54s= 4 | github.com/google/go-cmp v0.5.2/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= 5 | github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= 6 | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= 7 | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= 8 | github.com/valyala/fastjson v1.6.3/go.mod h1:CLCAqky6SMuOcxStkYQvblddUtoRxhYMGLrsQns1aXY= 9 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e h1:XpT3nA5TvE525Ne3hInMh6+GETgn27Zfm9dxsThnX2Q= 10 | golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= 11 | golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 12 | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= 13 | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= 14 | golang.org/x/text v0.3.6 h1:aRYxNxv6iGQlyVaZmk6ZgYEDa+Jg18DxebPSrd6bg1M= 15 | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= 16 | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 17 | golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= 18 | tinygo.org/x/drivers v0.14.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= 19 | tinygo.org/x/drivers v0.15.1/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= 20 | tinygo.org/x/drivers v0.16.0/go.mod h1:uT2svMq3EpBZpKkGO+NQHjxjGf1f42ra4OnMMwQL2aI= 21 | tinygo.org/x/drivers v0.17.1 h1:pwr/gZAfQgx7Gs71AO+YZBG0QlWfSZrfQ4H17TIGRE0= 22 | tinygo.org/x/drivers v0.17.1/go.mod h1:+uFfVgSjxRPqsnalFrcQse/Tmhoxwl9AJmJIVuRbuRo= 23 | tinygo.org/x/drivers v0.17.2-0.20211106202608-3637033fec1c h1:+Iwmqk+XsWHVKBBoSbtYVupzQYHQV1nwhIv2LU8DZH8= 24 | tinygo.org/x/drivers v0.17.2-0.20211106202608-3637033fec1c/go.mod h1:uJD/l1qWzxzLx+vcxaW0eY464N5RAgFi1zTVzASFdqI= 25 | tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c h1:QKOUxoOXDNosHIoX7PrANTGd5nmLjKKFZ81pXhkjw58= 26 | tinygo.org/x/tinydraw v0.0.0-20200416172542-c30d6d84353c/go.mod h1:ygmD8mKwhhF6HLXIs4FCe5JTYurTD2w32cmymeaYrEw= 27 | tinygo.org/x/tinyfont v0.2.1 h1:FAaemBzw8wsfhAtG6fWW+QjyWw/K8YqEeiWo4N1pv4o= 28 | tinygo.org/x/tinyfont v0.2.1/go.mod h1:eLqnYSrFRjt5STxWaMeOWJTzrKhXqpWw7nU3bPfKOAM= 29 | tinygo.org/x/tinyfs v0.1.0/go.mod h1:ysc8Y92iHfhTXeyEM9+c7zviUQ4fN9UCFgSOFfMWv20= 30 | tinygo.org/x/tinyterm v0.1.0/go.mod h1:/DDhNnGwNF2/tNgHywvyZuCGnbH3ov49Z/6e8LPLRR4= 31 | -------------------------------------------------------------------------------- /images/01.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/01.png -------------------------------------------------------------------------------- /images/02.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/02.png -------------------------------------------------------------------------------- /images/03.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/03.png -------------------------------------------------------------------------------- /images/04.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/04.png -------------------------------------------------------------------------------- /images/05.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/05.png -------------------------------------------------------------------------------- /images/06.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/06.png -------------------------------------------------------------------------------- /images/07.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/07.png -------------------------------------------------------------------------------- /images/08.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/08.png -------------------------------------------------------------------------------- /images/09.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/09.png -------------------------------------------------------------------------------- /images/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/10.png -------------------------------------------------------------------------------- /images/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/11.png -------------------------------------------------------------------------------- /images/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/12.png -------------------------------------------------------------------------------- /images/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/13.png -------------------------------------------------------------------------------- /images/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/14.png -------------------------------------------------------------------------------- /images/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/sago35/tinygo-workshop/93094661974e86a2d9d93f58384b4436e7eb9b32/images/15.png --------------------------------------------------------------------------------