From e1f05a916a50dbcee5af04027c93c7744a7d580f Mon Sep 17 00:00:00 2001 From: Pedro de Oliveira Date: Fri, 24 Mar 2017 00:06:15 +0000 Subject: [PATCH] Add script to convert image --- Inc/image.h | 3 ++ Inc/ssd1306.h | 6 ++- Makefile | 1 + Src/image.c | 108 ++++++++++++++++++++++++++++++++++++++++++++++++++ Src/main.c | 29 +++++--------- Src/ssd1306.c | 21 ++++++++-- gnaa.png | Bin 0 -> 2108 bytes image.bmp | Bin 0 -> 1170 bytes image.py | 60 ++++++++++++++++++++++++++++ lol.bmp | Bin 0 -> 1170 bytes 10 files changed, 206 insertions(+), 22 deletions(-) create mode 100644 Inc/image.h create mode 100644 Src/image.c create mode 100644 gnaa.png create mode 100644 image.bmp create mode 100755 image.py create mode 100644 lol.bmp diff --git a/Inc/image.h b/Inc/image.h new file mode 100644 index 0000000..c759e61 --- /dev/null +++ b/Inc/image.h @@ -0,0 +1,3 @@ +#include "stm32f4xx_hal.h" + +extern uint8_t image[1024]; \ No newline at end of file diff --git a/Inc/ssd1306.h b/Inc/ssd1306.h index 90b2af5..e0d3717 100644 --- a/Inc/ssd1306.h +++ b/Inc/ssd1306.h @@ -1,6 +1,8 @@ #include +#include #include "stm32f4xx_hal.h" #include "fonts.h" +#include "image.h" #ifndef ssd1306 #define ssd1306 @@ -86,8 +88,10 @@ char ssd1306_WriteString(char* str, FontDef Font, SSD1306_COLOR color); void ssd1306_SetCursor(uint8_t x, uint8_t y); void ssd1306_WriteCommand(uint8_t command); -void ssd1306_Scroll(void); +//void ssd1306_ScrollUp(unsigned int pixels, unsigned int delay); +void ssd1306_ScrollUp(unsigned int pixels, unsigned int delay, UART_HandleTypeDef uart); void startscrollright(uint8_t start, uint8_t stop); void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1); +void ssd1306_LoadImage(void); #endif diff --git a/Makefile b/Makefile index bbe4bca..d3ddc67 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ BUILD_DIR = build ###################################### C_SOURCES = \ Src/main.c \ + Src/image.c \ Src/cube.c \ Src/starfield.c \ Src/ssd1306.c \ diff --git a/Src/image.c b/Src/image.c new file mode 100644 index 0000000..0fa06ad --- /dev/null +++ b/Src/image.c @@ -0,0 +1,108 @@ +#include "image.h" + +uint8_t image[1024] = { + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 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, 0x20, 0xe0, 0x20, 0x20, 0x00, + 0xe0, 0xe0, 0x40, 0x40, 0x40, 0xe0, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0x78, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, + 0x38, 0x38, 0x38, 0x38, 0x38, 0x38, 0x78, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0xf8, 0x38, + 0x38, 0x38, 0x78, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0x38, 0x38, 0x38, 0xf8, 0xf8, 0xf8, + 0xf8, 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x78, 0x38, 0x38, 0x38, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0x00, 0x00, 0x00, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0x78, 0x38, 0x38, 0x38, 0xf8, 0xf8, + 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0xf8, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x07, 0x03, + 0x00, 0x00, 0x00, 0x07, 0xff, 0xff, 0xff, 0xff, 0x01, 0x00, + 0x00, 0x00, 0xfc, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, 0xfe, + 0xfe, 0xfc, 0xe0, 0xc0, 0xc0, 0xc1, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0xe1, 0xc3, 0x87, 0x0f, 0x1f, 0x3f, 0x7f, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x3f, 0x0f, 0x03, 0x00, 0xc0, 0xe0, 0x80, 0x01, 0x07, 0x1f, + 0x7f, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x3f, + 0x0f, 0x03, 0x00, 0xc0, 0xe0, 0x80, 0x01, 0x07, 0x1f, 0x7f, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, + 0x7f, 0x7f, 0x7f, 0x77, 0x73, 0x73, 0x73, 0x73, 0x73, 0x73, + 0x03, 0x03, 0x03, 0x03, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe1, 0xc3, 0x87, 0x07, + 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0x7f, 0x1f, 0x07, 0x01, 0x80, 0x80, + 0x98, 0x9e, 0x9f, 0x9f, 0x9f, 0x9c, 0x80, 0x80, 0x00, 0x03, + 0x1f, 0x7f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x1f, 0x07, 0x01, 0x80, 0x80, 0x88, + 0x9e, 0x9f, 0x9f, 0x9f, 0x9c, 0x80, 0x80, 0x00, 0x03, 0x0f, + 0x3f, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfe, 0xfc, 0xfc, 0xfc, 0xfc, + 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, 0xfc, + 0xfe, 0xfe, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0xfc, 0xf8, 0xfc, 0xfe, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, + 0xfc, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xfc, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xfd, 0xfc, 0xfc, 0xfc, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xfe, 0xfc, 0xfc, 0xfc, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x00, 0x00, 0x00, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, + 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x07, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, +}; + diff --git a/Src/main.c b/Src/main.c index 38532c3..0e7bdd1 100644 --- a/Src/main.c +++ b/Src/main.c @@ -94,6 +94,9 @@ int main(void) cube_Init(); //DHT22_Init(); HAL_UART_Receive_IT(&huart1, (uint8_t*) &UART1_Data, 1); + //drawLine(0,2, 150, 2); + //drawLine(0,4, 150, 4); + ssd1306_LoadImage(); /* USER CODE END 2 */ /* Infinite loop */ @@ -103,33 +106,23 @@ int main(void) /* USER CODE END WHILE */ /* USER CODE BEGIN 3 */ - ssd1306_Fill(Black); - - /* + //ssd1306_Fill(Black); +/* int x, msg; - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_6); //Toggle the state of pin PC9 - //DHT22_Read(htim6); - - //startscrollright(0x00, 0x0F); - - for(int times = 0; times < 12; times++) { - ssd1306_Scroll(); - ssd1306_UpdateScreen(); - HAL_GPIO_TogglePin(GPIOA, GPIO_PIN_7); //Toggle the state of pin PC9 - } + //ssd1306_ScrollUp(64, 0); + ssd1306_ScrollUp(1, 50, huart1); x = rand() % 60 + 1; msg = rand() % 2 + 1; ssd1306_SetCursor(x, 53); ssd1306_WriteString((msg == 1) ? "GORDOS" : "LOL", Font_7x10, White); + + //starfield_Update(); + //cube_Update(60); */ - - starfield_Update(); - cube_Update(60); - ssd1306_UpdateScreen(); - HAL_Delay(25); + //HAL_Delay(25); } /* USER CODE END 3 */ } diff --git a/Src/ssd1306.c b/Src/ssd1306.c index 246bb37..4ceaea6 100644 --- a/Src/ssd1306.c +++ b/Src/ssd1306.c @@ -57,21 +57,36 @@ void drawLine(int16_t x0, int16_t y0, int16_t x1, int16_t y1) } } +void ssd1306_LoadImage(void) { + static uint32_t end_addr = SSD1306_WIDTH * 8; + + for(uint32_t addr = 0; addr < end_addr; addr++) { + SSD1306_Buffer[addr] = image[addr]; + } +} + /** * [ssd1306_ScrollUp scrolls the whole LCD buffer up] * @param pixels [How many pixels to scroll up] * @param delay [Delay between refresh] */ -void ssd1306_ScrollUp(unsigned int pixels, unsigned int delay) +//void ssd1306_ScrollUp(unsigned int pixels, unsigned int delay, ) +void ssd1306_ScrollUp(unsigned int pixels, unsigned int delay, UART_HandleTypeDef uart) { static uint32_t end_addr = SSD1306_WIDTH * 8; char lost_bit = 0; + //char buffer[64]; for(uint8_t times = 0; times < pixels; times++) { for(uint32_t addr = 0; addr < end_addr; addr++) { + //char binary[33]; + //itoa(SSD1306_Buffer[addr], binary, 2); + //sprintf(buffer, "addr: %x : %s\n\r", addr, binary); + //HAL_UART_Transmit(&uart, (uint8_t*)buffer, strlen(buffer), 0xFFFF); + // In the first bank we dont need to keep the lost bit - if (addr > 0x79) { + if (addr > 0x7f) { lost_bit = SSD1306_Buffer[addr] & 0x01; } @@ -79,7 +94,7 @@ void ssd1306_ScrollUp(unsigned int pixels, unsigned int delay) SSD1306_Buffer[addr] >>= 1; // In the first bank we dont need to do this - if (addr > 0x79) { + if (addr > 0x7f) { // Move the saved bit from the LSB to the MSB lost_bit <<= 7; // Add the saved bit to the bank above it diff --git a/gnaa.png b/gnaa.png new file mode 100644 index 0000000000000000000000000000000000000000..b8d822fc2f4be60ca7c648fc436a72f2a2687faa GIT binary patch literal 2108 zcmeHH{Xf$Q9RGgJ*yg4PX|Kg{Ddf4yQ`ddRrg^ooGex*Fm#5@rGI>bXcb>zv+>&rw zc`k(HF`3IHUPs!p4Y8q6cS?`f({b|;+&^%AUhmKQ{rY@<`@CPT&-)C+XFnE$!vFw) z^`?^j)C#K`LLt=r1a+3K7BInYzX#AXihrseG^0p#5&*QE)%hHT1ONoUp!rkOdplTS z$CKLgB=$V1L%PHvT}sT55;LWHvK~5TKXl1{=$bR`o;$ubcYI%-8Zszf=20N?;LFK; z8JRElDwIh;R zOVi<^>BuWH(Umhtt7c-Vl(E&ypK6qGb*kg_s)TE^+^e%E8q}CeX`D@IoJ(z*OS?Y* zbMrjhG7q=T^I9Kgwmr_e`6RdfNnWQK3k6*Z{O*Oq?nOb*f}m&d+^xl;-X-DfCG}}v z>Wc&a?SPWxIF0)!2Da=T?Bw&_sooU(%8VnCL?x~46SZ|`l=IZS6|58!jcn5h0vq8qrg-(* z>gc^oY-XoIfbjf?XMY>&&cUJsYwyn*o^rBM72ht^=hT_%tDeuHZw3&X1m7jp#b*gi z7jXgo&DkeW$u;pv;^|pf`uk{Y+r;{C5|j^jU3jG zu@ZUaTu;-NRtQw+tEcU|&bFBe!_xB&;#_>AMg zNH8B=rG+Y4Tq4hI{}r7){2{4J(dA%nMR4N`Ek^qpt(2C<=eh79$drVm3LZ4n!-iE4 zGSI(AXbU#l5pC!^;?B}>OmYF#4QxTTGof;CDXPSk)4y{d*Z{8(n(Q?sZukQ)u!RoA zi$5J<%UncSWC{|Lyjm?==u-iAEgHek><_(T)~@1f+42^nzYJLS-#QKkkz!%kTvLJ^ z`cz4B+yrMN#l7Sw7QXd5%f=_?%HV*}tNslL3)A@5_x!(d(x7_akSjQW^K>8Aw)Rd? zKhJK-rDK;iOH&mkPm0Ja6mG;3Ad@2Mjo6C*E~Iuy)P_N<5hD;`j6H8#*hbNd#4zyY zg*FPlc}61iL)4BYFj3s)i^_hFwrSuYgbsa!s7`~effQ`8yZbgHf@7d|Ct;w2&@`rJ z#@Z_OS(fXKY@7RM2L|$<2_?4%m^lW5I*ao|Zw+bh@|`puZSnZcO}smy%s1|pX>Rgh zIUNlB^Y!P*VdwKx90SV+aDTp?<#MJMly|D6S(j>_K2+jLs7Be$^&qX2@Gk}u%D=g~ zNhLY9T?Wn&tQB$Tz$)JgE{isXfr>#h|3*EPU%SKwenYQW`LSlR3k^I`cVIcfVs6+C zY^t2mN}e_bTdx@3LWbXP6HBC-TGb<-#g@Hi`oW`a6^0jL8SU2(B6J8HUIEgOk_u~8 z5dnVw@$lN$ywO3tuL<6m=EZf?A$0dRmsyT%ciKj9?^X5fp%ul_lQy#aGcaSdqWq_9 zeJzk|42LB?15_dXz1Uat#U;4Y3YxCN6FGm}q8Y9eiNQ#^z5sqr0Zg&@{VZlcT{yr;o zFRpKgZ}aBWi`rL@pHZvT+Uxat$H?Y*Jl;Ord9OEbhNsomFonl1F9~Mccg+WSaLlD< zCS0bzr+?>#(!7?~gT3X6G-V^Mf zEPNls8Elm{mWqxy-ls9Jp`xvWrP9_=c^Lc@!;;E_#Mfu;K`T9##9NiEOB1ChF|lA@ zhgsvs-9LCmKOPbk``DMuI7Vg^~7G?&PqF31R;>ZjSx7@xzBHAe_&eY?!9^6yqWjoo4H$f*l)v)KJ^QVrlb_b zj~n!VoG7Km1uKBmUk4T*EI;4F-Vj}iHjOmGJpF*mqKc}#^2}LrJtlnvba1@!akemm) zgDggvc_uV|PJdVO1w;mB0-jCaN!~}KZD=*5|GW$rkyr?f*sCw2_+NZOdLPyb?=R&WL!*6@T0`O4Wg1lj+lreVqpOi`J+pJLjH6s`gw2{j!8$4T0K|+ z^OH&n7FGCZN3lKwWjDoYX(K4>acrfSHA=btWRqizFC4C4KeLvaw)zgm�g-flXUJ zeM2?bY2yNmvN)pxiXJ8r(eN{>ptI7tdfnZJ!%!2Q{rmR5w8L#R2u{}ReQGbqI&e?g z=e{A#eWQwTR@RU)>gaW@Jo_X;SD>lSAdhlH_`lpD%|{F9KMM0`h@-0K*wy>IJSm=%Uxc*#?tp2 L+Zl0u8rSGAr7h%2 literal 0 HcmV?d00001