├── .astylerc ├── .gitignore ├── .gitmodules ├── LICENSE ├── Makefile ├── README.md ├── deform.c ├── deform.h ├── head.h ├── main.c ├── metaballs.c ├── metaballs.h ├── plasma.c ├── plasma.h ├── rgbplasma.c ├── rgbplasma.h ├── rotozoom.c └── rotozoom.h /.astylerc: -------------------------------------------------------------------------------- 1 | --style=1tbs 2 | --indent=spaces=4 3 | --attach-extern-c 4 | --indent-switches 5 | --attach-closing-while 6 | --indent-after-parens 7 | --indent-continuation=1 8 | --pad-oper 9 | --align-pointer=name 10 | --align-reference=name 11 | --break-one-line-headers 12 | --break-return-type 13 | --add-braces 14 | --add-one-line-braces 15 | --convert-tabs 16 | --lineend=linux 17 | --suffix=none 18 | 19 | --ignore-exclude-errors 20 | --exclude=external 21 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | demo 2 | 3 | # Prerequisites 4 | *.d 5 | 6 | # Object files 7 | *.o 8 | *.ko 9 | *.obj 10 | *.elf 11 | 12 | # Linker output 13 | *.ilk 14 | *.map 15 | *.exp 16 | 17 | # Precompiled Headers 18 | *.gch 19 | *.pch 20 | 21 | # Libraries 22 | *.lib 23 | *.a 24 | *.la 25 | *.lo 26 | 27 | # Shared objects (inc. Windows DLLs) 28 | *.dll 29 | *.so 30 | *.so.* 31 | *.dylib 32 | 33 | # Executables 34 | *.exe 35 | *.out 36 | *.app 37 | *.i*86 38 | *.x86_64 39 | *.hex 40 | 41 | # Debug files 42 | *.dSYM/ 43 | *.su 44 | *.idb 45 | *.pdb 46 | 47 | # Kernel Module Compile Results 48 | *.mod* 49 | *.cmd 50 | .tmp_versions/ 51 | modules.order 52 | Module.symvers 53 | Mkfile.old 54 | dkms.conf 55 | -------------------------------------------------------------------------------- /.gitmodules: -------------------------------------------------------------------------------- 1 | [submodule "components/hagl"] 2 | path = external/hagl 3 | url = https://github.com/tuupola/hagl.git 4 | [submodule "components/hagl_sdl2"] 5 | path = external/hagl_sdl2 6 | url = https://github.com/tuupola/hagl_sdl2.git 7 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT No Attribution 2 | 3 | Copyright (c) 2020-2021 Mika Tuupola 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy of this 6 | software and associated documentation files (the "Software"), to deal in the Software 7 | without restriction, including without limitation the rights to use, copy, modify, 8 | merge, publish, distribute, sublicense, and/or sell copies of the Software, and to 9 | permit persons to whom the Software is furnished to do so. 10 | 11 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, 12 | INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A 13 | PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT 14 | HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 15 | OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE 16 | SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 17 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | CC = gcc 2 | CFLAGS = -Wall -Iexternal/hagl/include -Iexternal/hagl_sdl2 3 | LDFLAGS = -lm 4 | SDLFLAGS = $(shell sdl2-config --libs --cflags) 5 | 6 | src = $(wildcard *.c) \ 7 | $(wildcard external/hagl/src/*.c) \ 8 | $(wildcard external/hagl_sdl2/hagl_hal.c) 9 | 10 | obj = $(src:.c=.o) 11 | 12 | demo: $(obj) 13 | $(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS) $(SDLFLAGS) 14 | 15 | 16 | .PHONY: clean 17 | clean: 18 | rm -f $(obj) demo 19 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ## Old schoold demo effects 2 | 3 | Created to test the [HAGL graphics library](https://github.com/tuupola/hagl). You need [SDL2](https://www.libsdl.org/) to run the demos. 4 | 5 | ![2nd Reality](https://appelsiini.net/img/2020/hagl_rotozoom.png) 6 | 7 | ``` 8 | $ brew install sdl2 # macOs 9 | $ sudo dnf install SDL2-devel # Fedora, Rocky etc 10 | $ sudo apt-get install libsdl2-dev # Debian based distros 11 | ``` 12 | 13 | ``` 14 | $ git clone https://github.com/tuupola/sdl2_effects.git --recursive 15 | $ cd sdl2_effects 16 | $ make clean && make 17 | $ ./demo 18 | ``` 19 | 20 | ## Run on ESP32 21 | 22 | HAGL is hardware agnostic. You can run the demos also [ESP32 based boards](https://github.com/tuupola/esp_effects). 23 | -------------------------------------------------------------------------------- /deform.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2021-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | Adapted from article by Inigo Quilez: 25 | https://iquilezles.org/www/articles/deform/deform.htm 26 | 27 | SPDX-License-Identifier: MIT-0 28 | 29 | */ 30 | 31 | #include 32 | #include 33 | #include 34 | #include 35 | 36 | #include "head.h" 37 | #include "deform.h" 38 | 39 | static const uint8_t SPEED = 2; 40 | static const uint8_t PIXEL_SIZE = 1; 41 | static uint32_t frame; 42 | 43 | int8_t *lut; 44 | 45 | void 46 | deform_init(hagl_backend_t *display) 47 | { 48 | /* Allocate memory for lut and store address also to ptr. */ 49 | int8_t *ptr = lut = malloc(display->height * display->width * 2 * sizeof(int8_t)); 50 | 51 | for (uint16_t j = 0; j < display->height; j += PIXEL_SIZE) { 52 | for (uint16_t i = 0; i < display->width; i += PIXEL_SIZE) { 53 | 54 | const float x = -1.00f + 2.00f * (float)i / (float)display->width; 55 | const float y = -1.00f + 2.00f * (float)j / (float)display->height; 56 | const float r = sqrtf(x * x + y * y); 57 | const float a = atan2f(y, x); 58 | 59 | float u = cosf(a) / r; 60 | float v = sinf(a) / r; 61 | 62 | // float u = 0.5 * a / M_PI; 63 | // float v = sin(7 * r); 64 | 65 | // float u = 0.02 * y + 0.03 * cos(a * 3) / r; 66 | // float v = 0.02 * x + 0.03 * sin(a * 3) / r; 67 | 68 | // float u = 1 / (r + 0.5 + 0.5 * sin(5 * a)); 69 | // float v = a * 3 / M_PI; 70 | 71 | 72 | // float u = x * cos(2 * r) - y * sin(2 * r); 73 | // float v = y * cos(2 * r) + x * sin(2 * r); 74 | 75 | // float u = 0.3 / (r + 0.5 * x); 76 | // float v = 3 * a / M_PI; 77 | 78 | // float u = 0.1 * x / (0.11 + r * 0.5); 79 | // float v = 0.1 * y / (0.11 + r * 0.5); 80 | 81 | // float u = r * cos(a + r); 82 | // float v = r * sin(a + r); 83 | 84 | // float u = x / fabs(y); 85 | // float v = 1 / fabs(y); 86 | 87 | // float u = x; 88 | // float v = y; 89 | 90 | /* Target x and y coordinates in the texture. */ 91 | int8_t tx = ((int8_t)(HEAD_WIDTH * u)) % HEAD_WIDTH; 92 | int8_t ty = ((int8_t)(HEAD_HEIGHT * v)) % HEAD_HEIGHT; 93 | 94 | *(ptr++) = tx; 95 | *(ptr++) = ty; 96 | } 97 | } 98 | } 99 | 100 | void 101 | deform_render(hagl_backend_t *display) 102 | { 103 | int8_t *ptr = lut; 104 | 105 | for (uint16_t y = 0; y < display->height; y += PIXEL_SIZE) { 106 | for (uint16_t x = 0; x < display->width; x += PIXEL_SIZE) { 107 | 108 | /* Retrieve texture x and y coordinates for display coordinates. */ 109 | int16_t u = *(ptr++) + frame; 110 | int16_t v = *(ptr++) + frame; 111 | 112 | u = abs(u) % HEAD_WIDTH; 113 | v = abs(v) % HEAD_HEIGHT; 114 | 115 | /* Get the pixel from texture and put it to the screen. */ 116 | hagl_color_t *color = (hagl_color_t *) (head + HEAD_WIDTH * sizeof(hagl_color_t) * v + sizeof(hagl_color_t) * u); 117 | 118 | if (1 == PIXEL_SIZE) { 119 | hagl_put_pixel(display, x, y, *color); 120 | } else { 121 | hagl_fill_rectangle(display, x, y, x + PIXEL_SIZE - 1, y + PIXEL_SIZE - 1, *color); 122 | } 123 | } 124 | } 125 | } 126 | 127 | void 128 | deform_animate() 129 | { 130 | frame = frame + SPEED; 131 | } 132 | 133 | void 134 | deform_close() 135 | { 136 | free(lut); 137 | } 138 | -------------------------------------------------------------------------------- /deform.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2021-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | void deform_init(hagl_backend_t *display); 29 | void deform_render(hagl_backend_t *display); 30 | void deform_animate(); 31 | void deform_close(); 32 | -------------------------------------------------------------------------------- /head.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | This is free and unencumbered software released into the public domain. 4 | 5 | Anyone is free to copy, modify, publish, use, compile, sell, or 6 | distribute this software, either in source code form or as a compiled 7 | binary, for any purpose, commercial or non-commercial, and by any 8 | means. 9 | 10 | In jurisdictions that recognize copyright laws, the author or authors 11 | of this software dedicate any and all copyright interest in the 12 | software to the public domain. We make this dedication for the benefit 13 | of the public at large and to the detriment of our heirs and 14 | successors. We intend this dedication to be an overt act of 15 | relinquishment in perpetuity of all present and future rights to this 16 | software under copyright law. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 19 | EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 20 | MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. 21 | IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR 22 | OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, 23 | ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR 24 | OTHER DEALINGS IN THE SOFTWARE. 25 | 26 | For more information, please refer to 27 | 28 | -cut- 29 | 30 | Taken from Second Reality by Future Crew (yo Pixel!) 31 | https://github.com/mtuomi/SecondReality 32 | 33 | SPDX-License-Identifier: Unlicense 34 | 35 | */ 36 | 37 | #include 38 | 39 | static const uint8_t HEAD_WIDTH = 82; 40 | static const uint8_t HEAD_HEIGHT = 64; 41 | 42 | static const uint8_t head[] = { 43 | 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 44 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x82, 0x10, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 45 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x87, 0x31, 0x0f, 0x5b, 0x0f, 0x5b, 0x8c, 0x42, 0x46, 0x21, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x10, 0x00, 0x10, 0x00, 0x10, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x18, 0x00, 0x10, 0x00, 0x18, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8c, 0x42, 0x34, 0x7c, 0x14, 0x7c, 0x71, 0x63, 0xad, 0x42, 0xe4, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 46 | 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xad, 0x4a, 0x59, 0xa5, 0x39, 0xa5, 0x76, 0x8c, 0xd3, 0x6b, 0x91, 0x5b, 0x0a, 0x3a, 0x00, 0x00, 0x00, 0x00, 0xa8, 0x31, 0x4b, 0x42, 0xe4, 0x18, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x40, 0x28, 0xa0, 0x38, 0x22, 0x59, 0xa3, 0x71, 0x85, 0x92, 0x47, 0xab, 0xa9, 0xb3, 0xc9, 0xb3, 0xea, 0xbb, 0xea, 0xbb, 0xca, 0xbb, 0xc9, 0xb3, 0x88, 0xab, 0xe6, 0x9a, 0x85, 0x9a, 0xc3, 0x79, 0xe0, 0x50, 0x40, 0x30, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x62, 0x08, 0xee, 0x4a, 0x50, 0x63, 0xa8, 0x29, 0x00, 0x00, 0x8c, 0x42, 0x59, 0x9d, 0xf8, 0x9c, 0x75, 0x84, 0x92, 0x63, 0x51, 0x5b, 0xef, 0x4a, 0xa3, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 47 | 0x00, 0x00, 0x00, 0x00, 0xa3, 0x10, 0x34, 0x74, 0x35, 0x7c, 0xf3, 0x73, 0x30, 0x5b, 0x6c, 0x42, 0x8e, 0x42, 0xae, 0x42, 0x21, 0x00, 0xc9, 0x31, 0x19, 0x95, 0x34, 0x74, 0x8d, 0x42, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x20, 0x10, 0x60, 0x28, 0xe1, 0x48, 0x82, 0x71, 0x64, 0x92, 0xe6, 0xa2, 0x67, 0xab, 0x2a, 0xc4, 0xce, 0xd4, 0x71, 0xdd, 0xd2, 0xed, 0x14, 0xf6, 0x54, 0xf6, 0x55, 0xf6, 0x74, 0xf6, 0x34, 0xee, 0x92, 0xe5, 0x70, 0xdd, 0x2f, 0xd5, 0xee, 0xd4, 0x8c, 0xcc, 0x0a, 0xc4, 0xa9, 0xb3, 0xa6, 0x9a, 0x61, 0x69, 0x00, 0x51, 0xc1, 0x40, 0x20, 0x20, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2a, 0x3a, 0x5a, 0x9d, 0xd3, 0x63, 0x8d, 0x3a, 0x41, 0x08, 0x0f, 0x5b, 0x13, 0x74, 0xb2, 0x6b, 0x10, 0x53, 0x0a, 0x32, 0x2b, 0x3a, 0xaf, 0x4a, 0x67, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 48 | 0x00, 0x00, 0x00, 0x00, 0x83, 0x10, 0x71, 0x63, 0x91, 0x63, 0x10, 0x53, 0x2b, 0x32, 0x68, 0x19, 0xea, 0x29, 0x2b, 0x32, 0x21, 0x00, 0x87, 0x29, 0xd3, 0x6b, 0x6d, 0x3a, 0x88, 0x21, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x08, 0x60, 0x30, 0x00, 0x59, 0xc2, 0x81, 0x85, 0x92, 0x27, 0xa3, 0x68, 0xab, 0xca, 0xb3, 0x2b, 0xbc, 0x8c, 0xc4, 0xee, 0xcc, 0x72, 0xdd, 0xd3, 0xed, 0xf3, 0xe5, 0x14, 0xee, 0x35, 0xee, 0x35, 0xee, 0x55, 0xee, 0x55, 0xee, 0xf4, 0xed, 0x92, 0xdd, 0x71, 0xdd, 0x10, 0xd5, 0xee, 0xcc, 0xee, 0xd4, 0xee, 0xcc, 0xee, 0xcc, 0x2b, 0xbc, 0x67, 0xab, 0xc5, 0x9a, 0x03, 0x82, 0x00, 0x59, 0x60, 0x38, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc4, 0x18, 0xae, 0x42, 0x4c, 0x32, 0xe5, 0x10, 0x00, 0x00, 0x8c, 0x42, 0xb2, 0x63, 0x0f, 0x5b, 0x4c, 0x3a, 0x88, 0x21, 0xa9, 0x21, 0x4b, 0x32, 0xe5, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 49 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x31, 0x71, 0x5b, 0x71, 0x5b, 0xef, 0x4a, 0x2c, 0x32, 0xa9, 0x19, 0x46, 0x19, 0x01, 0x00, 0x00, 0x00, 0xa3, 0x10, 0xe4, 0x18, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0xe0, 0x58, 0xe3, 0x81, 0xc5, 0x9a, 0x47, 0xa3, 0xa9, 0xab, 0xca, 0xb3, 0xca, 0xb3, 0x0b, 0xbc, 0x4c, 0xc4, 0xae, 0xcc, 0x31, 0xd5, 0xd3, 0xe5, 0x13, 0xee, 0x34, 0xee, 0x76, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x76, 0xf6, 0x75, 0xf6, 0x75, 0xf6, 0x54, 0xee, 0xb2, 0xdd, 0x51, 0xdd, 0x0f, 0xcd, 0xee, 0xcc, 0xad, 0xc4, 0xad, 0xc4, 0x8c, 0xc4, 0x2b, 0xbc, 0xa9, 0xab, 0x48, 0xa3, 0xc5, 0x9a, 0xc2, 0x79, 0x00, 0x61, 0x80, 0x38, 0x21, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x41, 0x08, 0x00, 0x00, 0x00, 0x00, 0x83, 0x10, 0x8d, 0x42, 0x30, 0x53, 0x50, 0x5b, 0x8d, 0x3a, 0xaa, 0x21, 0x05, 0x11, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 50 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x19, 0xc9, 0x31, 0xe9, 0x31, 0x67, 0x21, 0xa3, 0x10, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x80, 0x40, 0x81, 0x79, 0x64, 0x8a, 0xe7, 0x92, 0x48, 0xa3, 0xa9, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0x0b, 0xbc, 0x4c, 0xc4, 0xad, 0xcc, 0xef, 0xcc, 0x71, 0xdd, 0xd3, 0xe5, 0x34, 0xee, 0x96, 0xf6, 0x96, 0xf6, 0xb6, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x55, 0xf6, 0x55, 0xee, 0xf3, 0xe5, 0x92, 0xe5, 0x31, 0xd5, 0xef, 0xcc, 0xce, 0xcc, 0xad, 0xcc, 0x4c, 0xbc, 0x4c, 0xbc, 0xca, 0xb3, 0x48, 0xa3, 0x68, 0xa3, 0x06, 0x9b, 0x24, 0x7a, 0x00, 0x61, 0xa0, 0x50, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x41, 0x00, 0xc4, 0x10, 0xc4, 0x18, 0xe4, 0x18, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 51 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x08, 0xa0, 0x48, 0xa2, 0x79, 0x65, 0x8a, 0x27, 0x9b, 0x48, 0xa3, 0x89, 0xab, 0xca, 0xb3, 0xca, 0xb3, 0xea, 0xb3, 0x2b, 0xbc, 0x8d, 0xc4, 0xae, 0xcc, 0x10, 0xd5, 0x71, 0xdd, 0xf3, 0xed, 0x35, 0xee, 0x76, 0xf6, 0xb6, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x76, 0xf6, 0x55, 0xee, 0x14, 0xe6, 0xd3, 0xe5, 0x51, 0xdd, 0xef, 0xcc, 0xce, 0xcc, 0xad, 0xcc, 0x8d, 0xc4, 0x2b, 0xbc, 0xea, 0xb3, 0x89, 0xab, 0x48, 0xa3, 0x28, 0xa3, 0xe6, 0x92, 0x24, 0x7a, 0x61, 0x69, 0xe1, 0x60, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 52 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xea, 0x39, 0x70, 0x63, 0x8d, 0x4a, 0xa4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x40, 0xc3, 0x81, 0x64, 0x82, 0xe6, 0x92, 0x48, 0xa3, 0x68, 0xa3, 0xa9, 0xab, 0xca, 0xb3, 0xea, 0xb3, 0x0b, 0xb4, 0x4b, 0xbc, 0xad, 0xc4, 0xce, 0xcc, 0x30, 0xd5, 0x92, 0xdd, 0xd3, 0xe5, 0x14, 0xee, 0x55, 0xee, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0xb6, 0xf6, 0x55, 0xf6, 0x14, 0xee, 0xd3, 0xe5, 0x71, 0xdd, 0xef, 0xd4, 0xce, 0xcc, 0xae, 0xcc, 0x6c, 0xc4, 0x2b, 0xbc, 0xca, 0xb3, 0xa9, 0xb3, 0x89, 0xab, 0x27, 0x9b, 0x07, 0x9b, 0xc6, 0x92, 0x44, 0x82, 0x81, 0x69, 0xe0, 0x58, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x21, 0x34, 0x7c, 0x55, 0x7c, 0xce, 0x4a, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 53 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x31, 0x7a, 0x9d, 0x18, 0x95, 0x92, 0x63, 0x0a, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x28, 0x62, 0x71, 0x44, 0x7a, 0xc6, 0x8a, 0x07, 0x9b, 0x68, 0xa3, 0x69, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0x0b, 0xbc, 0x2b, 0xbc, 0x6c, 0xc4, 0xae, 0xcc, 0xce, 0xcc, 0x10, 0xd5, 0x71, 0xdd, 0xd3, 0xe5, 0xf4, 0xed, 0x14, 0xee, 0x75, 0xf6, 0x76, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x96, 0xf6, 0x75, 0xf6, 0x34, 0xee, 0xf3, 0xe5, 0xd2, 0xe5, 0x51, 0xdd, 0x10, 0xd5, 0xee, 0xd4, 0xad, 0xcc, 0x4c, 0xbc, 0x0b, 0xbc, 0xca, 0xb3, 0xa9, 0xb3, 0xa9, 0xab, 0x48, 0xa3, 0x27, 0x9b, 0x07, 0x9b, 0x85, 0x8a, 0x24, 0x82, 0x41, 0x69, 0xc0, 0x50, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf3, 0x73, 0x59, 0xa5, 0x50, 0x63, 0xce, 0x42, 0x67, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 54 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x31, 0x75, 0x7c, 0xcf, 0x4a, 0xca, 0x21, 0xc9, 0x29, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x00, 0x61, 0x03, 0x7a, 0x85, 0x8a, 0xe6, 0x92, 0x07, 0x9b, 0x68, 0xa3, 0x89, 0xab, 0xaa, 0xb3, 0xca, 0xb3, 0x0b, 0xb4, 0x0b, 0xbc, 0x6c, 0xc4, 0xce, 0xcc, 0xce, 0xcc, 0x0f, 0xd5, 0x71, 0xdd, 0x92, 0xe5, 0xb2, 0xe5, 0xd3, 0xe5, 0x14, 0xee, 0x34, 0xee, 0x35, 0xee, 0x35, 0xee, 0x55, 0xf6, 0xf3, 0xe5, 0xd3, 0xe5, 0xb2, 0xe5, 0x71, 0xdd, 0x30, 0xd5, 0x2f, 0xd5, 0xce, 0xcc, 0xad, 0xc4, 0x2c, 0xbc, 0x0b, 0xb4, 0xca, 0xb3, 0xca, 0xb3, 0x89, 0xab, 0x69, 0xab, 0x27, 0xa3, 0x07, 0x93, 0xa6, 0x92, 0x65, 0x82, 0xe3, 0x71, 0x00, 0x59, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x4c, 0x42, 0x92, 0x63, 0x0b, 0x2a, 0xa9, 0x21, 0xc4, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 55 | 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x21, 0xc9, 0x31, 0x46, 0x19, 0x63, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x38, 0xa2, 0x79, 0x44, 0x82, 0xc5, 0x8a, 0x06, 0x9b, 0x27, 0x9b, 0x48, 0xa3, 0xa9, 0xab, 0xaa, 0xb3, 0xca, 0xb3, 0xea, 0xb3, 0x0b, 0xbc, 0x6c, 0xc4, 0xad, 0xc4, 0xce, 0xcc, 0xef, 0xd4, 0x30, 0xd5, 0x51, 0xd5, 0x71, 0xdd, 0x92, 0xdd, 0xb2, 0xe5, 0xb3, 0xe5, 0xd3, 0xe5, 0xd3, 0xe5, 0xd3, 0xe5, 0xb2, 0xe5, 0x71, 0xdd, 0x30, 0xd5, 0x51, 0xdd, 0x50, 0xd5, 0xee, 0xcc, 0xae, 0xcc, 0x8d, 0xc4, 0x2b, 0xbc, 0x0b, 0xbc, 0xea, 0xb3, 0xa9, 0xab, 0xa9, 0xab, 0x68, 0xa3, 0x28, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0x85, 0x8a, 0x24, 0x7a, 0x81, 0x69, 0xa0, 0x50, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe5, 0x18, 0x26, 0x21, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 56 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0xe0, 0x50, 0xc3, 0x79, 0x65, 0x8a, 0xc6, 0x8a, 0x07, 0x9b, 0x07, 0x9b, 0x48, 0xa3, 0xaa, 0xb3, 0xca, 0xb3, 0xca, 0xb3, 0xea, 0xb3, 0x0b, 0xbc, 0x4c, 0xbc, 0xad, 0xc4, 0xce, 0xcc, 0xcf, 0xcc, 0x0f, 0xd5, 0x30, 0xd5, 0x30, 0xd5, 0x50, 0xd5, 0x51, 0xdd, 0x92, 0xdd, 0x92, 0xdd, 0x91, 0xdd, 0x71, 0xdd, 0x50, 0xdd, 0x30, 0xd5, 0x30, 0xd5, 0x50, 0xdd, 0x0f, 0xd5, 0xce, 0xcc, 0xad, 0xc4, 0x6c, 0xc4, 0x0b, 0xbc, 0xea, 0xb3, 0xca, 0xb3, 0xa9, 0xab, 0x89, 0xab, 0x48, 0xa3, 0x27, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xa5, 0x8a, 0x85, 0x82, 0xc2, 0x79, 0x00, 0x61, 0x60, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 57 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x18, 0x21, 0x69, 0xe3, 0x79, 0x44, 0x82, 0xa5, 0x92, 0x07, 0x9b, 0x07, 0x9b, 0x48, 0xa3, 0xa9, 0xab, 0xca, 0xb3, 0xea, 0xb3, 0xeb, 0xbb, 0x0b, 0xbc, 0x2b, 0xbc, 0x6d, 0xc4, 0x8d, 0xc4, 0xce, 0xcc, 0xce, 0xcc, 0xef, 0xcc, 0x0f, 0xcd, 0x10, 0xd5, 0x30, 0xdd, 0x30, 0xd5, 0x50, 0xd5, 0x51, 0xdd, 0x30, 0xd5, 0x30, 0xd5, 0x51, 0xdd, 0x10, 0xd5, 0xef, 0xcc, 0xee, 0xcc, 0xad, 0xcc, 0x8d, 0xc4, 0x4c, 0xc4, 0x0b, 0xb4, 0xea, 0xb3, 0xca, 0xb3, 0xca, 0xb3, 0xa9, 0xab, 0x68, 0xa3, 0x27, 0xa3, 0x07, 0x9b, 0xc6, 0x92, 0xa6, 0x8a, 0x65, 0x82, 0x24, 0x7a, 0x82, 0x71, 0xc0, 0x50, 0x20, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 58 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x18, 0x61, 0x69, 0x03, 0x7a, 0x44, 0x82, 0xa5, 0x8a, 0x06, 0x93, 0x28, 0xa3, 0x48, 0xa3, 0x89, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0xea, 0xb3, 0x0b, 0xbc, 0x0b, 0xbc, 0x4c, 0xbc, 0x6d, 0xc4, 0x8d, 0xc4, 0x8d, 0xc4, 0xce, 0xcc, 0xef, 0xd4, 0xce, 0xcc, 0x8d, 0xc4, 0x6c, 0xbc, 0x8d, 0xc4, 0x8d, 0xc4, 0x8d, 0xc4, 0xce, 0xc4, 0x0f, 0xcd, 0x0f, 0xd5, 0xee, 0xcc, 0xce, 0xcc, 0xad, 0xcc, 0x6d, 0xc4, 0x0b, 0xbc, 0x0b, 0xbc, 0xea, 0xb3, 0xca, 0xb3, 0xaa, 0xb3, 0x89, 0xab, 0x69, 0xab, 0x28, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xa6, 0x92, 0x64, 0x82, 0x24, 0x82, 0xc3, 0x71, 0x20, 0x61, 0x41, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 59 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x40, 0x18, 0x41, 0x69, 0x03, 0x7a, 0x65, 0x82, 0xa5, 0x8a, 0xe6, 0x92, 0x27, 0x9b, 0x48, 0xa3, 0x68, 0xa3, 0xa9, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0x0b, 0xbc, 0x2b, 0xbc, 0x2b, 0xbc, 0x4c, 0xbc, 0x6c, 0xc4, 0xad, 0xc4, 0x8d, 0xc4, 0x2b, 0xbc, 0x2b, 0xbc, 0x2c, 0xbc, 0xad, 0xc4, 0x2b, 0xbc, 0x4c, 0xbc, 0x8d, 0xc4, 0x4c, 0xbc, 0x0b, 0xbc, 0x6c, 0xc4, 0xce, 0xcc, 0xad, 0xc4, 0x8d, 0xc4, 0x4c, 0xbc, 0x0b, 0xb4, 0x0b, 0xb4, 0xca, 0xb3, 0xa9, 0xab, 0x89, 0xab, 0x89, 0xab, 0x69, 0xa3, 0x48, 0xa3, 0x07, 0x9b, 0xe6, 0x92, 0xc6, 0x92, 0x64, 0x82, 0x24, 0x82, 0xc3, 0x71, 0x41, 0x69, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 60 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x40, 0x18, 0x41, 0x69, 0x03, 0x7a, 0x44, 0x82, 0xa6, 0x92, 0x07, 0x9b, 0x07, 0x9b, 0x48, 0xa3, 0x89, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0xea, 0xb3, 0x0b, 0xb4, 0x2b, 0xbc, 0x4c, 0xbc, 0x2b, 0xbc, 0xa9, 0xab, 0x0a, 0xb4, 0x6c, 0xc4, 0xce, 0xcc, 0xad, 0xcc, 0xa9, 0xab, 0x2b, 0xbc, 0xce, 0xcc, 0xae, 0xcc, 0x6d, 0xc4, 0xeb, 0xb3, 0xea, 0xb3, 0x4c, 0xc4, 0x4c, 0xbc, 0x0b, 0xbc, 0x0b, 0xb4, 0xea, 0xb3, 0xca, 0xb3, 0xa9, 0xab, 0x89, 0xab, 0x89, 0xab, 0x69, 0xab, 0x27, 0x9b, 0x07, 0x9b, 0xc6, 0x92, 0xa6, 0x92, 0x84, 0x8a, 0x23, 0x7a, 0xe3, 0x71, 0x41, 0x69, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 61 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x41, 0x69, 0x03, 0x7a, 0x44, 0x82, 0xa6, 0x8a, 0x07, 0x9b, 0x07, 0x9b, 0x68, 0xa3, 0x89, 0xab, 0x89, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0xaa, 0xb3, 0xea, 0xb3, 0xea, 0xb3, 0x0b, 0xb4, 0x0b, 0xbc, 0xa9, 0xab, 0x0b, 0xbc, 0x6c, 0xc4, 0x6c, 0xc4, 0x6c, 0xc4, 0xea, 0xb3, 0x2b, 0xbc, 0xea, 0xb3, 0x2b, 0xbc, 0x8d, 0xc4, 0xad, 0xc4, 0x8d, 0xc4, 0x0b, 0xb4, 0xca, 0xb3, 0x0b, 0xbc, 0x0b, 0xb4, 0xea, 0xb3, 0xca, 0xb3, 0xaa, 0xb3, 0xa9, 0xab, 0x89, 0xab, 0x89, 0xab, 0x48, 0xa3, 0x27, 0x9b, 0xe7, 0x9a, 0xe6, 0x92, 0xa5, 0x8a, 0x64, 0x82, 0x44, 0x82, 0xe3, 0x79, 0x61, 0x69, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 62 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x41, 0x69, 0xe3, 0x79, 0x24, 0x82, 0x85, 0x8a, 0xe6, 0x92, 0x07, 0x9b, 0x28, 0xa3, 0x48, 0xa3, 0x68, 0xa3, 0x89, 0xab, 0xa9, 0xab, 0xaa, 0xb3, 0xca, 0xb3, 0xea, 0xb3, 0xea, 0xbb, 0xa9, 0xab, 0x89, 0xab, 0xea, 0xb3, 0xa9, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0x68, 0xa3, 0xea, 0xb3, 0xca, 0xab, 0xa9, 0xab, 0x0a, 0xb4, 0xea, 0xab, 0xea, 0xb3, 0xea, 0xb3, 0x89, 0xa3, 0xca, 0xb3, 0x0b, 0xbc, 0xca, 0xb3, 0xa9, 0xab, 0xa9, 0xab, 0x89, 0xab, 0x69, 0xab, 0x69, 0xab, 0x48, 0xa3, 0x27, 0x9b, 0xe6, 0x92, 0xc6, 0x92, 0x85, 0x8a, 0x44, 0x82, 0x03, 0x7a, 0xe3, 0x71, 0x61, 0x69, 0x80, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 63 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x21, 0x61, 0xc3, 0x71, 0x03, 0x7a, 0x65, 0x82, 0xc6, 0x92, 0x07, 0x9b, 0x27, 0x9b, 0x48, 0xa3, 0x48, 0xa3, 0x69, 0xab, 0x89, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0xca, 0xb3, 0x69, 0xab, 0x68, 0xa3, 0x68, 0xa3, 0xa9, 0xab, 0xca, 0xb3, 0x68, 0xa3, 0x89, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0x68, 0xab, 0x89, 0xab, 0xea, 0xb3, 0x69, 0xab, 0x68, 0xa3, 0x89, 0xab, 0xa9, 0xab, 0xea, 0xb3, 0xa9, 0xab, 0xa9, 0xab, 0x89, 0xab, 0x89, 0xab, 0x89, 0xab, 0x48, 0xa3, 0x27, 0x9b, 0x07, 0x9b, 0xe7, 0x9a, 0xa6, 0x92, 0x65, 0x8a, 0x24, 0x82, 0xe3, 0x79, 0xc3, 0x71, 0x01, 0x61, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 64 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00, 0x28, 0x00, 0x00, 0x00, 0x00, 0x40, 0x18, 0x01, 0x61, 0x82, 0x69, 0xe3, 0x79, 0x24, 0x7a, 0x85, 0x8a, 0xe7, 0x9a, 0x07, 0x9b, 0x28, 0xa3, 0x68, 0xa3, 0x68, 0xa3, 0x69, 0xab, 0x89, 0xab, 0x89, 0xab, 0x89, 0xab, 0xa9, 0xab, 0x89, 0xab, 0xca, 0xb3, 0x89, 0xab, 0xa9, 0xab, 0xca, 0xb3, 0x89, 0xab, 0xea, 0xb3, 0x0b, 0xbc, 0x2b, 0xbc, 0xca, 0xb3, 0x89, 0xab, 0xca, 0xb3, 0xa9, 0xab, 0xea, 0xb3, 0xea, 0xb3, 0x89, 0xab, 0xa9, 0xab, 0xa9, 0xab, 0x89, 0xab, 0x89, 0xab, 0x69, 0xab, 0x48, 0xa3, 0x28, 0xa3, 0x27, 0x9b, 0x07, 0x9b, 0xc6, 0x92, 0xa5, 0x8a, 0x64, 0x82, 0x24, 0x7a, 0xe3, 0x71, 0x61, 0x69, 0xe0, 0x58, 0x20, 0x10, 0x00, 0x00, 0x20, 0x20, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 65 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa1, 0x30, 0xc5, 0xaa, 0xc1, 0x38, 0x00, 0x00, 0x20, 0x18, 0x01, 0x59, 0x41, 0x61, 0xa2, 0x71, 0xc3, 0x71, 0x24, 0x7a, 0xc6, 0x92, 0xe7, 0x9a, 0x07, 0x9b, 0x48, 0xa3, 0x48, 0xa3, 0x68, 0xa3, 0x89, 0xab, 0x89, 0xab, 0xa9, 0xab, 0x89, 0xab, 0x48, 0xa3, 0xaa, 0xab, 0xaa, 0xb3, 0xa9, 0xab, 0x48, 0xa3, 0x48, 0xa3, 0xa9, 0xab, 0xea, 0xb3, 0xca, 0xb3, 0x89, 0xab, 0x48, 0xa3, 0x89, 0xa3, 0xca, 0xb3, 0xca, 0xb3, 0x89, 0xab, 0x48, 0xa3, 0x89, 0xab, 0x89, 0xab, 0x89, 0xab, 0x89, 0xab, 0x68, 0xa3, 0x48, 0xa3, 0x27, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xa5, 0x8a, 0x64, 0x82, 0x24, 0x7a, 0xe3, 0x71, 0x62, 0x69, 0x21, 0x61, 0xa0, 0x38, 0x00, 0x00, 0xa1, 0x38, 0xa5, 0xa2, 0x81, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 66 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x40, 0x2e, 0xe5, 0xa6, 0x9a, 0x00, 0x00, 0x00, 0x10, 0xc0, 0x50, 0x21, 0x61, 0x62, 0x69, 0xc3, 0x71, 0xa2, 0x69, 0x44, 0x82, 0xe6, 0x92, 0x07, 0x9b, 0x27, 0x9b, 0x48, 0xa3, 0x48, 0xa3, 0x68, 0xa3, 0x89, 0xab, 0x89, 0xab, 0x89, 0xab, 0x27, 0x9b, 0x89, 0xab, 0xa9, 0xab, 0x89, 0xab, 0x48, 0xa3, 0x89, 0xab, 0x48, 0xa3, 0x48, 0xa3, 0x48, 0xa3, 0x68, 0xa3, 0x68, 0xa3, 0x68, 0xa3, 0xa9, 0xb3, 0xa9, 0xab, 0x89, 0xa3, 0x28, 0xa3, 0xa9, 0xab, 0x89, 0xab, 0x89, 0xab, 0x68, 0xa3, 0x48, 0xa3, 0x28, 0xa3, 0x07, 0x9b, 0xe7, 0x9a, 0xc5, 0x92, 0x84, 0x8a, 0x24, 0x7a, 0xa3, 0x71, 0xa2, 0x71, 0x41, 0x61, 0xc0, 0x58, 0x00, 0x08, 0x00, 0x00, 0xc6, 0x92, 0x2e, 0xe5, 0x01, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 67 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xe1, 0x50, 0x2f, 0xdd, 0x70, 0xed, 0x22, 0x51, 0x00, 0x00, 0xa0, 0x40, 0x20, 0x61, 0x42, 0x61, 0xa3, 0x71, 0xc3, 0x71, 0x82, 0x69, 0x85, 0x8a, 0xe6, 0x9a, 0x07, 0x9b, 0x07, 0x9b, 0x27, 0xa3, 0x48, 0xa3, 0x68, 0xa3, 0x48, 0xa3, 0x89, 0xab, 0x27, 0x9b, 0x48, 0x9b, 0xa9, 0xab, 0x27, 0x9b, 0x48, 0xa3, 0x69, 0xab, 0x27, 0x9b, 0x27, 0x9b, 0x27, 0x9b, 0x48, 0xa3, 0x89, 0xab, 0x27, 0x9b, 0x48, 0xa3, 0xca, 0xb3, 0x07, 0x9b, 0x68, 0xa3, 0xa9, 0xab, 0x89, 0xab, 0x69, 0xab, 0x48, 0xa3, 0x28, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xc6, 0x92, 0xa6, 0x92, 0x03, 0x7a, 0x62, 0x69, 0xc3, 0x79, 0xc2, 0x71, 0x00, 0x61, 0x60, 0x30, 0x00, 0x00, 0x41, 0x51, 0x90, 0xe5, 0x2e, 0xdd, 0xe1, 0x58, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 68 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x20, 0x21, 0x61, 0xa9, 0xab, 0x53, 0xf6, 0xa9, 0xb3, 0x00, 0x18, 0x20, 0x20, 0xe0, 0x50, 0xe1, 0x58, 0x82, 0x69, 0xe7, 0x92, 0x04, 0x7a, 0x81, 0x69, 0xc6, 0x8a, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0x27, 0x9b, 0x27, 0x9b, 0x48, 0xa3, 0x48, 0xa3, 0x48, 0xa3, 0xe6, 0x92, 0x07, 0x9b, 0xe7, 0x9a, 0x07, 0x9b, 0x07, 0x9b, 0x68, 0xa3, 0x89, 0xab, 0x68, 0xa3, 0x28, 0xa3, 0x07, 0x9b, 0xe7, 0x9a, 0x07, 0x9b, 0x07, 0x9b, 0x27, 0x9b, 0x69, 0xab, 0x48, 0xa3, 0x48, 0xa3, 0x27, 0x9b, 0x27, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xc6, 0x8a, 0x44, 0x82, 0x61, 0x61, 0x03, 0x7a, 0x44, 0x82, 0x61, 0x69, 0xa0, 0x48, 0x01, 0x08, 0x00, 0x18, 0xc9, 0xbb, 0x53, 0xfe, 0xa9, 0xab, 0x20, 0x69, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 69 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0x38, 0x82, 0x71, 0x21, 0x61, 0x88, 0xa3, 0xd0, 0xed, 0x04, 0x7a, 0x00, 0x28, 0x60, 0x38, 0xc0, 0x48, 0x41, 0x61, 0x47, 0xa3, 0x0a, 0xbc, 0x24, 0x82, 0x41, 0x61, 0xa6, 0x8a, 0xe6, 0x92, 0xe6, 0x92, 0xe7, 0x9a, 0xe7, 0x9a, 0x07, 0x9b, 0x07, 0x9b, 0x28, 0xa3, 0x28, 0x9b, 0xc6, 0x92, 0x85, 0x8a, 0xe6, 0x92, 0x68, 0xa3, 0x48, 0xa3, 0x48, 0xa3, 0x48, 0xa3, 0x48, 0xa3, 0x28, 0xa3, 0xc6, 0x92, 0xc6, 0x92, 0x07, 0x9b, 0x48, 0xa3, 0x47, 0x9b, 0x07, 0x9b, 0x27, 0x9b, 0x27, 0x9b, 0xe7, 0x9a, 0x07, 0x9b, 0xe6, 0x92, 0xc6, 0x92, 0x03, 0x72, 0x00, 0x59, 0x04, 0x7a, 0x68, 0xa3, 0xa2, 0x69, 0xa0, 0x50, 0x40, 0x30, 0x00, 0x20, 0x04, 0x82, 0xb1, 0xed, 0x69, 0xa3, 0x41, 0x61, 0x82, 0x71, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 70 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x00, 0x40, 0x28, 0x61, 0x69, 0x41, 0x61, 0x00, 0x28, 0x6d, 0xc4, 0xed, 0xd4, 0xe3, 0x79, 0x62, 0x61, 0x40, 0x40, 0x04, 0x7a, 0x0b, 0xbc, 0x6d, 0xc4, 0x0b, 0xbc, 0xe3, 0x71, 0x61, 0x69, 0x85, 0x8a, 0xe6, 0x92, 0xe6, 0x92, 0xc6, 0x92, 0xe6, 0x92, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xc6, 0x92, 0xa6, 0x92, 0xc6, 0x92, 0xe6, 0x92, 0xc6, 0x92, 0xc6, 0x92, 0xc6, 0x92, 0xc6, 0x92, 0x07, 0x9b, 0x27, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0xe7, 0x9a, 0xe6, 0x92, 0x85, 0x8a, 0x82, 0x69, 0x00, 0x59, 0x85, 0x8a, 0x0b, 0xbc, 0xa9, 0xab, 0x24, 0x7a, 0x60, 0x40, 0x63, 0x61, 0xe3, 0x79, 0xcd, 0xcc, 0x6d, 0xc4, 0x00, 0x28, 0x62, 0x61, 0x42, 0x69, 0x41, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 71 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x38, 0xa3, 0x81, 0xe1, 0x50, 0x81, 0x38, 0x8c, 0xc4, 0x12, 0xfe, 0x0a, 0xbc, 0xc1, 0x50, 0xe6, 0x9a, 0x8d, 0xc4, 0xef, 0xcc, 0x30, 0xd5, 0x30, 0xd5, 0xa6, 0x92, 0x20, 0x61, 0x24, 0x82, 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0x92, 0xc6, 0x92, 0xc6, 0x92, 0xe6, 0x92, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0xe7, 0x9a, 0xc6, 0x92, 0xc6, 0x92, 0xa6, 0x92, 0xc6, 0x92, 0xe6, 0x92, 0x27, 0x9b, 0x27, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0xe7, 0x9a, 0xe6, 0x92, 0x07, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0x44, 0x82, 0x61, 0x69, 0xe3, 0x71, 0x69, 0xa3, 0x91, 0xe5, 0x2f, 0xd5, 0x89, 0xab, 0x85, 0x8a, 0x01, 0x59, 0x0b, 0xbc, 0x32, 0xf6, 0x6c, 0xc4, 0x61, 0x40, 0xe1, 0x50, 0xc3, 0x81, 0x60, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 72 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x38, 0x03, 0x8a, 0xc0, 0x40, 0x61, 0x30, 0x07, 0x9b, 0x86, 0x8a, 0xe0, 0x50, 0xa5, 0x92, 0x0a, 0xbc, 0xef, 0xd4, 0xb2, 0xe5, 0x14, 0xee, 0xd3, 0xed, 0xc6, 0x92, 0x20, 0x61, 0xa2, 0x71, 0xc2, 0x71, 0x65, 0x82, 0xc6, 0x92, 0xe6, 0x92, 0xa6, 0x92, 0x85, 0x8a, 0x85, 0x8a, 0xe6, 0x92, 0x07, 0x9b, 0xe7, 0x9a, 0x07, 0x9b, 0x07, 0x9b, 0x07, 0x9b, 0xe6, 0x92, 0xe6, 0x92, 0xc6, 0x92, 0xa5, 0x8a, 0xe6, 0x92, 0xe6, 0x92, 0xe6, 0x92, 0x85, 0x8a, 0xe3, 0x79, 0x61, 0x69, 0x60, 0x69, 0x28, 0x9b, 0x91, 0xe5, 0x54, 0xf6, 0xb2, 0xe5, 0x6c, 0xc4, 0x68, 0xa3, 0x03, 0x7a, 0xe0, 0x58, 0xa5, 0x8a, 0xc6, 0x92, 0x61, 0x40, 0xa0, 0x48, 0x23, 0x8a, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 73 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc1, 0x40, 0xe6, 0xaa, 0xa2, 0x48, 0x00, 0x28, 0x20, 0x38, 0x80, 0x48, 0xe3, 0x79, 0x47, 0xa3, 0x68, 0xa3, 0x4c, 0xbc, 0x30, 0xd5, 0x55, 0xf6, 0xd2, 0xe5, 0x27, 0x9b, 0x07, 0x9b, 0x45, 0x82, 0x81, 0x69, 0xc2, 0x69, 0x64, 0x82, 0xe7, 0x92, 0x27, 0x9b, 0xe6, 0x92, 0x64, 0x82, 0x64, 0x82, 0x65, 0x8a, 0x85, 0x8a, 0x85, 0x8a, 0x65, 0x8a, 0x85, 0x8a, 0x65, 0x8a, 0x65, 0x8a, 0x85, 0x8a, 0x64, 0x82, 0x03, 0x7a, 0xa2, 0x71, 0xa2, 0x71, 0x44, 0x82, 0x07, 0x9b, 0xae, 0xc4, 0x34, 0xf6, 0x34, 0xf6, 0xef, 0xcc, 0xaa, 0xab, 0x27, 0x9b, 0x24, 0x8a, 0x42, 0x61, 0xa0, 0x48, 0x20, 0x38, 0x00, 0x30, 0xa1, 0x48, 0xe6, 0xa2, 0xa1, 0x48, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 74 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa9, 0xab, 0xa9, 0xb3, 0x82, 0x69, 0x20, 0x30, 0x40, 0x30, 0x00, 0x59, 0xa2, 0x71, 0xc3, 0x71, 0xc2, 0x79, 0x64, 0x8a, 0xeb, 0xb3, 0x14, 0xf6, 0x14, 0xee, 0x30, 0xd5, 0xd2, 0xed, 0xae, 0xc4, 0x69, 0xa3, 0xc6, 0x92, 0xa6, 0x8a, 0xe6, 0x92, 0x4c, 0xbc, 0x2b, 0xbc, 0x07, 0x9b, 0x64, 0x82, 0x23, 0x7a, 0x23, 0x7a, 0x44, 0x82, 0x85, 0x8a, 0x07, 0x9b, 0x68, 0xa3, 0x48, 0xa3, 0xc6, 0x92, 0xe7, 0x92, 0xa9, 0xa3, 0x8d, 0xc4, 0x91, 0xe5, 0x14, 0xee, 0x75, 0xf6, 0x91, 0xdd, 0x07, 0x9b, 0x81, 0x71, 0x81, 0x71, 0x82, 0x69, 0x00, 0x59, 0xc0, 0x48, 0x60, 0x38, 0x00, 0x28, 0x24, 0x82, 0x06, 0x9b, 0x28, 0xa3, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 75 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x61, 0xc7, 0x92, 0x89, 0xab, 0x83, 0x69, 0x00, 0x28, 0x60, 0x40, 0x60, 0x38, 0x80, 0x40, 0xc0, 0x48, 0xc0, 0x50, 0x81, 0x69, 0x68, 0xa3, 0x71, 0xdd, 0xd2, 0xe5, 0x14, 0xee, 0x75, 0xf6, 0x95, 0xfe, 0x91, 0xdd, 0xce, 0xcc, 0x2c, 0xbc, 0xca, 0xab, 0x30, 0xd5, 0xee, 0xcc, 0xe7, 0x9a, 0xa6, 0x92, 0xa5, 0x8a, 0x06, 0x93, 0x6c, 0xbc, 0x0e, 0xcd, 0x0e, 0xcd, 0xce, 0xcc, 0xef, 0xd4, 0x51, 0xdd, 0xf3, 0xed, 0x13, 0xee, 0xd2, 0xe5, 0x50, 0xdd, 0x8d, 0xc4, 0xa6, 0x92, 0x40, 0x61, 0xa0, 0x50, 0xa0, 0x48, 0x80, 0x40, 0x60, 0x38, 0x80, 0x38, 0x00, 0x28, 0x63, 0x61, 0x4b, 0xbc, 0x45, 0x82, 0x62, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 76 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x20, 0xc0, 0x50, 0xa5, 0x8a, 0xc9, 0xab, 0x40, 0x38, 0x60, 0x38, 0xa0, 0x40, 0x60, 0x38, 0x60, 0x30, 0x20, 0x30, 0x40, 0x48, 0xa0, 0x58, 0xc3, 0x71, 0xa8, 0x8a, 0x2b, 0xa3, 0x4f, 0xc4, 0x94, 0xdd, 0xb2, 0xe5, 0xcd, 0xcc, 0xb1, 0xe5, 0xb2, 0xe5, 0x51, 0xe5, 0xac, 0xc4, 0x07, 0x9b, 0x27, 0x9b, 0x48, 0xa3, 0x28, 0xa3, 0x8e, 0xcc, 0x71, 0xe5, 0xee, 0xd4, 0x0e, 0xd5, 0xd1, 0xe5, 0xb2, 0xdd, 0x31, 0xd5, 0x2e, 0xbc, 0xca, 0x9a, 0x47, 0x82, 0xe3, 0x71, 0xc0, 0x58, 0x60, 0x48, 0x60, 0x30, 0x40, 0x30, 0x80, 0x38, 0xa0, 0x40, 0x60, 0x38, 0x20, 0x38, 0x8c, 0xc4, 0xe7, 0x92, 0xa0, 0x58, 0x61, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 77 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x80, 0x28, 0x27, 0xa3, 0xe2, 0x50, 0x23, 0x59, 0xc0, 0x40, 0x00, 0x59, 0xc2, 0x71, 0x61, 0x69, 0xc0, 0x48, 0x60, 0x38, 0x00, 0x38, 0x60, 0x58, 0x80, 0x9a, 0x60, 0xbc, 0x41, 0xb4, 0x23, 0x9b, 0x46, 0xa3, 0x4c, 0xc4, 0x86, 0x8a, 0xe3, 0x71, 0x4c, 0xbc, 0x6c, 0xc4, 0xc6, 0x92, 0x24, 0x7a, 0x82, 0x69, 0x44, 0x82, 0x06, 0x9b, 0x07, 0x9b, 0x4b, 0xbc, 0x28, 0x9b, 0xa3, 0x69, 0x89, 0xab, 0x2a, 0xc4, 0x46, 0xa3, 0x23, 0x9b, 0x42, 0xac, 0xa0, 0xc4, 0xa0, 0x9a, 0x60, 0x60, 0x20, 0x38, 0x60, 0x38, 0xc0, 0x48, 0x62, 0x69, 0xa2, 0x79, 0xe0, 0x58, 0xa1, 0x40, 0x83, 0x61, 0xe2, 0x50, 0x26, 0xab, 0x61, 0x28, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 78 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x49, 0xac, 0xd4, 0xcb, 0xab, 0xc1, 0x50, 0x80, 0x40, 0x03, 0x82, 0xa5, 0x8a, 0xe6, 0x92, 0xc2, 0x71, 0xc0, 0x50, 0x20, 0x30, 0x00, 0x40, 0xa1, 0x91, 0x41, 0xe5, 0x40, 0xff, 0x00, 0xf6, 0x60, 0xc3, 0x60, 0x58, 0x00, 0x20, 0x00, 0x20, 0x80, 0x48, 0x61, 0x69, 0x61, 0x61, 0xa2, 0x71, 0x04, 0x7a, 0x82, 0x69, 0x81, 0x69, 0x61, 0x61, 0xe0, 0x50, 0x20, 0x30, 0x00, 0x20, 0x00, 0x30, 0x40, 0x60, 0xc0, 0xb2, 0x20, 0xf6, 0x60, 0xff, 0x40, 0xed, 0xa1, 0x91, 0x00, 0x40, 0x20, 0x30, 0xc0, 0x50, 0xc2, 0x71, 0xe6, 0x9a, 0x85, 0x8a, 0x03, 0x7a, 0xa0, 0x40, 0xc1, 0x48, 0xcb, 0xb3, 0xac, 0xd4, 0x01, 0x49, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 79 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0xa2, 0x71, 0x6c, 0xc4, 0xd0, 0xed, 0x63, 0x61, 0xa0, 0x50, 0x07, 0x9b, 0x88, 0xa3, 0xc9, 0xb3, 0x07, 0x9b, 0xc2, 0x79, 0xc0, 0x48, 0x20, 0x30, 0x00, 0x38, 0x40, 0x58, 0x20, 0x79, 0x81, 0x81, 0xe0, 0x60, 0x00, 0x38, 0x20, 0x30, 0xc0, 0x50, 0xc3, 0x71, 0x03, 0x7a, 0x07, 0x9b, 0x2b, 0xbc, 0x8d, 0xc4, 0x2b, 0xbc, 0x07, 0x9b, 0xc3, 0x79, 0x01, 0x61, 0x61, 0x61, 0x01, 0x51, 0x00, 0x30, 0x00, 0x38, 0xc0, 0x60, 0x81, 0x81, 0x20, 0x79, 0x40, 0x58, 0x00, 0x30, 0x20, 0x30, 0xc0, 0x48, 0xe3, 0x79, 0x07, 0x9b, 0xaa, 0xab, 0x68, 0xa3, 0x06, 0x9b, 0xc0, 0x50, 0x63, 0x61, 0xd0, 0xed, 0x6c, 0xc4, 0x82, 0x71, 0x00, 0x10, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 80 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x28, 0x60, 0x71, 0x09, 0xc4, 0x49, 0xa3, 0x00, 0x30, 0x61, 0x69, 0x27, 0x9b, 0x4c, 0xbc, 0x8d, 0xc4, 0xad, 0xc4, 0xca, 0xb3, 0x44, 0x8a, 0x40, 0x61, 0x80, 0x40, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x00, 0x28, 0x20, 0x38, 0x00, 0x61, 0xe6, 0x9a, 0x89, 0xab, 0xe7, 0x9a, 0x6c, 0xc4, 0x0f, 0xcd, 0xef, 0xd4, 0xee, 0xcc, 0x2b, 0xbc, 0x07, 0x9b, 0x84, 0x82, 0x27, 0xa3, 0xc5, 0x9a, 0x21, 0x61, 0x40, 0x38, 0x00, 0x28, 0x00, 0x30, 0x00, 0x30, 0x00, 0x30, 0x80, 0x40, 0x20, 0x61, 0x64, 0x8a, 0xa9, 0xb3, 0x6d, 0xcc, 0x6d, 0xc4, 0x0a, 0xb4, 0x27, 0x9b, 0x62, 0x61, 0x00, 0x30, 0x49, 0xa3, 0x09, 0xc4, 0x41, 0x79, 0x40, 0x28, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 81 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x80, 0x30, 0x22, 0x51, 0x40, 0x30, 0x40, 0x30, 0x00, 0x59, 0x85, 0x8a, 0x2c, 0xbc, 0xee, 0xcc, 0xef, 0xcc, 0x0f, 0xd5, 0x4b, 0xc4, 0x68, 0xab, 0xe7, 0x9a, 0xe3, 0x71, 0x82, 0x69, 0xa2, 0x69, 0xc2, 0x71, 0x85, 0x8a, 0xa8, 0xab, 0x4c, 0xbc, 0xa9, 0xb3, 0x69, 0xab, 0x8c, 0xc4, 0xee, 0xd4, 0x0f, 0xd5, 0xee, 0xd4, 0x8d, 0xc4, 0x88, 0xa3, 0xe6, 0x92, 0x48, 0xa3, 0xc9, 0xb3, 0x88, 0xab, 0x85, 0x8a, 0xe3, 0x71, 0xa2, 0x69, 0xa2, 0x69, 0xe2, 0x71, 0xe6, 0x9a, 0xc9, 0xab, 0x2b, 0xbc, 0xef, 0xd4, 0x2f, 0xd5, 0x0e, 0xd5, 0x2b, 0xbc, 0x85, 0x8a, 0x00, 0x59, 0x60, 0x38, 0x20, 0x30, 0x22, 0x51, 0x60, 0x28, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 82 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0xa1, 0x40, 0xa0, 0x48, 0x21, 0x61, 0x68, 0xa3, 0xad, 0xcc, 0x4c, 0xc4, 0xce, 0xd4, 0xee, 0xcc, 0xef, 0xd4, 0xef, 0xd4, 0x6d, 0xc4, 0xad, 0xcc, 0xad, 0xcc, 0xcd, 0xcc, 0xee, 0xcc, 0xce, 0xcc, 0x6c, 0xc4, 0x89, 0xab, 0xa9, 0xab, 0x8c, 0xc4, 0xce, 0xcc, 0x0f, 0xd5, 0xef, 0xd4, 0x8d, 0xc4, 0xa9, 0xab, 0xe6, 0x9a, 0x89, 0xab, 0xca, 0xb3, 0x6c, 0xc4, 0xce, 0xcc, 0xee, 0xcc, 0xce, 0xcc, 0xce, 0xcc, 0x4c, 0xc4, 0x8d, 0xc4, 0xae, 0xcc, 0x8d, 0xbc, 0xee, 0xcc, 0xad, 0xc4, 0xad, 0xcc, 0x88, 0xa3, 0x20, 0x61, 0xa0, 0x48, 0x80, 0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 83 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0xa1, 0x48, 0x60, 0x38, 0x41, 0x61, 0x06, 0xa3, 0x2b, 0xbc, 0xad, 0xcc, 0xee, 0xcc, 0xad, 0xc4, 0x4c, 0xbc, 0xee, 0xcc, 0xb2, 0xe5, 0xb2, 0xe5, 0x30, 0xd5, 0x2f, 0xd5, 0xee, 0xcc, 0x4b, 0xbc, 0x89, 0xab, 0xca, 0xab, 0xac, 0xcc, 0xef, 0xcc, 0x30, 0xd5, 0x0f, 0xcd, 0x6c, 0xbc, 0xa9, 0xb3, 0x28, 0x9b, 0xca, 0xb3, 0x0b, 0xbc, 0x8d, 0xcc, 0xef, 0xcc, 0x50, 0xd5, 0xd2, 0xe5, 0xb2, 0xe5, 0x92, 0xe5, 0xee, 0xcc, 0x0b, 0xb4, 0xce, 0xcc, 0xce, 0xcc, 0x2b, 0xbc, 0x06, 0x9b, 0x41, 0x61, 0x60, 0x38, 0x80, 0x40, 0x20, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 84 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x40, 0x28, 0xc0, 0x48, 0x60, 0x38, 0xc0, 0x50, 0x44, 0x8a, 0x48, 0xab, 0x6c, 0xc4, 0xad, 0xc4, 0xce, 0xcc, 0xee, 0xd4, 0x2b, 0xbc, 0xca, 0xb3, 0xef, 0xd4, 0x0f, 0xd5, 0x0b, 0xbc, 0x89, 0xab, 0x27, 0xa3, 0x0b, 0xbc, 0xce, 0xcc, 0xef, 0xcc, 0x10, 0xd5, 0x0f, 0xd5, 0xad, 0xcc, 0xca, 0xb3, 0x28, 0xa3, 0x68, 0xa3, 0xea, 0xb3, 0x6c, 0xc4, 0x2f, 0xdd, 0x8d, 0xc4, 0x0b, 0xb4, 0xef, 0xd4, 0x0f, 0xd5, 0xce, 0xcc, 0xad, 0xcc, 0x2b, 0xbc, 0x68, 0xab, 0x44, 0x82, 0xe0, 0x50, 0x40, 0x38, 0x80, 0x40, 0x41, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 85 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x21, 0x00, 0x00, 0x00, 0x01, 0x08, 0x60, 0x30, 0x80, 0x40, 0x60, 0x38, 0x60, 0x40, 0x00, 0x59, 0x04, 0x82, 0x48, 0xa3, 0xca, 0xab, 0xe7, 0x92, 0x64, 0x82, 0x48, 0xa3, 0x6c, 0xc4, 0x27, 0x9b, 0xe7, 0x9a, 0x89, 0xab, 0x48, 0xa3, 0xa9, 0xab, 0xee, 0xcc, 0xef, 0xd4, 0x10, 0xd5, 0x0f, 0xd5, 0xee, 0xd4, 0x4c, 0xbc, 0xe7, 0x9a, 0x07, 0x93, 0xaa, 0xab, 0x89, 0xab, 0x89, 0xab, 0x6c, 0xc4, 0xa5, 0x8a, 0xe2, 0x79, 0x27, 0x9b, 0xea, 0xb3, 0x88, 0xa3, 0x24, 0x82, 0xe0, 0x58, 0x40, 0x38, 0x20, 0x30, 0x60, 0x38, 0x40, 0x30, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 86 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x08, 0x40, 0x30, 0x80, 0x38, 0x80, 0x38, 0x60, 0x38, 0x80, 0x40, 0xe0, 0x50, 0x21, 0x61, 0x03, 0x7a, 0x69, 0xab, 0xea, 0xb3, 0x04, 0x7a, 0x84, 0x8a, 0x07, 0x9b, 0x0b, 0xb4, 0xad, 0xcc, 0x68, 0xa3, 0x8c, 0xc4, 0x2f, 0xd5, 0x51, 0xd5, 0x10, 0xd5, 0xce, 0xcc, 0xc9, 0xab, 0x0b, 0xb4, 0x2c, 0xbc, 0xe6, 0x92, 0x89, 0xab, 0x85, 0x8a, 0xc6, 0x92, 0x4b, 0xbc, 0xc6, 0x92, 0xa2, 0x71, 0x62, 0x69, 0x00, 0x59, 0x60, 0x40, 0x40, 0x30, 0x60, 0x30, 0x40, 0x28, 0x40, 0x28, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 87 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x18, 0x20, 0x30, 0x60, 0x30, 0x80, 0x38, 0x80, 0x38, 0xc0, 0x48, 0x03, 0x7a, 0xa9, 0xab, 0x0b, 0xbc, 0xc2, 0x71, 0x82, 0x69, 0xc9, 0xb3, 0x03, 0x82, 0xad, 0xc4, 0xf2, 0xed, 0xae, 0xcc, 0x8d, 0xc4, 0x0f, 0xd5, 0x51, 0xdd, 0x30, 0xd5, 0xae, 0xc4, 0x6c, 0xc4, 0x91, 0xe5, 0x91, 0xe5, 0xa5, 0x8a, 0x24, 0x7a, 0x2b, 0xc4, 0x62, 0x69, 0x45, 0x82, 0xcd, 0xcc, 0xa9, 0xab, 0x04, 0x7a, 0x20, 0x59, 0xc0, 0x48, 0x60, 0x38, 0x40, 0x28, 0x40, 0x28, 0x20, 0x18, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 88 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x08, 0x20, 0x28, 0x60, 0x38, 0x80, 0x38, 0xa0, 0x50, 0x82, 0x71, 0x06, 0x93, 0xa9, 0xab, 0x24, 0x7a, 0xc0, 0x50, 0xc9, 0xb3, 0xca, 0xb3, 0xc1, 0x50, 0x48, 0xa3, 0x0f, 0xdd, 0xef, 0xd4, 0x0f, 0xd5, 0x10, 0xd5, 0x30, 0xdd, 0x30, 0xd5, 0x0e, 0xcd, 0x30, 0xd5, 0x50, 0xdd, 0xac, 0xcc, 0x21, 0x59, 0x22, 0x59, 0x6c, 0xcc, 0xa6, 0x92, 0x80, 0x48, 0x07, 0x9b, 0x0b, 0xbc, 0x28, 0xa3, 0x03, 0x7a, 0x01, 0x59, 0x80, 0x40, 0x60, 0x38, 0x40, 0x30, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 89 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x61, 0x40, 0xa0, 0x40, 0x20, 0x61, 0x04, 0x82, 0xe6, 0x92, 0x65, 0x8a, 0xc0, 0x50, 0x04, 0x7a, 0x2b, 0xc4, 0x6c, 0xc4, 0x63, 0x61, 0x80, 0x48, 0x02, 0x7a, 0x68, 0xa3, 0x71, 0xdd, 0x30, 0xd5, 0x30, 0xd5, 0x50, 0xd5, 0x92, 0xdd, 0x8d, 0xc4, 0x84, 0x92, 0x83, 0x69, 0x00, 0x20, 0xc7, 0x92, 0x6b, 0xc4, 0x68, 0xa3, 0x41, 0x61, 0x00, 0x59, 0xa5, 0x8a, 0xe6, 0x92, 0x65, 0x82, 0x61, 0x69, 0xc0, 0x48, 0x80, 0x48, 0x40, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 90 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x60, 0x38, 0xc0, 0x50, 0x82, 0x69, 0x24, 0x7a, 0xa6, 0x92, 0x62, 0x61, 0xe1, 0x50, 0x03, 0x7a, 0x68, 0xa3, 0x8c, 0xc4, 0xea, 0xbb, 0x02, 0x51, 0x00, 0x28, 0x82, 0x71, 0x2f, 0xdd, 0x71, 0xdd, 0x50, 0xd5, 0x71, 0xdd, 0xb2, 0xe5, 0x27, 0xa3, 0x20, 0x38, 0x00, 0x20, 0x05, 0x72, 0x8c, 0xcc, 0x4c, 0xc4, 0x48, 0xa3, 0x64, 0x82, 0x21, 0x61, 0xe0, 0x58, 0x85, 0x8a, 0x85, 0x8a, 0xc2, 0x71, 0xe1, 0x50, 0x80, 0x48, 0x20, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 91 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x61, 0x08, 0x42, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x18, 0x00, 0x61, 0x82, 0x69, 0x44, 0x82, 0x04, 0x7a, 0x61, 0x61, 0xc6, 0x92, 0xa6, 0x92, 0x65, 0x8a, 0xa9, 0xab, 0xcd, 0xcc, 0x6b, 0xc4, 0x22, 0x59, 0x00, 0x20, 0x47, 0xa3, 0x50, 0xdd, 0x30, 0xd5, 0x70, 0xdd, 0xac, 0xcc, 0x22, 0x59, 0x00, 0x18, 0x86, 0x8a, 0xac, 0xd4, 0x6c, 0xc4, 0xaa, 0xb3, 0x85, 0x8a, 0x06, 0x9b, 0x89, 0xab, 0xc3, 0x71, 0x82, 0x69, 0x65, 0x8a, 0xc2, 0x71, 0x41, 0x69, 0x60, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0x8c, 0x4a, 0x4f, 0x5b, 0xc9, 0x31, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 92 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x00, 0x70, 0x63, 0x97, 0x8c, 0x91, 0x63, 0x46, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x38, 0x81, 0x71, 0x03, 0x7a, 0xa2, 0x69, 0xc3, 0x71, 0x48, 0xa3, 0x2c, 0xc4, 0xea, 0xb3, 0xe6, 0x92, 0x07, 0x9b, 0x8d, 0xcc, 0x2b, 0xbc, 0x20, 0x30, 0x40, 0x38, 0xe6, 0x9a, 0xa9, 0xab, 0x67, 0xa3, 0xa3, 0x71, 0x00, 0x18, 0x83, 0x61, 0xac, 0xd4, 0x6c, 0xc4, 0x68, 0xa3, 0xc6, 0x92, 0x89, 0xab, 0x89, 0xab, 0xc9, 0xb3, 0x07, 0x9b, 0x41, 0x69, 0x03, 0x7a, 0xc2, 0x71, 0x01, 0x59, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x63, 0xbb, 0xa5, 0x76, 0x84, 0x30, 0x5b, 0x25, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 93 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x2b, 0x3a, 0x7a, 0x9d, 0x34, 0x7c, 0xef, 0x4a, 0x2c, 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x01, 0x00, 0x01, 0x51, 0xa2, 0x79, 0xc3, 0x71, 0xe6, 0x92, 0xa2, 0x69, 0xa5, 0x8a, 0xcd, 0xcc, 0xce, 0xcc, 0x88, 0xa3, 0x28, 0xa3, 0x2b, 0xc4, 0xc6, 0x92, 0x00, 0x18, 0x40, 0x30, 0xa0, 0x48, 0x60, 0x40, 0x00, 0x20, 0x81, 0x38, 0xc9, 0xbb, 0xea, 0xb3, 0xe6, 0x92, 0x68, 0xa3, 0xed, 0xcc, 0x6b, 0xc4, 0x03, 0x7a, 0x24, 0x7a, 0x0a, 0xbc, 0x03, 0x7a, 0x81, 0x69, 0x61, 0x71, 0x40, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x50, 0x5b, 0x55, 0x74, 0x2c, 0x32, 0xeb, 0x29, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 94 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x25, 0x19, 0x92, 0x63, 0x8e, 0x42, 0xa9, 0x21, 0x67, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x18, 0x61, 0x69, 0x65, 0x8a, 0x0a, 0xb4, 0x24, 0x7a, 0x80, 0x48, 0x43, 0x7a, 0xea, 0xb3, 0x2f, 0xd5, 0x8d, 0xc4, 0x2b, 0xb4, 0xed, 0xd4, 0x45, 0x7a, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x40, 0x30, 0x89, 0xab, 0xad, 0xcc, 0xaa, 0xb3, 0x4c, 0xc4, 0xce, 0xd4, 0xc9, 0xab, 0xa2, 0x69, 0x80, 0x48, 0xc6, 0x92, 0x2b, 0xbc, 0xe7, 0x9a, 0xc2, 0x81, 0x80, 0x30, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x63, 0x10, 0xc9, 0x31, 0x88, 0x21, 0xe5, 0x10, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 95 | 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x08, 0xe5, 0x10, 0xa4, 0x10, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x28, 0xc1, 0x79, 0x68, 0xab, 0xea, 0xbb, 0x61, 0x40, 0x60, 0x40, 0xe0, 0x58, 0xe3, 0x79, 0x89, 0xab, 0x2b, 0xbc, 0xaa, 0xb3, 0x68, 0xab, 0x26, 0x7a, 0x03, 0x51, 0xc4, 0x61, 0x07, 0x9b, 0x68, 0xab, 0xca, 0xb3, 0x0a, 0xbc, 0x69, 0xa3, 0x82, 0x69, 0xa0, 0x50, 0x00, 0x38, 0x22, 0x59, 0xca, 0xb3, 0xea, 0xb3, 0xe5, 0x9a, 0x21, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 96 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x38, 0x85, 0x9a, 0x4c, 0xc4, 0x24, 0x7a, 0xa6, 0x92, 0x69, 0xa3, 0x62, 0x69, 0xc0, 0x58, 0x20, 0x59, 0x00, 0x59, 0x00, 0x59, 0xe3, 0x79, 0x84, 0x82, 0x44, 0x82, 0xa2, 0x71, 0xe0, 0x58, 0x00, 0x59, 0xe0, 0x58, 0xc0, 0x50, 0xe4, 0x71, 0xca, 0xb3, 0x44, 0x82, 0x24, 0x82, 0x0b, 0xbc, 0x89, 0xb3, 0x03, 0x82, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x41, 0x08, 0xe9, 0x31, 0x6b, 0x42, 0xea, 0x39, 0x06, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 97 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x00, 0x4b, 0x42, 0xb2, 0x73, 0xb2, 0x6b, 0x0e, 0x53, 0xe9, 0x31, 0x62, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x62, 0x71, 0x89, 0xb3, 0x4b, 0xbc, 0xe6, 0x92, 0xca, 0xb3, 0x0e, 0xdd, 0xea, 0xb3, 0x85, 0x8a, 0x07, 0x93, 0xea, 0xb3, 0xc9, 0xab, 0x69, 0xab, 0x69, 0xab, 0xca, 0xb3, 0xea, 0xbb, 0xe6, 0x92, 0xe7, 0x92, 0x2c, 0xbc, 0x2e, 0xdd, 0xa9, 0xab, 0x27, 0x9b, 0xea, 0xb3, 0xea, 0xb3, 0xe6, 0x9a, 0x01, 0x51, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x21, 0x96, 0x84, 0x59, 0xa5, 0xb7, 0x94, 0x14, 0x74, 0x92, 0x5b, 0x0a, 0x3a, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 98 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0f, 0x5b, 0x5a, 0xa5, 0x39, 0xa5, 0x75, 0x84, 0xb2, 0x63, 0x72, 0x5b, 0x4c, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x38, 0xa4, 0x92, 0x2b, 0xbc, 0x89, 0xab, 0x41, 0x61, 0xa3, 0x69, 0xea, 0xb3, 0xcd, 0xd4, 0xce, 0xd4, 0x4b, 0xc4, 0xa9, 0xab, 0x07, 0x93, 0xe7, 0x92, 0x89, 0xa3, 0x4b, 0xc4, 0xed, 0xd4, 0xad, 0xcc, 0xc9, 0xab, 0xc3, 0x71, 0x20, 0x61, 0x48, 0xa3, 0x2b, 0xbc, 0x48, 0xab, 0x23, 0x82, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa3, 0x18, 0x67, 0x29, 0x82, 0x10, 0x00, 0x00, 0x50, 0x63, 0xb7, 0x8c, 0x54, 0x7c, 0xd2, 0x73, 0xce, 0x52, 0xaf, 0x4a, 0xf0, 0x4a, 0x06, 0x19, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 99 | 0x00, 0x00, 0x00, 0x00, 0xc3, 0x10, 0xf4, 0x73, 0xf4, 0x73, 0xb2, 0x6b, 0xf0, 0x5a, 0x2b, 0x32, 0x6c, 0x42, 0xad, 0x42, 0xa4, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x61, 0x69, 0xe6, 0x9a, 0x2b, 0xbc, 0x89, 0xab, 0x42, 0x61, 0x40, 0x40, 0x22, 0x59, 0xc3, 0x71, 0xa0, 0x48, 0x40, 0x38, 0xa0, 0x48, 0x80, 0x40, 0x20, 0x38, 0xa0, 0x48, 0x82, 0x69, 0x01, 0x59, 0x40, 0x40, 0x21, 0x59, 0x28, 0xa3, 0x2c, 0xbc, 0x89, 0xab, 0xe6, 0x9a, 0xe1, 0x50, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x88, 0x29, 0xd7, 0x8c, 0x56, 0x7c, 0x8d, 0x42, 0x20, 0x00, 0xce, 0x52, 0xb2, 0x63, 0x30, 0x5b, 0x8c, 0x42, 0x88, 0x21, 0xe9, 0x29, 0x6d, 0x3a, 0x46, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 100 | 0x00, 0x00, 0x00, 0x00, 0x82, 0x08, 0x50, 0x5b, 0xb2, 0x63, 0x0f, 0x53, 0x0b, 0x32, 0x88, 0x21, 0xe9, 0x29, 0x2b, 0x32, 0x63, 0x08, 0x00, 0x00, 0x46, 0x21, 0xa8, 0x31, 0x83, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0x82, 0x79, 0xa5, 0x92, 0xea, 0xb3, 0x6b, 0xc4, 0x07, 0x9b, 0xc3, 0x69, 0x62, 0x69, 0x25, 0x7a, 0xe7, 0x92, 0xc9, 0xab, 0x88, 0xab, 0x86, 0x8a, 0xa3, 0x71, 0x62, 0x61, 0xe3, 0x71, 0xe7, 0x9a, 0x0b, 0xbc, 0x0b, 0xbc, 0x89, 0xab, 0x47, 0xa3, 0xc2, 0x81, 0x00, 0x10, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc9, 0x31, 0x55, 0x7c, 0xef, 0x4a, 0xea, 0x29, 0x21, 0x00, 0x88, 0x29, 0x92, 0x63, 0x71, 0x5b, 0xce, 0x4a, 0x2b, 0x32, 0xc9, 0x21, 0xc9, 0x29, 0x83, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 101 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x67, 0x21, 0x30, 0x53, 0x71, 0x5b, 0x0f, 0x53, 0x4c, 0x3a, 0x89, 0x21, 0x06, 0x11, 0x00, 0x00, 0x0a, 0x3a, 0xf8, 0x94, 0x15, 0x74, 0x8d, 0x3a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x40, 0x20, 0xa2, 0x79, 0x84, 0x92, 0x07, 0x9b, 0x0a, 0xbc, 0x2b, 0xbc, 0x2b, 0xbc, 0x4b, 0xc4, 0x0a, 0xc4, 0xa9, 0xb3, 0xa8, 0xab, 0x0a, 0xbc, 0x2b, 0xc4, 0x2b, 0xbc, 0x2b, 0xbc, 0x0b, 0xbc, 0x69, 0xa3, 0x06, 0x9b, 0x84, 0x9a, 0x82, 0x71, 0x20, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x05, 0x19, 0x66, 0x21, 0x62, 0x08, 0x00, 0x00, 0x00, 0x00, 0x46, 0x21, 0x2b, 0x3a, 0x6d, 0x42, 0x0a, 0x32, 0x26, 0x19, 0x42, 0x08, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 102 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x83, 0x10, 0x47, 0x21, 0x87, 0x29, 0x26, 0x19, 0x82, 0x08, 0x00, 0x00, 0x00, 0x00, 0x0a, 0x3a, 0x14, 0x6c, 0xae, 0x42, 0xa8, 0x21, 0x21, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x81, 0x28, 0x41, 0x69, 0xa2, 0x79, 0x44, 0x8a, 0x85, 0x92, 0xa5, 0x92, 0x64, 0x8a, 0xc3, 0x71, 0x61, 0x61, 0x82, 0x69, 0xa2, 0x71, 0x65, 0x8a, 0xa5, 0x9a, 0x85, 0x92, 0x84, 0x92, 0x23, 0x8a, 0xe2, 0x81, 0x01, 0x59, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 103 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0x19, 0x26, 0x21, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x81, 0x30, 0xc0, 0x40, 0xa1, 0x40, 0xa0, 0x40, 0x40, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x08, 0x40, 0x20, 0xa0, 0x38, 0x80, 0x40, 0xa0, 0x40, 0xa0, 0x40, 0x41, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 104 | 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x20, 0x00, 0x00, 0x00, 0x21, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 105 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 106 | 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 107 | }; 108 | -------------------------------------------------------------------------------- /main.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2019-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | #include 28 | #include 29 | #include 30 | #include 31 | 32 | #include 33 | #include 34 | #include 35 | #include 36 | 37 | #include "metaballs.h" 38 | #include "plasma.h" 39 | #include "rgbplasma.h" 40 | #include "rotozoom.h" 41 | #include "deform.h" 42 | 43 | static fps_instance_t fps; 44 | static aps_instance_t bps; 45 | 46 | typedef struct stats { 47 | float fps; 48 | float bps; 49 | } stats_t; 50 | 51 | static stats_t stats; 52 | 53 | static const uint64_t MS_PER_FRAME_100_FPS = 1000 / 100; 54 | 55 | uint32_t 56 | stats_callback(uint32_t interval, void *param) 57 | { 58 | stats_t *data = (stats_t *)param; 59 | printf("%.*f fps / %.*f kBps\n", 1, data->fps, 1, data->bps / 1000); 60 | 61 | return interval; 62 | } 63 | 64 | int 65 | main() 66 | { 67 | uint32_t stats_delay = 2000; /* 0.5 fps */ 68 | uint8_t effect = 3; 69 | size_t bytes = 0; 70 | bool quit = false; 71 | 72 | SDL_Event event; 73 | SDL_TimerID fps_id; 74 | 75 | srand(time(0)); 76 | hagl_backend_t *display = hagl_init(); 77 | 78 | fps_id = SDL_AddTimer(stats_delay, stats_callback, &stats); 79 | 80 | printf("\nPress space for next demo.\n"); 81 | printf("Press ESC to quit.\n\n"); 82 | 83 | fps_init(&fps); 84 | aps_init(&bps); 85 | 86 | while (!quit) { 87 | 88 | uint32_t start = SDL_GetTicks(); 89 | 90 | switch(effect) { 91 | case 0: 92 | rgbplasma_animate(); 93 | rgbplasma_render(display); 94 | break; 95 | case 1: 96 | metaballs_animate(display); 97 | metaballs_render(display); 98 | break; 99 | case 2: 100 | plasma_animate(display); 101 | plasma_render(display); 102 | break; 103 | case 3: 104 | rotozoom_animate(); 105 | rotozoom_render(display); 106 | break; 107 | case 4: 108 | deform_animate(); 109 | deform_render(display); 110 | break; 111 | } 112 | 113 | bytes = hagl_flush(display); 114 | 115 | uint32_t end = SDL_GetTicks(); 116 | int32_t delay = MS_PER_FRAME_100_FPS - (end - start); 117 | 118 | if (delay > 0) { 119 | SDL_Delay(delay); 120 | } 121 | 122 | stats.bps = aps_update(&bps, bytes); 123 | stats.fps = fps_update(&fps); 124 | 125 | if (SDL_PollEvent(&event)) { 126 | if (event.type == SDL_QUIT) { 127 | quit = true; 128 | } 129 | if (event.type == SDL_KEYDOWN) { 130 | if (SDLK_ESCAPE == event.key.keysym.sym) { 131 | quit = true; 132 | } else { 133 | 134 | hagl_clear(display); 135 | 136 | switch(effect) { 137 | case 0: 138 | //rgbplasma_close(); 139 | break; 140 | case 1: 141 | //metaballs_close(); 142 | break; 143 | case 2: 144 | plasma_close(); 145 | break; 146 | case 3: 147 | //rotozoom_close(); 148 | break; 149 | case 4: 150 | deform_close(); 151 | break; 152 | } 153 | 154 | effect = (effect + 1) % 5; 155 | 156 | switch(effect) { 157 | case 0: 158 | //rgbplasma_init(); 159 | break; 160 | case 1: 161 | metaballs_init(display); 162 | break; 163 | case 2: 164 | plasma_init(display); 165 | break; 166 | case 3: 167 | rotozoom_init(); 168 | break; 169 | case 4: 170 | deform_init(display); 171 | break; 172 | } 173 | 174 | fps_reset(&fps); 175 | aps_reset(&bps); 176 | 177 | } 178 | } 179 | } 180 | } 181 | 182 | SDL_RemoveTimer(fps_id); 183 | hagl_close(display); 184 | 185 | return 0; 186 | } 187 | -------------------------------------------------------------------------------- /metaballs.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | #include 29 | #include 30 | #include 31 | 32 | #include "metaballs.h" 33 | 34 | struct vector2 { 35 | int16_t x; 36 | int16_t y; 37 | }; 38 | 39 | struct ball { 40 | struct vector2 position; 41 | struct vector2 velocity; 42 | uint16_t radius; 43 | uint16_t color; 44 | }; 45 | 46 | struct ball balls[16]; 47 | 48 | static const uint8_t NUM_BALLS = 3; 49 | static const uint8_t MIN_VELOCITY = 3; 50 | static const uint8_t MAX_VELOCITY = 5; 51 | static const uint8_t MIN_RADIUS = 20; 52 | static const uint8_t MAX_RADIUS = 30; 53 | static const uint8_t PIXEL_SIZE = 1; 54 | 55 | void 56 | metaballs_init(const hagl_backend_t *display) 57 | { 58 | /* Set up imaginary balls inside screen coordinates. */ 59 | for (int16_t i = 0; i < NUM_BALLS; i++) { 60 | balls[i].radius = (rand() % MAX_RADIUS) + MIN_RADIUS; 61 | balls[i].color = 0xffff; 62 | balls[i].position.x = rand() % display->width; 63 | balls[i].position.y = rand() % display->height; 64 | balls[i].velocity.x = (rand() % MAX_VELOCITY) + MIN_VELOCITY; 65 | balls[i].velocity.y = (rand() % MAX_VELOCITY) + MIN_VELOCITY; 66 | } 67 | } 68 | 69 | void 70 | metaballs_animate(const hagl_backend_t *display) 71 | { 72 | for (int16_t i = 0; i < NUM_BALLS; i++) { 73 | balls[i].position.x += balls[i].velocity.x; 74 | balls[i].position.y += balls[i].velocity.y; 75 | 76 | /* Touch left or right edge, change direction. */ 77 | if ((balls[i].position.x < 0) | (balls[i].position.x > display->width)) { 78 | balls[i].velocity.x = balls[i].velocity.x * -1; 79 | } 80 | 81 | /* Touch top or bottom edge, change direction. */ 82 | if ((balls[i].position.y < 0) | (balls[i].position.y > display->height)) { 83 | balls[i].velocity.y = balls[i].velocity.y * -1; 84 | } 85 | } 86 | } 87 | 88 | /* http://www.geisswerks.com/ryan/BLOBS/blobs.html */ 89 | void 90 | metaballs_render(const hagl_backend_t *display) 91 | { 92 | hagl_color_t background = hagl_color(display, 0, 0, 0); 93 | hagl_color_t black = hagl_color(display, 0, 0, 0); 94 | hagl_color_t white = hagl_color(display, 255, 255, 255); 95 | hagl_color_t green = hagl_color(display, 0, 255, 0); 96 | hagl_color_t color; 97 | 98 | for (uint16_t y = 0; y < display->height; y += PIXEL_SIZE) { 99 | for (uint16_t x = 0; x < display->width; x += PIXEL_SIZE) { 100 | float sum = 0; 101 | for (uint8_t i = 0; i < NUM_BALLS; i++) { 102 | float dx = x - balls[i].position.x; 103 | float dy = y - balls[i].position.y; 104 | float d2 = dx * dx + dy * dy; 105 | sum += balls[i].radius * balls[i].radius / d2; 106 | // sum += balls[i].radius / sqrt(d2); 107 | } 108 | 109 | if (sum > 0.65) { 110 | color = black; 111 | } else if (sum > 0.5) { 112 | color = white; 113 | } else if (sum > 0.4) { 114 | color = green; 115 | } else { 116 | color = background; 117 | } 118 | 119 | if (1 == PIXEL_SIZE) { 120 | hagl_put_pixel(display, x, y, color); 121 | } else { 122 | hagl_fill_rectangle(display, x, y, x + PIXEL_SIZE - 1, y + PIXEL_SIZE - 1, color); 123 | } 124 | } 125 | } 126 | } 127 | -------------------------------------------------------------------------------- /metaballs.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | void metaballs_init(const hagl_backend_t *display); 29 | void metaballs_animate(const hagl_backend_t *display); 30 | void metaballs_render(const hagl_backend_t *display); -------------------------------------------------------------------------------- /plasma.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | #include 29 | #include 30 | #include 31 | #include 32 | #include 33 | 34 | #include "plasma.h" 35 | 36 | hagl_color_t *palette; 37 | uint8_t *plasma; 38 | 39 | static const uint8_t SPEED = 4; 40 | static const uint8_t PIXEL_SIZE = 1; 41 | 42 | void 43 | plasma_init(const hagl_backend_t *display) 44 | { 45 | uint8_t *ptr = plasma = malloc(display->width * display->height * sizeof(uint8_t)); 46 | palette = malloc(256 * sizeof(hagl_color_t)); 47 | 48 | /* Generate nice continous palette. */ 49 | for(int i = 0; i < 256; i++) { 50 | uint8_t r, g, b; 51 | r = 128.0 + 128.0 * sin((M_PI * i / 128.0) + 1); 52 | g = 128.0 + 128.0 * sin((M_PI * i / 64.0) + 1); 53 | b = 64; 54 | palette[i] = hagl_color(display, r, g, b); 55 | } 56 | 57 | for (uint16_t y = 0; y < display->height; y += PIXEL_SIZE) { 58 | for (uint16_t x = 0; x < display->width; x += PIXEL_SIZE) { 59 | /* Generate three different sinusoids. */ 60 | float v1 = 128.0 + (128.0 * sin(x / 32.0)); 61 | float v2 = 128.0 + (128.0 * sin(y / 24.0)); 62 | float v3 = 128.0 + (128.0 * sin(sqrt(x * x + y * y) / 24.0)); 63 | /* Calculate average of the three sinusoids */ 64 | /* and use it as color index. */ 65 | uint8_t color = (v1 + v2 + v3) / 3; 66 | *(ptr++) = color; 67 | } 68 | } 69 | } 70 | 71 | void 72 | plasma_render(const hagl_backend_t *display) 73 | { 74 | uint8_t *ptr = plasma; 75 | 76 | for (uint16_t y = 0; y < display->height; y = y + PIXEL_SIZE) { 77 | for (uint16_t x = 0; x < display->width; x = x + PIXEL_SIZE) { 78 | /* Get a color for pixel from the plasma buffer. */ 79 | uint8_t index = *(ptr++); 80 | hagl_color_t color = palette[index]; 81 | /* Put a pixel to the display. */ 82 | if (1 == PIXEL_SIZE) { 83 | hagl_put_pixel(display, x, y, color); 84 | } else { 85 | hagl_fill_rectangle(display, x, y, x + PIXEL_SIZE - 1, y + PIXEL_SIZE - 1, color); 86 | } 87 | } 88 | } 89 | } 90 | 91 | void 92 | plasma_animate(const hagl_backend_t *display) 93 | { 94 | uint8_t *ptr = plasma; 95 | 96 | for (uint16_t y = 0; y < display->height; y = y + PIXEL_SIZE) { 97 | for (uint16_t x = 0; x < display->width; x = x + PIXEL_SIZE) { 98 | /* Get a pixel from the plasma buffer. */ 99 | uint8_t index = *ptr; 100 | /* Choose next color from the palette. */ 101 | index = (index + SPEED) % 256; 102 | /* Put a pixel to the plasma buffer. */ 103 | *(ptr++) = index; 104 | } 105 | } 106 | } 107 | 108 | void 109 | plasma_close() 110 | { 111 | free(plasma); 112 | free(palette); 113 | } -------------------------------------------------------------------------------- /plasma.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | void plasma_init(const hagl_backend_t *display); 29 | void plasma_animate(const hagl_backend_t *display); 30 | void plasma_render(const hagl_backend_t *display); 31 | void plasma_close(); 32 | -------------------------------------------------------------------------------- /rgbplasma.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | #include 29 | #include 30 | #include 31 | 32 | #include "rgbplasma.h" 33 | 34 | static const uint8_t PLASMA_SPEED = 4; 35 | static uint32_t frame; 36 | 37 | void 38 | rgbplasma_render(const hagl_backend_t *display) 39 | { 40 | for (uint16_t x = 0; x < display->width; x++) { 41 | for (uint16_t y = 0; y < display->height; y++) { 42 | uint8_t v1 = 128 + (128 * sin((x + frame) / 32.0)); 43 | uint8_t v2 = 128 + (128 * sin((y + frame) / 24.0)); 44 | uint8_t v3 = 128 + (128 * sin(sqrt((x * x) + y * y) / 12.0)); 45 | uint8_t v = (v1 + v2 + v3) / 3; 46 | hagl_color_t color = hagl_color(display, v, 255 - v, 128); 47 | hagl_put_pixel(display, x, y, color); 48 | } 49 | } 50 | } 51 | 52 | void 53 | rgbplasma_animate() 54 | { 55 | frame = frame + PLASMA_SPEED; 56 | } 57 | -------------------------------------------------------------------------------- /rgbplasma.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | void rgbplasma_render(const hagl_backend_t *display); 28 | void rgbplasma_animate(); -------------------------------------------------------------------------------- /rotozoom.c: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | #include 29 | #include 30 | #include 31 | 32 | #include "head.h" 33 | 34 | static const uint8_t SPEED = 1; 35 | static const uint8_t STEP = 1; 36 | 37 | static uint16_t angle; 38 | // static float sinlut[360]; 39 | // static float coslut[360]; 40 | 41 | void 42 | rotozoom_init() 43 | { 44 | /* Generate look up tables. */ 45 | // for (uint16_t i = 0; i < 360; i++) { 46 | // sinlut[i] = sin(i * M_PI / 180); 47 | // coslut[i] = cos(i * M_PI / 180); 48 | // } 49 | } 50 | 51 | void 52 | rotozoom_render(const hagl_backend_t *display) 53 | { 54 | float s, c, z; 55 | 56 | s = sin(angle * M_PI / 180); 57 | c = cos(angle * M_PI / 180); 58 | // s = sinlut[angle]; 59 | // c = coslut[angle]; 60 | z = s * 1.2; 61 | 62 | for (uint16_t x = 0; x < display->width; x = x + STEP) { 63 | for (uint16_t y = 0; y < display->height; y = y + STEP) { 64 | 65 | /* Get a rotated pixel from the head image. */ 66 | int16_t u = (int16_t)((x * c - y * s) * z) % HEAD_WIDTH; 67 | int16_t v = (int16_t)((x * s + y * c) * z) % HEAD_HEIGHT; 68 | 69 | u = abs(u); 70 | if (v < 0) { 71 | v += HEAD_HEIGHT; 72 | } 73 | hagl_color_t *color = (hagl_color_t *) (head + HEAD_WIDTH * sizeof(hagl_color_t) * v + sizeof(hagl_color_t) * u); 74 | 75 | hagl_put_pixel(display, x, y, *color); 76 | } 77 | } 78 | } 79 | 80 | void 81 | rotozoom_animate() 82 | { 83 | angle = (angle + SPEED) % 360; 84 | } 85 | -------------------------------------------------------------------------------- /rotozoom.h: -------------------------------------------------------------------------------- 1 | /* 2 | 3 | MIT No Attribution 4 | 5 | Copyright (c) 2020-2023 Mika Tuupola 6 | 7 | Permission is hereby granted, free of charge, to any person obtaining a copy 8 | of this software and associated documentation files (the "Software"), to deal 9 | in the Software without restriction, including without limitation the rights 10 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 11 | copies of the Software, and to permit persons to whom the Software is 12 | furnished to do so. 13 | 14 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS 15 | OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 17 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 18 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 19 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20 | SOFTWARE. 21 | 22 | -cut- 23 | 24 | SPDX-License-Identifier: MIT-0 25 | 26 | */ 27 | 28 | void rotozoom_init(); 29 | void rotozoom_render(const hagl_backend_t *display); 30 | void rotozoom_animate(); 31 | --------------------------------------------------------------------------------